tensorflow实现AlexNet网络架构

  用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的分类效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值