0基礎深度學習必備程序,tensorflow實現mnist數據集訓練和測試

本文使用tensorflow實現在mnist數據集上的圖片訓練和測試過程,使用了簡單的兩層神經網絡,代碼中涉及到的內容,均以備註的形式標出。

關於文中的數據集,大家如果沒有下載下來,可以到我們社群下載:667950672

下載下來後解壓到F盤mnist文件夾下,或者自己選擇文件存儲位置,然後在下面代碼的相應位置改過來即可。

直接上代碼:

  1. import tensorflow as tf

  2. import numpy as np

  3. #引入input_mnist

  4. from tensorflow.examples.tutorials.mnist import input_data

  5. #加載mnist信息,獲得訓練和測試圖片以及對應標籤

  6. mnist = input_data.read_data_sets('F:/mnist/data/',one_hot =True)

  7. trainimg = mnist.train.images

  8. trainlabel = mnist.train.labels

  9. testimg = mnist.test.images

  10. testlabel = mnist.test.labels

  11. print("MNIST LOAD READY")

  12. #輸入圖片尺寸28*28

  13. n_input =784

  14. #輸出類別數

  15. n_output =10

  16. #初始化權重

  17. weights ={

  18. #卷積層參數,採用高斯初始化

  19. 'wc1':tf.Variable(tf.random_normal([3,3,1,64],stddev =0.1)),

  20. 'wc2':tf.Variable(tf.random_normal([3,3,64,128],stddev=0.1)),

  21. #全連接層參數

  22. 'wd1':tf.Variable(tf.random_normal([7*7*128,1024],stddev=0.1)),

  23. 'wd2':tf.Variable(tf.random_normal([1024,n_output],stddev=0.1))

  24. }

  25. #初始化偏置

  26. biases ={

  27. 'bc1':tf.Variable(tf.random_normal([64],stddev =0.1)),

  28. 'bc2':tf.Variable(tf.random_normal([128],stddev=0.1)),

  29. 'bd1':tf.Variable(tf.random_normal([1024],stddev=0.1)),

  30. 'bd2':tf.Variable(tf.random_normal([n_output],stddev=0.1))

  31. }

  32. #定義前向傳播函數

  33. def conv_basic(_input,_w,_b,_keepratio):

  34. #輸入

  35. #reshape()中的-1表示不用我們指定,讓函數自己計算

  36. _input_r = tf.reshape(_input,shape =[-1,28,28,1])

  37. #CONV1

  38. _conv1 = tf.nn.conv2d(_input_r,_w['wc1'],strides=[1,1,1,1],padding='SAME')

  39. _conv1 = tf.nn.relu(tf.nn.bias_add(_conv1,_b['bc1']))

  40. _pool1 = tf.nn.max_pool(_conv1,ksize =[1,2,2,1],strides =[1,2,2,1],padding='SAME')

  41. #Dropout層既可以使用在全連接層之後,也可以使用在每層之後,這裡在每層之後都加了Dropout

  42. _pool_dr1 = tf.nn.dropout(_pool1,_keepratio)

  43. #CONV2

  44. #conv2d計算二維卷積

  45. _conv2 = tf.nn.conv2d(_pool_dr1,_w['wc2'],strides=[1,1,1,1],padding='SAME')

  46. _conv2 = tf.nn.relu(tf.nn.bias_add(_conv2,_b['bc2']))

  47. _pool2 = tf.nn.max_pool(_conv2,ksize =[1,2,2,1],strides =[1,2,2,1],padding='SAME')

  48. _pool_dr2 = tf.nn.dropout(_pool2,_keepratio)

  49. #向量化 全連接層輸入 得到wd1層的7*7*128的shape 然後轉化為向量

  50. _dense1 = tf.reshape(_pool_dr2,[-1,_w['wd1'].get_shape().as_list()[0]])

  51. #FULL CONNECTION1

  52. _fc1 = tf.nn.relu(tf.add(tf.matmul(_dense1,_w['wd1']),_b['bd1']))

  53. _fc_dr1 = tf.nn.dropout(_fc1,_keepratio)

  54. #FULL CONNECTION2

  55. _out = tf.add(tf.matmul(_fc_dr1,_w['wd2']),_b['bd2'])

  56. #輸出字典

  57. out={'input_r':_input_r,'conv1':_conv1,'pool1':_pool1,'pool1_dr1':_pool_dr1,

  58. 'conv2':_conv2,'pool2':_pool2,'pool_dr2':_pool_dr2,'dense1':_dense1,

  59. 'fc1':_fc1,'fc_dr1':_fc_dr1,'out':_out

  60. }

  61. returnout

  62. print("CNN READY")

  63. a = tf.Variable(tf.random_normal([3,3,1,64],stddev=0.1))

  64. print(a)

  65. a = tf.Print(a,[a],"a: ")

  66. init = tf.global_variables_initializer()

  67. sess = tf.Session()

  68. sess.run(init)

  69. #填充

  70. x = tf.placeholder(tf.float32,[None,n_input])

  71. y = tf.placeholder(tf.float32,[None,n_output])

  72. keepratio = tf.placeholder(tf.float32)

  73. #進行一次前向傳播

  74. _pred = conv_basic(x,weights,biases,keepratio)['out']

  75. #計算損失

  76. cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = _pred,labels=y))

  77. #定義優化器

  78. optm = tf.train.AdamOptimizer(learning_rate =0.001).minimize(cost)

  79. #比較預測的標籤和真實標籤是否一致,一致返回True,不一致返回False

  80. #argmax找到給定的張量tensor中在指定軸axis上的最大值/最小值的位置,0為每一列,1為每一行

  81. _corr = tf.equal(tf.argmax(_pred,1),tf.argmax(y,1))

  82. #True轉化為1 False為0

  83. accr = tf.reduce_mean(tf.cast(_corr,tf.float32))

  84. #每1個epoch保存一次

  85. save_step =1

  86. #max_to_keep最終只保留三組模型,即(12 13 14)

  87. saver = tf.train.Saver(max_to_keep=3)

  88. #控制訓練還是測試

  89. do_train=1

  90. init = tf.global_variables_initializer()

  91. sess = tf.Session()

  92. sess.run(init)

  93. #訓練15個epoch

  94. training_epochs =15

  95. batch_size =16

  96. display_step =1

  97. #訓練過程

  98. if do_train ==1:

  99. for epoch in range(training_epochs):

  100. avg_cost=0.

  101. total_batch =10

  102. #迭代優化

  103. for i in range(total_batch):

  104. batch_xs,batch_ys = mnist.train.next_batch(batch_size)

  105. sess.run(optm,feed_dict ={x:batch_xs,y:batch_ys,keepratio:0.7})

  106. avg_cost += sess.run(cost,feed_dict={x:batch_xs,y:batch_ys,keepratio:1.})/total_batch

  107. #打印信息

  108. if(epoch+1)% display_step ==0:

  109. print("Epoch:%03d/%03d cost:%.9f"%(epoch,training_epochs,avg_cost))

  110. train_acc = sess.run(accr,feed_dict ={x:batch_xs,y:batch_ys,keepratio:1.})

  111. print("Train accuracy:%.3f"%(train_acc))

  112. #保存模型

  113. if epoch % save_step ==0:

  114. saver.save(sess,"F:/mnist/data/model.ckpt-"+str(epoch))

  115. #測試(cpu版本慢的要死 電腦都快要被卡死了...)

  116. if do_train ==0:

  117. #epoch = 15 減1之後即加載第14個模型

  118. epoch = training_epochs-1

  119. #讀取模型

  120. saver.restore(sess,"F:/mnist/data/model.ckpt-"+str(epoch))

  121. #打印測試精度

  122. test_acc = sess.run(accr,feed_dict={x:testimg,y:testlabel,keepratio:1.})

  123. print("test accr is:%.3f"%(test_acc))

  1. print("Optimization Finished")

訓練的部分過程如下:

0基礎深度學習必備程序,tensorflow實現mnist數據集訓練和測試

測試過程如下:

0基礎深度學習必備程序,tensorflow實現mnist數據集訓練和測試

測試時只需修改do_train==0 即可。如果使用Anaconda的spyder的話,記得測試之前先restart kennel一下。

留言快來關注小編吧,我們有最有活力的人工智能深度學習社群。

0基礎深度學習必備程序,tensorflow實現mnist數據集訓練和測試

昂鈦客AI


分享到:


相關文章: