用tensorflow实现了一下Alexnet网络的架构,AlexNet有5个卷积层和3个全连接层,具体卷积核的大小和个数我都用代码进行了详细的注释。
import tensorflow as tf
#先定义接受变量的函数,给初始化变量加入一些随机噪声
def get_variable(name,shape=None,dtype=tf.float32,initializer=tf.random_normal_initializer(mean=0,stddev=0.1)):
return tf.get_variable(name,shape,dtype,initializer)
#构建AlexNet网络
def Alexnet(x,y):
#第一层对输入图像进行维度变换变成rank4进入卷积层
with tf.variable_scope('input1'):
net=tf.reshape(x,[-1,224,224,3])
#进入第一层卷积层,卷积核大小为11*11*3有96个,步长为4,在做一个lrn局部归一化,最后做一个3*3的最大池化,步长为2
with tf.variable_scope('conv2'):
net=tf.nn.conv2d(input=net,filter=get_variable('w',[11,11,3,96]),strides=[1,4,4,1],padding='SAME')
net=tf.nn.bias_add(net,get_variable('b',[96]))
net=tf.nn.relu(net)
net=tf.nn.lrn(input=net,depth_radius=4,bias=1.0, alpha=0.001/9, beta=0.75,name='norm1')
net=tf.nn.max_pool(value=net,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID')
#进入第二层卷积层卷积核大小为5*5*96有256个和第一层一样做一个lrn局部归一化,在做一个3*3的最大池化,步长为2
with tf.variable_scope('conv3'):
net=tf.nn.conv2d(input=net,filter=get_variable('w',[5,5,96,256]),strides=[1,1,1,1],padding='SAME')
net=tf.nn.bias_add(net,get_variable('b',[256]))
net=tf.nn.relu(net)
net=tf.nn.lrn(input=net,depth_radius=4,bias=1.0, alpha=0.001/9, beta=0.75,name='norm2')
net=tf.nn.max_pool(value=net,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID')
#进入第三次卷积层卷积核大小为3*3*256有384个卷积核
with tf.variable_scope('conv4'):
net=tf.nn.conv2d(input=net,filter=get_variable('w',[3,3,256,384]),strides=[1,1,1,1],padding='SAME')
net=tf.nn.bias_add(net,get_variable('b',[384]))
net=tf.nn.relu(net)
#进入第四次卷积层卷积核大小为3*3*384有384个卷积核
with tf.variable_scope('conv5'):
net=tf.nn.conv2d(input=net,filter=get_variable('w',[3,3,384,384]),strides=[1,1,1,1],padding='SAME')
net=tf.nn.bias_add(net,get_variable('b',[384]))
net=tf.nn.relu(net)
#进入第五层卷积层卷积核大小3*3*384有256个卷积核,在做一个3*3的最大池化,步长为2
with tf.variable_scope('conv6'):
net=tf.nn.conv2d(input=net,filter=get_variable('w',[3,3,384,256]),strides=[1,1,1,1],padding='SAME')
net=tf.nn.bias_add(net,get_variable('b',[256]))
net=tf.nn.relu(net)
net=tf.nn.max_pool(value=net,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID')
#进入第一层全连接层,进入之前先对图片进行一个flatten,变成2维图片,全连接后经过一个dropout
with tf.variable_scope('fc7'):
net=tf.reshape(net,[-1,7*7*256])
net=tf.add(tf.matmul(net,get_variable('w',[7*7*256,4096])),get_variable('b',[4096]))
net=tf.nn.relu(net)
net=tf.nn.dropout(net,keep_prob=0.5)
#进入第二层全连接,全连接有4096个节点,全连接后经过一个dropout
with tf.variable_scope('fc8'):
net=tf.add(tf.matmul(net,get_variable('w',[4096,4096])),get_variable('b',[4096]))
net=tf.nn.relu(net)
net=tf.nn.dropout(net,keep_prob=0.5)
#最后一层也是全连接层,最后分成了1000个类别
with tf.variable_scope('fc9'):
act=tf.add(tf.matmul(net,get_variable('w',[4096,1000])),get_variable('b',[1000]))
return act
#输出预测的概率值
act=Alexnet(x,y)
本文只是简单的构建了AlexNet网络结构,训练过程并没有给出,有需要的朋友可以自行添加,并自行在猫狗数据集或者CIFAR-10上进行测试AlexNet的分类效果。