概述
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.})
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的全部内容,希望文章能够帮你解决TensorFlow实战-AlexNet所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复