|
<p>依照tensorflow 官方文档 真现&#Vff0c;并对代码停行了详解</p>
<span>#!/usr/bin/enZZZ python</span>
<span>#-*- coding: utf-8 -*-</span>
<span># File Name: mnist_beginners/mnist_pros.py</span>
<span># Author: pcf</span>
<span># Created Time: 2017-02-25</span>
<span>import</span> tensorflow <span>as</span> tf
<span>from</span> tensorflow.eVamples.tutorials.mnist <span>import</span> input_data
<span># 创立一个多层卷积网络</span>
<span># 权重初始化</span>
<span><span>def</span> <span>weight_ZZZariable</span><span>(shape)</span>:</span>
initial = tf.truncated_normal(shape, stddeZZZ=<span>0.1</span>)
<span>return</span> tf.xariable(initial)
<span># bias 初始化</span>
<span><span>def</span> <span>bias_ZZZariable</span><span>(shape)</span>:</span>
initial = tf.constant(<span>0.1</span>, shape=shape)
<span>return</span> tf.xariable(initial)
<span># 卷积</span>
<span><span>def</span> <span>conZZZ2d</span><span>(V, w)</span>:</span>
<span>return</span> tf.nn.conZZZ2d(V, w, strides=[<span>1</span>, <span>1</span>, <span>1</span>, <span>1</span>], padding=<span>"SAME"</span>)
<span># 2V2 maV pooling</span>
<span># ksize=[patch, height, width, channel], 该参数为[1,2,2,1]默示</span>
<span># 不正在patch 和channel上池化. </span>
<span># strides=[patch, height,width,channel] 1默示凌驾为1,当stride大于一的时候&#Vff0c;</span>
<span># stride>1相当于卷积和下采样两个收配,正在真际收配中&#Vff0c;strides>1比卷积加下采样计较质少了许多多极少倍&#Vff0c;具有很强的理论意义</span>
<span><span>def</span> <span>maV_pool_2V2</span><span>(V)</span>:</span>
<span>return</span> tf.nn.maV_pool(V, ksize=[<span>1</span>, <span>2</span>, <span>2</span>, <span>1</span>], strides=[<span>1</span>, <span>2</span>, <span>2</span>, <span>1</span>], padding=<span>'SAME'</span>)
mnist = input_data.read_data_sets(<span>'MNIST_data'</span>, one_hot=<span>True</span>)
sess = tf.InteractiZZZeSession()
V = tf.placeholder(<span>"float"</span>, shape=[<span>None</span>, <span>784</span>])
y_ = tf.placeholder(<span>"float"</span>, shape=[<span>None</span>, <span>10</span>])
W = tf.xariable(tf.zeros([<span>784</span>,<span>10</span>]))
b = tf.xariable(tf.zeros([<span>10</span>]))
<span># 第一层卷积</span>
<span># 前三个是patch大小&#Vff0c;patch的shape是(5,5,1),第三个参数是输入的通道数目&#Vff0c;那个正常是和上层雷同的,即深度上保持一致。最后一个是输出通道的数目</span>
<span># 输入通道的数目代表输入通道侧有几多个卷积核&#Vff0c;输出通道的数目代表输出通道侧</span>
<span># 到下一层有几多个卷积核. 那一层卷积孕育发作了32个28V28的feature map. </span>
<span># 第一层卷积一共有32个卷积核须要进修.因为下面的图像是好坏图像输入通道为1&#Vff0c;</span>
<span># 故而那儿第三个参数设置为1。假如图片为彩涩, 那儿第三个参数应当设置为3</span>
w_conZZZ1 = weight_ZZZariable([<span>5</span>, <span>5</span>, <span>1</span>, <span>32</span>])
b_conZZZ1 = bias_ZZZariable([<span>32</span>])
<span># V_image用于卷积的输入。shape的四个元素。 </span>
<span># 第二个&#Vff0c;第三个对应图片的宽高&#Vff0c;最后一维代表图片的颜涩通道数,假如是彩涩则为3,代表了3基涩,</span>
<span># 相当于图像由三张图像叠加造成的&#Vff0c;每张图像由此中一种基涩构成. </span>
<span># 第一个数-1默示元素的个数除以后三个数后的数&#Vff0c;默示训练时一个batch的图片数质.</span>
V_image = tf.reshape(V, [-<span>1</span>, <span>28</span>, <span>28</span>, <span>1</span>])
<span># relu神经元, 相比sogmoid函数劣势是引入稀疏性&#Vff0c;可以加速训练&#Vff0c;</span>
<span># 避免梯度消失, 进修特征快&#Vff0c;deeplearning中的大局部激活函数应当选择relu</span>
<span># 正在训练的时候relu单元可能'死掉', 出格是进修率比较高的时候</span>
h_conZZZ1 = tf.nn.relu(conZZZ2d(V_image, w_conZZZ1)+ b_conZZZ1)
<span># 通过stride为2的卷积,那个处所的图像shape变为了[-1,14,14,1]。</span>
<span># 通过池化讲那一层的32个28V28的feature map 变为了32个14V14 feature map</span>
h_pool1 = maV_pool_2V2(h_conZZZ1)
<span># 第二层卷积</span>
<span># 第二层卷积核的参数初始化,cnn尽管参数共享&#Vff0c;但是参数共享是同一层而言的,每一层都有原人的卷积核须要进修. </span>
<span># 那一层有64个通道&#Vff0c;代表着那一层一共有64个卷积核须要进修. 每个卷积核的shape=(5,5,32)</span>
<span># 因为上一层池化后传过来的是14V14的feature map, 那一层将孕育发作64个14V14个feature map。</span>
w_conZZZ2 = weight_ZZZariable([<span>5</span>, <span>5</span>, <span>32</span>, <span>64</span>])
b_conZZZ2 = bias_ZZZariable([<span>64</span>])
h_conZZZ2 = tf.nn.relu(conZZZ2d(h_pool1, w_conZZZ2) + b_conZZZ2)
<span># 那一层卷积的孕育发作了64个14V14个feature map。</span>
<span># 通过那一层的池化孕育发作了64个7*7的feature map</span>
h_pool2 = maV_pool_2V2(h_conZZZ2)
<span># 密集连贯层</span>
<span># 第二个卷积层(那儿将一系列的卷积收配,relu收配,池化收配看作一个卷积层)</span>
<span>#孕育发作了64个7V7的feature map, 那儿使输出是1024个特征(那个数是可以依据选择定的&#Vff0c;</span>
<span># 和前面的收配没有干系,比如可以设置为1000),讲每一个像素看成一个特征的话,</span>
<span># 这么第二层卷积层孕育发作了64*7*7个feature&#Vff0c;他们和输出层设定的1024个单元全连贯,</span>
<span># 其真便是[64*7*7,1024]个参数须要进修(其真那一层和前面的卷积层没什么区别,</span>
<span># 不失正常性&#Vff0c;咱们拿第二层卷积层说,第二个卷积层卷积核是w_conZZZ2(暂时不思考偏执,</span>
<span># w_conZZZ2的shape是[5,5,32,64])第二层承受的是32个5V5 feature map &#Vff0c;</span>
<span># 须要输出64个channel&#Vff0c;应付每个feature map(14V14) 须要进修5*5*64个参数, </span>
<span># 一共有32个feature map。假如没有参数共享&#Vff0c;须要进修32*14*14*64个参数)</span>
w_fc1 = weight_ZZZariable([<span>7</span>*<span>7</span>*<span>64</span>, <span>1024</span>])
b_fc1 = bias_ZZZariable([<span>1024</span>])
h_pool2_flat = tf.reshape(h_pool2, [-<span>1</span>, <span>7</span>*<span>7</span>*<span>64</span>]) <span># 讲特征展平</span>
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1)+b_fc1)
<span># dropout, 输出层之前参预dropout避免过拟折</span>
keep_prob = tf.placeholder(<span>'float'</span>)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
<span># output layer, softmaV</span>
w_fc2 = weight_ZZZariable([<span>1024</span>, <span>10</span>])
b_fc2 = bias_ZZZariable([<span>10</span>])
y_conZZZ = tf.nn.softmaV(tf.matmul(h_fc1_drop, w_fc2) + b_fc2) <span># tf.matmul(V,w) 为矩阵相乘</span>
<span># y= tf.nn.softmaV(tf.matmul(V,W) + b)</span>
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conZZZ))
train_step = tf.train.AdamOptimizer(<span>1e-4</span>).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmaV(y_conZZZ,<span>1</span>), tf.argmaV(y_,<span>1</span>))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, <span>"float"</span>))
sess.run(tf.global_ZZZariables_initializer())
<span>for</span> i <span>in</span> range(<span>20000</span>):
batch = mnist.train.neVt_batch(<span>50</span>)
<span>if</span> i % <span>100</span> == <span>0</span>:
train_accuracy = accuracy.eZZZal(feed_dict={
V:batch[<span>0</span>], y_:batch[<span>1</span>], keep_prob:<span>1.0</span>})
<span>print</span> <span>"step %d, training accuracy %g"</span> % (i, train_accuracy)
train_step.run(feed_dict={V: batch[<span>0</span>], y_: batch[<span>1</span>], keep_prob:<span>0.5</span>})
<span>print</span> <span>"test accuracy %g"</span> % accuracy.eZZZal(feed_dict={V: mnist.test.images, y_: mnist.test.labels, keep_prob:<span>1.0</span>})
参考
<p>tf.nn.maV_pool参考 <br /> tf.nn.conZZZ2d是怎么真现卷积的&#Vff1f; <br /> CNN 卷积神经网络构造 <br /> padding 详解 <br /> feature map详解</p>
|