最近复现了几个经典的卷积网络,拿自己的数据集试了了试,不得不承认的是卷积神经网络在图像处理方面确实有着得天独厚的优势,写这篇博客讲述早期最经典的卷积神经网络Alex_Net以及附上一些自己的理解

2012年,Hinton的学生在ILSVRC 2012中以显著的优势赢得了比赛,top-5的错误率降低至了16.4%,相比于第二名的26.2%有了巨大的提升,这可以说是神经网络在低谷期以后的第一次发声,确立了深度学习在计算机视觉领域的统治地位。AlexNet可以算是LeNet的一种更深更宽的版本,首次应用了ReLU、Dropout和LRN等trick,同时也使用了GPU进行加速运算。

AlexNet包含了6亿3000万个链接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面有最大池化层,最后还有3个全链接层。本文的内容参考AlexNet的论文
ImageNet classification with deep convolutional neural networks
同时在文末用tensorflow代码对其进行复现

文章目录

  • 一、AlexNet的新技术
  • 二、AlexNet模型结构
  • 三、AlexNet的Tensorflow实现
  • 四、更多资源下载

一、AlexNet的新技术

AlexNet主要用到了一下几个比较新的技术点

· 使用ReLU作为CNN的激活函数,并验证了其效果在较深的网络中超过了传统的sigmoid,论文中有下图

上图中实线表示使用ReLU激活函数时loss的下降曲线,虚线表示的是sigmoid,我们可以发现使用ReLU激活函数时,其下降明显变快了

· 训练时使用了dropout随机忽略一部分神经元,这已经被证明是避免过拟合的有效手段

· 在CNN中使用重叠的最大池化,在此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊效果。并且,AlexNet中提出让步长比池化核的尺寸小,这样池化层之间会有重叠和覆盖,提升了特征的丰富性

·提出了Local Response Normalization(LRN)层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力

·利用GPU强大的并行计算能力,加速卷积网络的训练

·数据增强,随机的从256x256的原始图像中截取224x224大小的区域,为训练数据增加了2058倍的数量,使用数据增强可以大大减轻过拟合,提升泛化性能。进行预测时,则提取图片的四个角加中间五个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值

·ALexNet论文中还提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%

二、AlexNet模型结构

整个AlexNet有8个需要训练参数的层(不包括池化层和LRN层),前5层为卷积层,后三层为全链接层

从上图可以看出AlexNet最后一层是有1000类输出的SoftMax层用作分类,输入的图片尺寸为224x224,第一个卷积层使用了较大的卷积核11x11,步长为2。这之后的卷积核为5x5或者3x3,且步长为1,即会扫描全图所有像素;而最大池化层保持为3x3,并且步长为2

我们可以发现在前面几个卷积层,虽然计算量很大,但参数量较小,都在1M左右甚至更小,只占网络总参数量很小的一部分,这就是卷积很有用的一个地方,可以通过较小的参数量提取有效的特征

三、AlexNet的Tensorflow实现

首先给出完整代码链接
https://github.com/LiangjunFeng/Alex_Net/blob/master/Alex_net.py

这里主要讲述AlexNet模型部分的代码,数据预处理部分请见上述链接,数据集较大,想要完整数据集的可以留言给我,邮件发送

import tensorflow as tfdef print_activations(t):print(t.op.name,' ',t.get_shape().as_list())  #输出每层网络结构的函数config = tf.ConfigProto()
config.gpu_options.allocator_type = 'BFC'
my_graph = tf.Graph()
sess = tf.InteractiveSession(graph=my_graph,config=config)  #创建tensorflow图与会话with my_graph.as_default():x = tf.placeholder(tf.float32,[None,image_size*image_size*3])x = tf.reshape(x,[-1,image_size,image_size,3])y = tf.placeholder(tf.float32,[None,190])  #为输入数据和标签创立占符#conv1,第一个卷积层c1_kernel = tf.get_variable('weights1',shape=[11,11,3,64],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer_conv2d()) #卷积核c1_conv = tf.nn.conv2d(x,c1_kernel,[1,4,4,1],padding = 'SAME')c1_biases = tf.Variable(tf.constant(0.0,shape=[64],dtype = tf.float32),trainable = True,name='biases')c1_bias = tf.nn.bias_add(c1_conv,c1_biases)  #加入偏置conv1 = tf.nn.relu(c1_bias,name = 'conv1')   #ReLU激活函数print_activations(conv1)                     #输出网络结构#pool1  最大池化层pool1 = tf.nn.max_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID',name='pool1')print_activations(pool1)#conv2 第二个卷积层c2_kernel = tf.get_variable('weights2',shape=[5,5,64,192],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer_conv2d())c2_conv = tf.nn.conv2d(pool1,c2_kernel,[1,1,1,1],padding='SAME')c2_biases = tf.Variable(tf.constant(0.0,shape=[192],dtype=tf.float32),trainable=True,name='biases')c2_bias = tf.nn.bias_add(c2_conv,c2_biases)conv2 = tf.nn.relu(c2_bias,name='conv2')print_activations(conv2)#pool2  第二个最大池化层pool2 = tf.nn.max_pool(conv2,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID',name='pool2')print_activations(pool2)#conv3  第三个卷积层c3_kernel = tf.get_variable('weights3',shape=[3,3,192,384],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer_conv2d())c3_conv = tf.nn.conv2d(pool2,c3_kernel,[1,1,1,1],padding='SAME')c3_biases = tf.Variable(tf.constant(0.0,shape=[384],dtype=tf.float32),trainable = True,name='biases')c3_bias = tf.nn.bias_add(c3_conv,c3_biases)conv3 = tf.nn.relu(c3_bias,name='conv3')print_activations(conv3)# conv4  第四个卷积层c4_kernel = tf.get_variable('weights4',shape=[3, 3, 384, 256],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer_conv2d())c4_conv = tf.nn.conv2d(conv3, c4_kernel, [1, 1, 1, 1], padding='SAME')c4_biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),trainable=True, name='biases')c4_bias = tf.nn.bias_add(c4_conv, c4_biases)conv4 = tf.nn.relu(c4_bias, name='conv4')print_activations(conv4)# conv5  第五个卷积层c5_kernel = tf.get_variable('weights5',shape=[3, 3, 256, 256],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer_conv2d())c5_conv = tf.nn.conv2d(conv4, c5_kernel, [1, 1, 1, 1], padding='SAME')c5_biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),trainable=True, name='biases')c5_bias = tf.nn.bias_add(c5_conv, c5_biases)conv5 = tf.nn.relu(c5_bias, name='conv5')print_activations(conv5)# pool5  最大池化层pool5 = tf.nn.max_pool(conv4,ksize=[1, 3, 3, 1],strides=[1, 2, 2, 1],padding='VALID',name='pool5')print_activations(pool5)# flat1  第一个全链接层f1_weight = tf.get_variable('weights6',shape=[6*6*256,4096],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer())f1_biases = tf.Variable(tf.constant(0.1,shape=[4096]))pool5_flat = tf.reshape(pool5,[-1,6*6*256])flat1 = tf.nn.relu(tf.matmul(pool5_flat,f1_weight)+f1_biases,name = 'flat1')print_activations(flat1)# flat2 第二个全链接层f2_weight = tf.get_variable('weights7',shape=[4096,4096],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer())f2_biases = tf.Variable(tf.constant(0.1,shape=[4096]))flat2 = tf.nn.relu(tf.matmul(flat1,f2_weight)+f2_biases,name = 'flat2')print_activations(flat2)# output 输出层op_weight = tf.get_variable('weights8',shape=[4096,190],dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer()) #使用的数据集共190个类别,所以190个输出节点op_biases = tf.Variable(tf.constant(0.1,shape=[190]))y_conv = tf.nn.softmax(tf.matmul(flat2,op_weight)+op_biases,name = 'output')print_activations(y_conv)cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(tf.clip_by_value(y_conv, 1e-10, 1.0)),reduction_indices=[1]))    #定义损失函数train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)  #确定优化算法correct_prediction = tf.equal(tf.arg_max(y_conv,1),tf.arg_max(y,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))   #精度定义sess.run(tf.global_variables_initializer())for i in range(num_batches):rand_index = np.random.choice(35221,size=(batch_size))train_step.run(feed_dict={x:traindata[rand_index],y:trainlabel[rand_index]})if i%100 == 0:  #每100个batch输出训练精度与lossrand_index = np.random.choice(35221,size=(3000))train_accuracy = accuracy.eval(feed_dict={x:traindata[rand_index],y:trainlabel[rand_index]})print('step %d, training accuracy %g'%(i,train_accuracy))print('step %d, training accuracy %g'%(cross_entropy.eval(feed_dict={x:traindata[rand_index],y:trainlabel[rand_index]})))print("test accuracy %g"%accuracy.eval(feed_dict={x:testdata,y:testlabel}))#输出测试精度

四、更多资源下载

微信搜索“老和山算法指南”获取更多下载链接与技术交流群

有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。

DeepLearning | 经典卷积神经网络Alex_Net (完整模型与tensorflow代码讲解,附数据集)相关推荐

  1. DeepLearning | 经典卷积神经网络VGG_Net

    VGGNet是牛津大学计算机视觉组和Google DeepMind 公司的研究员一起研发的深度卷积神经网络.VGGNet探索了卷积神经网络的深度与性能之间的关系,通过反复堆叠3x3的小型卷积核和2x2 ...

  2. 【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——[附完整训练代码]

    [神经网络与深度学习]CIFAR-10数据集介绍,并使用卷积神经网络训练模型--[附完整代码] 一.CIFAR-10数据集介绍 1.1 CIFAR-10数据集的内容 1.2 CIFAR-10数据集的结 ...

  3. 一文总结经典卷积神经网络CNN模型

    一般的DNN直接将全部信息拉成一维进行全连接,会丢失图像的位置等信息. CNN(卷积神经网络)更适合计算机视觉领域.下面总结从1998年至今的优秀CNN模型,包括LeNet.AlexNet.ZFNet ...

  4. 【经典卷积神经网络CNN模型 之 VGG16Net】模型实验,强烈建议使用GPU来跑,经试验,若使用CPU,普通PC理论上需要超过100小时

    声明:仅学习使用~ 建议回顾基础知识: 包含但不限于 [模型实验]几个 经典卷积神经网络CNN模型 回顾:分组卷积–AlexNet,使用3x3卷积核----VGG,使用多种卷积核结构----Googl ...

  5. 深度学习二三事-回顾那些经典卷积神经网络

    前言 卷积神经网络从2012年开始逐步火热起来.我是在2017年开始接触深度学习技术,完成硕士课题研究,在2019年毕业后以算法工程师职位进入AI创业公司,如今工作3年了.俗话说,温故而知新,结合自己 ...

  6. Tensorflow实例:(卷积神经网络)LeNet-5模型

    通过卷积层.池化层等结构的任意组合得到的神经网络有无限多种,怎样的神经网络更有可能解决真实的图像处理问题?本文通过LeNet-5模型,将给出卷积神经网络结构设计的一个通用模式. LeNet-5模型 L ...

  7. DeepLearning | 图卷积神经网络(GCN)解析(论文、算法、代码)

    本篇博客主要讲述三种图卷积网络(Graph Convolutional Network, GCN)的算法原理及python实现,全文阅读时间约10分钟. 博主关于图神经网络的文章 DeepLearni ...

  8. tensorflow预定义经典卷积神经网络和数据集tf.keras.applications

    自己开发了一个股票软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1  tensorflow预定义经 ...

  9. 【深度学习基础】经典卷积神经网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导语 卷积神经网络(Convolutional Neural Ne ...

最新文章

  1. 想学python看什么书-想学习Python做数据分析,应该看哪些书?
  2. JavaScript 中 window.setTimeout() 的详细用法
  3. 随时随地能写代码, vscode.dev 出手了
  4. Filecoin Gas基础费率降至4.67 nanoFIL
  5. 【248天】跃迁之路——程序员高效学习方法论探索系列(实验阶段06-2017.10.11)...
  6. 一种巧妙且简单的数据增强方法 - MixUp 小综述
  7. 推荐12个漂亮的CSS3按钮实现方案
  8. liunx中如何查看软件的安装目录
  9. Hadoop2.6分布式集群安装配置
  10. linux 小巧的浏览器,崇尚简约 六款小体积浏览器推荐
  11. 生鲜电商进入2.0时代,美团还有“后招”吗?
  12. Reportlab生成图文并茂的pdf报告
  13. 清明上河图30亿像素_清明上河图高清下载|
  14. IBM P系列小型机HMC默认IP地址
  15. 全职高手24职业及技能(Full time master)
  16. 感知机学习:鸢尾花二分类
  17. macbook黑屏_Macbook苹果笔记本电脑开机黑屏如何解决【解决方法】
  18. 从华为畅享7爆红双11 看千元市场爆品的新常态
  19. papers with code介绍(人工智能方向研究生的必备网站)
  20. java 阶梯_Java if-else-if阶梯语句

热门文章

  1. 视频的显示尺寸与surfaceview 和 surface 的关系
  2. ise9.2中的三模冗余设计步骤
  3. 系统服务器一般都要求冗余配置,服务器冗余配置
  4. 16进制7段译码器仿真
  5. 驱动调试(三)oops确定函数PC
  6. Ogre 3D的启动顺序 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第九章
  7. 使用Jsoup实现简单的页面信息爬取
  8. WDM驱动加载的实现(1)
  9. 解决generated-sources中的文件无法导入问题
  10. C语言结构体,输出李明的相关信息。