1 # 导入数据
  2 from tensorflow.examples.tutorials.mnist import input_data
  3 # 读取数据
  4 mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)
  5 import tensorflow as tf
  6
  7 # 定义卷积操作函数
  8 def conv2d(name,x,w,b):
  9     return tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME'),b),name=name)
 10
 11 # 定义下采样操作函数
 12 def max_pool(name,x,k):
 13     return tf.nn.max_pool(x,ksize=[1,k,k,1],strides=[1,k,k,1],padding='SAME',name=name)
 14
 15 # 定义归一化函数
 16 def norm(name,x,lsize=4):
 17     return tf.nn.lrn(x,lsize,bias=1.0,alpha=0.001/9,beta=0.75,name=name)
 18
 19 # 正式定义alex_net网络结构
 20 def alex_net(_X,_weights,_biases,_dropout):
 21     # 对输入进行形变
 22     _X=tf.reshape(_X,shape=[-1,28,28,1])
 23
 24     # 构建第一个卷积层
 25     conv1=conv2d('conv1',_X,_weights['wc1'],_biases['bc1'])
 26     pool1=max_pool('pool1',conv1,k=2)
 27     norm1=norm('norm1',pool1,lsize=4)
 28     drop1=tf.nn.dropout(norm1,_dropout)
 29
 30     # 构建第二个卷积层
 31     conv2=conv2d('conv2',drop1,_weights['wc2'],_biases['bc2'])
 32     pool2=max_pool('pool2',conv2,k=2)
 33     norm2=norm('norm2',pool2,lsize=4)
 34     drop2=tf.nn.dropout(norm2,_dropout)
 35
 36     # 构建第三个卷积层
 37     conv3=conv2d('conv3',drop2,_weights['wc3'],_biases['bc3'])
 38     pool3=max_pool('pool3',conv3,k=2)
 39     norm3=norm('norm3',pool3,lsize=4)
 40     drop3=tf.nn.dropout(norm3,_dropout)
 41
 42     # 对输出进行形变,然后连接三个全连接层
 43     dense1=tf.reshape(drop3,shape=[-1,_weights['wd1'].get_shape().as_list()[0]])
 44     dense1=tf.nn.relu(tf.matmul(dense1,_weights['wd1'])+_biases['bd1'],name='fc1')
 45     dense2=tf.nn.relu(tf.matmul(dense1,_weights['wd2'])+_biases['bd2'],name='fc2')
 46     out=tf.matmul(dense2,_weights['out']+_biases['out'])
 47     return out
 48
 49 # 设置网络训练参数
 50 learning_rate=0.001
 51 training_iters=200000
 52 batch_size=64
 53 display_step=20
 54
 55 # 设置数据参数
 56 n_input=784
 57 n_classes=10
 58 dropout=0.8
 59
 60 # 占位符输入 有的版本写成 tf.types.float32
 61 x=tf.placeholder(tf.float32,[None,n_input])
 62 y=tf.placeholder(tf.float32,[None,n_classes])
 63 keep_prob=tf.placeholder(tf.float32)
 64
 65 # 设置网络核的大小,层数,采样步长等
 66 weights={
 67     'wc1':tf.Variable(tf.random_normal([3,3,1,64])),
 68     'wc2':tf.Variable(tf.random_normal([3,3,64,128])),
 69     'wc3':tf.Variable(tf.random_normal([3,3,128,256])),
 70     'wd1':tf.Variable(tf.random_normal([4*4*256,1024])),
 71     'wd2':tf.Variable(tf.random_normal([1024,1024])),
 72     'out':tf.Variable(tf.random_normal([1024,10]))
 73     }
 74
 75 biases={
 76     'bc1':tf.Variable(tf.random_normal([64])),
 77     'bc2':tf.Variable(tf.random_normal([128])),
 78     'bc3':tf.Variable(tf.random_normal([256])),
 79     'bd1':tf.Variable(tf.random_normal([1024])),
 80     'bd2':tf.Variable(tf.random_normal([1024])),
 81     'out':tf.Variable(tf.random_normal([n_classes]))
 82 }
 83
 84 # 构建一个alex_net网络,并根据输入预测输出结果
 85 pred=alex_net(x,weights,biases,keep_prob)
 86
 87 # 根据预测值pred和真实标签y,构建损失函数
 88 cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y))
 89 // 设置优化函数,最小化损失函数
 90 optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
 91
 92 # 设置测试网络
 93 correct_pred=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
 94 accuracy=tf.reduce_mean(tf.cast(correct_pred,tf.float32))
 95
 96 # 初始化网络所有对权重  有的版本写成 global_variables_initializer
 97 init=tf.initialize_all_variables()
 98
 99 with tf.Session() as sess:
100      # 初始化网络权值
101      sess.run(init)
102      step = 1
103
104      # 开始训练网络,直到达到最大迭代次数
105      while step * batch_size < training_iters:
106          # 获取批数据
107          batch_xs, batch_ys = mnist.train.next_batch(batch_size)
108
109          # 根据批数据训练网络
110          sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys, keep_prob: dropout})
111
112          # 打印输出
113          if step % display_step == 0:
114              # 计算精度
115              acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
116              # 计算损失值
117              loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
118              print "Iter " + str(step*batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + ", Training Accuracy= " + "{:.5f}".format(acc)
119          step += 1
120
121      print "Optimization Finished!"
122      # 计算测试精度
123      print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob: 1.})

View Code

code 解析:

tf.argmax(y,1)函数返回tensor中参数指定对维度中的最大值的索引。在模型中,对应输入数据对最大概率标签。

tf.argmax(pred,1)为预测结果

tf.equal比较预测结果和实际结果是否相等。返回一个波哦里列表。

tf.cast将bool列表中的bool值转换成浮点数,如[True,False,True,True]转换成[1,0,1,1]

tf.reduce_mean来计算准确率,如0.75

AlexNet:

(1)获得里ILSVRC比赛分类项目的2012年冠军(top-5错误率16.4%,使用额外数据可达到15.3%,8层神经网络 5 conv+3 fc)

  • 有8个需要训练参数的层(不包括池化层和LRN层)
  • 最后一层是有1000类输出的Softmax层用作分类
  • ReLU在8层(conv或fc)每一层的后面
  • LRN层在conv1和conv2的ReLU后
  • max_pooling层在LRN1 LRN2和 conv5 之后

(2)首次在CNN中成功应用里ReLU Dropout和LRN等Trick:

  • 成功使用ReLU作为CNN的激活函数,并验证其效果在较深对网络超过里Sigmoid,成功解决里Sigmoid在网络较深时对梯度弥散问题。虽然ReLU激活函数在很久之前就被提出,但是直到AlexNet的出现才将其发扬光大。
  • 训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽然有单独对论文,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要时最后几个全连接使用了Dropout。
  • 在CNN中使用重叠对最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化对模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层对输出之间会有重叠和覆盖,提升里特征对丰富性。
  • 提出了LRN层,对局部神经元对活动创建竞争机制,使得其中响应比较大对值变得相对更大,并抑制其他反馈较小的神经元,增强里模型对泛化能力。
  • 使用CUDA加速深度卷积网络的训练,利用GPU强大对并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半对神经元对参数。因为GPU之间对通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,让GPU之间的通信只在网络的某些层进行,控制里通信对性能损耗。
  • 数据增强,随机地从256×256的原始图像中截取224×224大小对区域以及水平翻转对镜像,相当于增加了(256-224)×(256-224)×2=2048倍的数据量。如果没有数据增强,仅靠原始对数据量,CNN会陷入过拟合。进行预测时,则是取图片对四个角加中间共五个位置,并进行左右翻转,一共获得10张图片。对他们进行预测并对10次结果求均值。同时,对图像TGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。

参考资料:

《TensorFlow实战》黄文坚  唐源 著

转载于:https://www.cnblogs.com/fighting-lady/p/7093217.html

TensorFlow实战-AlexNet相关推荐

  1. 【Tensorflow】深度学习实战03——Tensorflow实现AlexNet

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前两篇博文中分别利用卷积神经网络识别手写数字和对CIFAR-10数据集分类,在这两次的 ...

  2. TensorFlow实战:Chapter-4(CNN-2-经典卷积神经网络(AlexNet、VGGNet))

    引言 AlexNet AlexNet 简介 AlexNet的特点 AlexNet论文分析 引言 介绍 数据集 网络架构 注解 注解 减少过拟合 训练细节 结果 讨论 参考文献略 AlexNet在Ten ...

  3. Tensorflow实战学习(三十)【实现AlexNet】

    ILSVRC(ImageNet Large Scale Visual Recognition Challenge)分类比赛.AlexNet 2012年冠军(top-5错误率16.4%,额外数据15.3 ...

  4. 免费教材丨第55期:Python机器学习实践指南、Tensorflow 实战Google深度学习框架

    小编说  时间过的好快啊,小伙伴们是不是都快进入寒假啦?但是学习可不要落下哦!  本期教材  本期为大家发放的教材为:<Python机器学习实践指南>.<Tensorflow 实战G ...

  5. Tensorflow实战之下载MNIST数据,自动分成train, validation和test三个数据集

    TensorFlow 实战Google深度学习框架 第2版 ,郑泽宇之P96.下载MNIST数据,自动分成train, validation和test三个数据集,源码如下: #!/usr/bin/en ...

  6. Tensorflow实战系列之五:

    打算写实例分割的实战,类似mask-rcnn. Tensorflow实战先写五个系列吧,后面新的技术再添加~~ 转载于:https://www.cnblogs.com/wmr95/p/8846887. ...

  7. 《Tensorflow 实战google深度学习框架》第二版源代码

    <<Tensorflow 实战google深度学习框架–第二版>> 完整资料github地址: https://github.com/caicloud/tensorflow-t ...

  8. 06.图像识别与卷积神经网络------《Tensorflow实战Google深度学习框架》笔记

    一.图像识别问题简介及经典数据集 图像识别问题希望借助计算机程序来处理.分析和理解图片中的内容,使得计算机可以从图片中自动识别各种不同模式的目标和对象.图像识别问题作为人工智能的一个重要领域,在最近几 ...

  9. tensorflow63 《深度学习原理与TensorFlow实战》03 Hello TensorFlow

    00 基本信息 <深度学习原理与TensorFlow实战>书中涉及到的代码主要来源于: A:Tensorflow/TensorflowModel/TFLean的样例, B:https:// ...

最新文章

  1. FastDFS在项目中的应用
  2. a113 智能音箱芯片方案_高通入局智能音箱,首款四核单芯片方案曝光
  3. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作
  4. 你的iOS静态库该减肥了
  5. 均匀化退火时间_热处理4把火:淬火、回火、正火、退火,都分清楚了么?
  6. oracle mseq,一次RMAN备份报错的诊断过程(一)
  7. 如果你正处于迷茫期,那就来做这份工作吧!
  8. 51单片机入门教程(6)——外部中断
  9. BSN: Boundary-Sensitive Network for Temporal Action Proposal Generation
  10. RestTemplate使用笔记
  11. JVM判断对象是否存活
  12. android 自定义tabhost,安卓选项卡的实现方法(TabActivity),自定义TabHost容器
  13. PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.4 BCD解密
  14. 数据库可疑修复的方法
  15. 中国AI专利数稳居第一!世界各国AI专利深度盘点
  16. sql语句修改mysql数据库密码_修改mysql数据库密码的3中方法
  17. 定性分析与定量分析的异同及优缺点
  18. python监控服务器cpu温度实例_用python访问CPU温度
  19. 凯利公式(庄家必胜篇)——致放假在家的高薪程序员们
  20. 《FreeKick》战术_游戏前线

热门文章

  1. Java-OpenCV(一)准备工作
  2. 【MFC】工具栏按钮的热点效果
  3. 【STM32】系统配置控制器相关函数和类型
  4. 【Linux】一步一步学Linux——type命令(200)
  5. 中国互联网的“去中心化”与“中心化”之战
  6. 数据结构-----AVL树的插入删除操作
  7. postmethod 设置request body utf-8_Cypress系列(62) request() 命令详解
  8. 记录kafka踩坑:marking the coordinator (id rack null) dead for group
  9. ols残差_python数据关系型图表散点图系列残差分析图
  10. IIS -2147467259 (0x80004005)