tensorflow实现卷积神经网络经典案例--识别手写数字_第1页
tensorflow实现卷积神经网络经典案例--识别手写数字_第2页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、yotensorflow实现卷积神经网络经典案例-识别手写数字importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportmatplotlib.cmascm%matplotlibinlineimporttensorflowastf#参数设置learning_rate=1e-4training_iterations=2000dropout=0.5batch_size=50#所有的训练样本分批训练的效率最高,每一批的训练样本数量就是batchvalidation_size=2000image_to_display=10数据准备:

2、data=pd.read_csv('./train.csv')images=data.iloc:,l:.valuesimages=images.astype(np.float)#对训练数据进行归一化处理,0:255=>0.0:1.0images=np.multiply(images,1.0/255.0)#print('images(00,01)'.format(images.shape)可以查看数据格式,输出结果为'data(42000,784)'image_size=images.shape1image_width=image_heigh

3、t=np.ceil(np.sqrt(image_size).astype(np.uint8)#定义显示图片的函数defdisplay(img):#从784=>28*28one_img=img.reshape(image_width,image_height)plt.axis('off)plt.imshow(one_img,cmap=cm.binary)display(images10)#显示数据表格中第十条数据代表的数字,结果如下图Iabels_flat=data.iloc:,0.values.ravel()Iabels_count=np.unique(labels_flat).

4、shape0#定义one-hot编码函数defdense_to_one_hot(labels_dense,num_classes):num_labels=labels_dense.shapeOindex_offset=np.arange(numabels)*num_classeslabels_one_hot=np.zeros(numabels,num_classes)labels_one_hot.flatindex_offset+labels_dense.ravel()=1returnlabels_one_hotlabels=dense_to_one_hot(labels_flat,label

5、s_count)labels=labels.astype(np.uint8)#print(labels10)的输出结果为'0000000010',代表数据集中第10个数字的实际值为'8'#将数据拆分成用于训练和验证两部分validation_images=images:validation_size#将训练的数据分为train和validation,validation的部分是为了对比不同模型参数的训练效果,如:learning_rate,training_iterations,dropoutvalidation_labels=labels:validation

6、_sizetrain_images=imagesvalidation_size:train_labels=labelsvalidation_size:定义权重、偏差、卷积图层、池化图层:#定义weightdefweight_variable(shape):initial=tf.truncated_normal(shape,stddev=0.1)returntf.Variable(initial)#定义biasdefbias_variable(shape):initial=tf.constant(0.1,shape=shape)returntf.Variable(initial)#定义二维的卷积

7、图层defconv2d(x,W):returntf.nn.conv2d(x,W,strides=1,1,1,1,padding='SAME')#定义池化图层defmax_pool_2x2(x):returntf.nn.max_pool(x,ksize=1,2,2,1,strides=1,2,2,1,padding='SAME')权重weight和偏置bias其实可以写成python的输入量,但是TensorFlow有更好的处理方式,将weight和bias设置成为变量,即计算图中的一个值,这样使得它们能够在计算过程中使用,甚至进行修改。shape表示weight

8、和bias的维度。卷积使用1步长(strides1,x_movement,y_movement,1),0边距(padding)的模板,保证输出和输入是同一个大小opadding:边距处理,“SAME”表示输出图层和输入图层大小保持不变,设置为“VALID”时表示舍弃多余边距(会丢失信息)。池化用简单传统的2x2大小的模板做maxpooling,取切片中的最大值。占位符:x=tf.placeholder(tf.float32,shape=None,image_size)y_=tf.placeholder(tf.float32,shape=None,labels_count)我们通过为输入图像和目

9、标输出类别创建节点,来开始构建计算图。这里的x和y并不是特定的值,相反,他们都只是一个占位符,可以在TensorFlow运行某一计算时根据该占位符输入具体的值。输入图片x是一个2维的浮点型张量。这里,它的shape为None,784,其中784是一张展平的数字图片的维度。None表示无论输入多少样本数据都可以,在这里作为第一个维度值,用以指代batch的大小,意即x的数量不定。输出类别值y_也是一个2维张量,其中每一行是一个10维的one-hot向量,用于代表对应某一数字图片的类别。第一层卷积:W_convl=weight_variable(5,5,l,32)#即输入图像的厚度由1增加到32b

10、_convl=bias_variable(32)#bias的厚度与weight输出通道数量相同image=tf.reshape(x,-1,image_width,image_height,1)h_conv1=tf.nn.relu(conv2d(image,W_conv1)+b_conv1)#图层的大小为28*28*32h_pool1=max_pool_2x2(h_conv1)#图层的大小为14*14*32第一层卷积层由一个卷积和一个最大池化完成。卷积在每个5x5的patch中算出32个特征。卷积的权重张量形状是5,5,1,32,前两个维度是patch的大小,接着是输入的通道数目,最后是输出的通

11、道数目。而对于每一个输出通道都有一个对应的偏置量。在调用数据前,需要将原图变换为4维:第一维的-1表示数据是黑白的,其第2、第3维对应图片的宽、高,最后一维代表图片的颜色通道数(因为是灰度图所以这里的通道数为1,如果是RGB彩色图,则为3);注意这里的reshape是tf里的属性,而不是numpy里的。第二层卷积:W_conv2=weight_variable(5,5,32,64)#输入图像的厚度由32增加到64b_conv2=bias_variable(64)#bias的厚度与weight相同h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2

12、)#图层的大小为14*14*64h_pool2=max_pool_2x2(h_conv2)#图层的大小为7*7*64第二层卷积切片的patch为5*5大小,输入32个通道,输出64个通道。第一层卷积输出32个通道,第二层卷积输出64个通道,32和64的数值是主观自定义的。全连接层:#第一层全连接层W_fc1=weight_variable(7*7*64,1024)b_fc1=bias_variable(1024)h_pool2_flat=tf.reshape(h_pool2,-1,7*7*64)h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_f

13、c1)#增加dropout,避免过拟合keep_prob=tf.placeholder(tf.float32)h_fcl_drop=tf.nn.dropout(h_fcl,keep_prob)#第二层全连接层W_fc2=weight_variable(1024,labels_count)b_fc2=bias_variable(labels_count)y=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)#训练输出的y为1*10的向量在卷积层之后,首先加入一个有1024个神经元的全连接层,用于处理整个图片。当然,需要先将池化层输出的张量reshap

14、e成1024维(数值1024是主观选择的,无相关控制因素)dropout本质上主要是屏蔽神经元的输出,keep_prob是不屏蔽的比例,例如:每次随机删除20%,那么keep_prob就是0.8代价函数、训练模型、评估模型:#代价函数cross_entropy=-tf.reduce_sum(y_*tf.log(y)#优化函数train_step=tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)#评估模型correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)ac

15、curacy=tf.reduce_mean(tf.cast(correct_prediction,'float')predict=tf.argmax(y,1)注释:为了进行训练,会用更加复杂的AdamOptimizer来做梯度最速下降。tf.argmax(y,1)输出参数指定的维度中的最大值的索引,tf.argmax(y_,1)是实际的标签,通过tf.equal方法可以比较预测结果与实际结果是否相等,输出布尔值。tf.cast将布尔值转换成浮点数,如:True,False,True,True会转换成1,0,1,1,其平均值0.75代表了预测的准确比例定义next_batch函数

16、,以便自动更迭下一个batch的数据样本:epochs_completed=0index_in_epoch=0num_examples=train_images.shape0#servedatabybatchesdefnext_batch(batch_size):globaltrain_imagesglobaltrain_labelsglobalindex_in_epochglobalepochs_completedstart=index_in_epochindex_in_epoch+=batch_sizeifindex_in_epoch>num_examples:# finishede

17、pochepochs_completed+=1# shufflethedataperm=np.arange(num_examples)np.random.shuffle(perm)#np.random.shuffle表示将括号内数组随机打乱train_images=train_imagespermtrain_labels=train_labelsperm# startnextepochstart=0index_in_epoch=batch_size#在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误)end=index_in_epochreturntrain_ima

18、gesstart:end,train_labelsstart:end初始化tensorflow框架的变量:sess=tf.Session()sess.run(tf.initialize_all_variables()注释:Tensorflow依赖于一个更高效的C+后端来进行数值计算,与后端的这个连接叫做sessiono由于来回切换Python内、外环境需要不小的开销,所以我们借助python构建可以在外部运行的计算图,然后在session中启动它,让它在Python外部运行。为了方便下文,也可以写成sess=tf.InteractiveSession(),意味着将自己作为默认构建的sessio

19、n,tensor.eval()和operation.run()就会调用这默认的session训练和评估模型:train_accuracies=validation_accuracies=x_range=foriinrange(training_iterations):batch_xs,batch_ys=next_batch(batch_size)ifi%100=0:train_accuracy=accuracy.eval(session=sess,feed_dict=x:batch_xs,y_:batch_ys,keep_prob:1.0)#如果初始化时是sess=tf.Interactive

20、Session(),那么这句和validation_accuracy里的session=sess就可以省略了validation_accuracy=accuracy.eval(session=sess,feed_dict=x:validation_images0:batch_size,y_:validation_labels0:batch_size,keep_prob:1.0)validation_accuracies.append(validation_accuracy)train_accuracies.append(train_accuracy)x_range.append(i)print

21、('train_accuracy/validation_accuracy=>%.2f/%.2fforstep%d'%(train_accuracy,validation_accuracy,i)sess.run(train_step,feed_dict=x:batch_xs,y_:batch_ys,keep_prob:dropout)一次training_iteration的样本数量就是batch_size的大小,所以i每加1,next_batch函数就作用一次,batch_xs,batch_ys就变更为下一个50的测试样本。WAF?NING:1ensorflow:From

22、:3in,:initialize_all_variables(frandwilllberemovedafter2017-03-02.Instructionsforupdating:Usetf.global_variabjes_initializeriinste日d.train_aGouracy/validation_accuracy=>0/0/0.14forstep0train_accuracy/validationaccuracy=>0.80/0.78forstep1itrain_accuracy/validation_accuracy=>0.94I0.90forstep2

23、itrain_accuracy/validation_accuracy=>0.92/0.88forstep3itrain_aGouracy/validation_accuracy=>0.86I0.92forstep4itrainaccuracy/validationaccuracy=>0.98/0.90forstep5itrain_aGcuracy/validation_accuracy=>0.94I0.94forstep6itrainaccuracy/validationaccuracv=>0.8810.90forsteo7i#训练和验证的准确率,并作图显示if

24、(validation_size):validation_accuracy=accuracy.eval(session=sess,feed_dict=x:validation_images,y_:validationabels,keep_prob:1.0)print('validation_accuracy=>%.4f%validation_accuracy)plt.plot(x_range,train_accuracies,'-b',label='Training')plt.plot(x_range,validation_accuracies,&

25、#39;-g',label='Validation')plt.legend(loc='lowerright',frameon=False)plt.ylim(ymax=1.1,ymin=0.7)plt.ylabel('accuracy')plt.xlabel('step')plt.show()validation_accuracy=>0.9825#导入测试数据test_images=pd.read_csv('D:/test.csv').valuestest_images=test_images.astype(np.float)#对测试数据进行归一化处理,从0:255=>0:1test_imag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论