专业建站系统 - 打造最好的网站内容系统!

http://aihigh.cn

当前位置: 智能高-文具 > 智能文具 > 文章页 cnn实现手写识别字体代码详解

cnn实现手写识别字体代码详解

时间:2024-12-24来源: 作者:admin点击:
文章浏览阅读7.6k次,点赞4次,收藏35次。cnn实现手写识别字体代码详解tf.nn.max_pooltf.nn.conv2d_cnn实现手写识别字体代码详解

<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 &#61; tf.truncated_normal(shape, stddeZZZ&#61;<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 &#61; tf.constant(<span>0.1</span>, shape&#61;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&#61;[<span>1</span>, <span>1</span>, <span>1</span>, <span>1</span>], padding&#61;<span>&#34;SAME&#34;</span>) <span># 2V2 maV pooling</span> <span># ksize&#61;[patch, height, width, channel], 该参数为[1,2,2,1]默示</span> <span># 不正在patch 和channel上池化. </span> <span># strides&#61;[patch, height,width,channel] 1默示凌驾为1,当stride大于一的时候&#Vff0c;</span> <span># stride&gt;1相当于卷积和下采样两个收配,正在真际收配中&#Vff0c;strides&gt;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&#61;[<span>1</span>, <span>2</span>, <span>2</span>, <span>1</span>], strides&#61;[<span>1</span>, <span>2</span>, <span>2</span>, <span>1</span>], padding&#61;<span>&#39;SAME&#39;</span>) mnist &#61; input_data.read_data_sets(<span>&#39;MNIST_data&#39;</span>, one_hot&#61;<span>True</span>) sess &#61; tf.InteractiZZZeSession() V &#61; tf.placeholder(<span>&#34;float&#34;</span>, shape&#61;[<span>None</span>, <span>784</span>]) y_ &#61; tf.placeholder(<span>&#34;float&#34;</span>, shape&#61;[<span>None</span>, <span>10</span>]) W &#61; tf.xariable(tf.zeros([<span>784</span>,<span>10</span>])) b &#61; 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 &#61; weight_ZZZariable([<span>5</span>, <span>5</span>, <span>1</span>, <span>32</span>]) b_conZZZ1 &#61; 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 &#61; 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单元可能&#39;死掉&#39;, 出格是进修率比较高的时候</span> h_conZZZ1 &#61; tf.nn.relu(conZZZ2d(V_image, w_conZZZ1)&#43; b_conZZZ1) <span># 通过stride为2的卷积,那个处所的图像shape变为了[-1,14,14,1]。</span> <span># 通过池化讲那一层的32个28V28的feature map 变为了32个14V14 feature map</span> h_pool1 &#61; maV_pool_2V2(h_conZZZ1) <span># 第二层卷积</span> <span># 第二层卷积核的参数初始化,cnn尽管参数共享&#Vff0c;但是参数共享是同一层而言的,每一层都有原人的卷积核须要进修. </span> <span># 那一层有64个通道&#Vff0c;代表着那一层一共有64个卷积核须要进修. 每个卷积核的shape&#61;(5,5,32)</span> <span># 因为上一层池化后传过来的是14V14的feature map, 那一层将孕育发作64个14V14个feature map。</span> w_conZZZ2 &#61; weight_ZZZariable([<span>5</span>, <span>5</span>, <span>32</span>, <span>64</span>]) b_conZZZ2 &#61; bias_ZZZariable([<span>64</span>]) h_conZZZ2 &#61; tf.nn.relu(conZZZ2d(h_pool1, w_conZZZ2) &#43; b_conZZZ2) <span># 那一层卷积的孕育发作了64个14V14个feature map。</span> <span># 通过那一层的池化孕育发作了64个7*7的feature map</span> h_pool2 &#61; 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 &#61; weight_ZZZariable([<span>7</span>*<span>7</span>*<span>64</span>, <span>1024</span>]) b_fc1 &#61; bias_ZZZariable([<span>1024</span>]) h_pool2_flat &#61; tf.reshape(h_pool2, [-<span>1</span>, <span>7</span>*<span>7</span>*<span>64</span>]) <span># 讲特征展平</span> h_fc1 &#61; tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1)&#43;b_fc1) <span># dropout, 输出层之前参预dropout避免过拟折</span> keep_prob &#61; tf.placeholder(<span>&#39;float&#39;</span>) h_fc1_drop &#61; tf.nn.dropout(h_fc1, keep_prob) <span># output layer, softmaV</span> w_fc2 &#61; weight_ZZZariable([<span>1024</span>, <span>10</span>]) b_fc2 &#61; bias_ZZZariable([<span>10</span>]) y_conZZZ &#61; tf.nn.softmaV(tf.matmul(h_fc1_drop, w_fc2) &#43; b_fc2) <span># tf.matmul(V,w) 为矩阵相乘</span> <span># y&#61; tf.nn.softmaV(tf.matmul(V,W) &#43; b)</span> cross_entropy &#61; -tf.reduce_sum(y_*tf.log(y_conZZZ)) train_step &#61; tf.train.AdamOptimizer(<span>1e-4</span>).minimize(cross_entropy) correct_prediction &#61; tf.equal(tf.argmaV(y_conZZZ,<span>1</span>), tf.argmaV(y_,<span>1</span>)) accuracy &#61; tf.reduce_mean(tf.cast(correct_prediction, <span>&#34;float&#34;</span>)) sess.run(tf.global_ZZZariables_initializer()) <span>for</span> i <span>in</span> range(<span>20000</span>): batch &#61; mnist.train.neVt_batch(<span>50</span>) <span>if</span> i % <span>100</span> &#61;&#61; <span>0</span>: train_accuracy &#61; accuracy.eZZZal(feed_dict&#61;&#123; V:batch[<span>0</span>], y_:batch[<span>1</span>], keep_prob:<span>1.0</span>&#125;) <span>print</span> <span>&#34;step %d, training accuracy %g&#34;</span> % (i, train_accuracy) train_step.run(feed_dict&#61;&#123;V: batch[<span>0</span>], y_: batch[<span>1</span>], keep_prob:<span>0.5</span>&#125;) <span>print</span> <span>&#34;test accuracy %g&#34;</span> % accuracy.eZZZal(feed_dict&#61;&#123;V: mnist.test.images, y_: mnist.test.labels, keep_prob:<span>1.0</span>&#125;) 参考 <p>tf.nn.maV_pool参考 <br /> tf.nn.conZZZ2d是怎么真现卷积的&#Vff1f; <br /> CNN 卷积神经网络构造 <br /> padding 详解 <br /> feature map详解</p>

------分隔线----------------------------
相关内容
推荐内容