一、AlexNet构架的介绍
AlexNet有5个卷积层和3个全连接层,发现移除任意一层都会降低最终的效果。网络结构如图:
1. 基本结构
a. 共有8层,其中前5层convolutional,后边3层full-connected,最后的一个full-connected层的output是具有1000个输出的softmax,最后的优化目标是最大化平均的multinomiallogistic regression
b. 在第一层conv1和conv2之后直接跟的是Response-nomalizationlayer,也就是norm1,norm2层。
c. 在每一个conv层以及full-connected层后紧跟的操作是ReLU操作。
d. Max pooling操作是紧跟在第一个norm1,norm2,以及第5个conv层,也就是conv5
e.Dropout操作是在最后两个full-connected层。
2.具体分析
a.在第一个conv层(conv1)中,AlexNet采用了96个11*11*3的kernel在stride为4的情况下对于224*224*3的图像进行了滤波。直白点就是采用了11*11的卷积模板在三个通道上,间隔为4个像素的采样频率上对于图像进行了卷积操作。4个像素是receptivefield中心在kernel map上的距离,这是个经验数据。
最初的输入神经元的个数为224*224*3 = 150528个。对于每一个map来说,间隔为4,因此224/4 =56,然后减去边缘的一个为55个,也就是本层的map大小为55*55,然后神经元数目为55*55*96 =290400
得到基本的conv数据后,则进行一次ReLU(relu1)以及Norm(norm1)的变换后,然后进行pooling(pool1),作为输出传递到下一层。
本层map数目为96.
b.第二个conv层(conv2)是第一个conv层(conv1)经过norm(norm1)以及pool(pool1)后,然后再apply256个5*5的卷积模板卷积后的结果。
pool1后,map的size减半int(55/2)= 27,得到的本层的神经元数目为27*27*256 =186642个。
本层map数目为256个。
c. 第三个conv层(conv3)的生成过程和第二层类似,不同的是这一层是apply384个3*3的卷积模板得到的。
pool2后,map的size减半int(27/2) = 13,得到本层神经元数目为13*13*384 =64896。
本层map数目为384个。
d. 第四个conv层(conv4)是第三个conv层(conv3)进行一次ReLU(relu3)后,然后直接apply384个3*3的卷积模板得到的。
本层神经元的数目为13*13*384 = 64896。
本层map数目为384个,size还是13*13.
e.第五个conv层(conv5)与第四个生成类似,只是对上层进行了一个ReLU(relu4)后生成的,不同之处在于此处apply的卷积模板为256个3*3的。
本层神经元的数目为13*13*256 = 43264。
本层map数目为256个,size还是13*13。
f.第一个full-connected层(fc6)是上一个conv层(conv5)进行pooling(pool5)后的全连接。
pool5后,map的size减半int(13/2) =6,上层基本连接为6*6*256,然后全连接后到4096个节点,本层最终节点为4096个。
g.第二个full-connected层(fc7)是上一个full-connected(fc6)进行ReLU(relu6)后,然后进行dropout(drop6)后再进行全连接的结果
本层节点数目为4096个。
h.最后一个full-connetcted层(fc8)则是上一个full-connected层(fc7)再次进行ReLU(relu7)以及dropout(drop7)后再进行全连接的结果。最后输出为融合label的softmaxloss。
本层节点数目为1000个,对应着1000类对象。
3.用MNIST实现算法
具体代码如下:
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print(mnist.train.images.shape, mnist.train.labels.shape)
print(mnist.test.images.shape, mnist.test.labels.shape)
X = tf.placeholder(tf.float32, [None, 784])
Y = tf.placeholder(tf.float32, [None, 10])
X_input = tf.reshape(X, [-1, 28, 28, 1])
keep_prob = tf.placeholder(tf.float32)
W1 = tf.Variable(tf.random_normal([3, 3, 1, 64]))
W2 = tf.Variable(tf.random_normal([3, 3, 64, 128]))
W3 = tf.Variable(tf.random_normal([3, 3, 128, 256]))
W4 = tf.Variable(tf.random_normal([4 * 4 * 256, 1024]))
W5 = tf.Variable(tf.random_normal([1024, 1024]))
W6 = tf.Variable(tf.random_normal([1024, 10]))
b1 = tf.Variable(tf.random_normal([64]))
b2 = tf.Variable(tf.random_normal([128]))
b3 = tf.Variable(tf.random_normal([256]))
b4 = tf.Variable(tf.random_normal([1024]))
b5 = tf.Variable(tf.random_normal([1024]))
b6 = tf.Variable(tf.random_normal([10]))
def conv(X, W, bais):
return tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(X, W, strides=[1, 1, 1, 1], padding='SAME'), bais))
def max_pool(X, k):
return tf.nn.max_pool(X, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding="SAME")
def norm(input, lsize=4):
return tf.nn.lrn(input, lsize, bias=1, alpha=0.001 / 9.0, beta=0.75)
def alex(X):
conv1 = conv(X, W1, b1)
pool1 = max_pool(conv1, 2)
norm1 = norm(pool1, 4)
conv2 = conv(norm1, W2, b2)
pool2 = max_pool(conv2, 2)
norm2 = norm(pool2, 4)
conv3 = conv(norm2, W3, b3)
pool3 = max_pool(conv3, 2)
norm3 = norm(pool3, 4)
fc1 = tf.reshape(norm3, [-1, 4 * 4 * 256])
fc1 = tf.nn.relu(tf.matmul(fc1, W4) + b4)
fc2 = tf.nn.relu(tf.matmul(fc1, W5) + b5)
fout = tf.matmul(fc2, W6) + b6
return fout
pred = alex(X_input)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=pred))
step = tf.train.AdamOptimizer(0.001).minimize(loss)
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
costs = []
for i in range(2000):
batch_x, batch_y = mnist.train.next_batch(64)
cost, correct, _ = sess.run([loss, accuracy, step], feed_dict={X: batch_x, Y: batch_y})
if i % 50 == 0:
costs.append(cost)
print("第", i, "次迭代的损失是:", cost, "准确率是:", '{:.2%}'.format(correct))
correct_pred=tf.equal(tf.argmax(pred,1),tf.argmax(Y,1))
correct=tf.reduce_mean(tf.cast(correct_pred,tf.float32))
print("test acccracy:",accuracy.eval({X:mnist.test.images,Y:mnist.test.labels}))
plt.xlabel("epoch")
plt.ylabel("loss")
plt.title("AlexNet")
plt.plot(costs)
plt.show()
在mnist.test.images上的准确率还是不够高,希望大家给笔者一些建议
!