手寫數字識別-卷積神經網絡cnn(06-2)


卷積和池化在深度學習中的作用是對圖像和文本信息提取特征的常用方式,特別是在分類領域

卷積:通過不同的卷積核與圖像或文本數據矩陣 進行矩陣相乘,得到不同特征的若干組訓練特征數據

池化:池化通常有兩種最大池化(max-pooling)和平均池化,最大池化就是在一塊矩陣區域(比如2X2,4個像素點),取最大的那個值作為輸出,平均池化就是取四個像素點的平均值作為輸出值

卷積池化后再加上全連接層,詳細可去搜一下具體介紹,我們直接看代碼,代碼關鍵部分都有注釋。

 

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

#每批次的大小
batch_size = 100
#計算一共有多少批次
n_batch = mnist.train.num_examples // batch_size

#初始化權值
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1) #生成截斷的正態分布
    return tf.Variable(initial)
#初始化偏執值
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)
#卷積層
def conv2d(x, W):
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
#池化層
def max_pool_2x2(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

#定義兩個placeholder
x=tf.placeholder(tf.float32,[None,784]) #28*28
y=tf.placeholder(tf.float32,[None,10])

#改變x的格式轉為4D的向量[batch, in_height, in_width, in_channels]
x_image = tf.reshape(x,[-1,28,28,1])

#初始化第一個卷積層的權值和偏置
W_conv1=weight_variable([5,5,1,32]) #5*5的采樣窗口,32個卷積核從一個平面抽取特征
b_conv1=bias_variable([32]) #每一個卷積核一個偏執值

#把x_image和權重向量進行卷積,再加上偏執值,然后應用於relu激活函數
h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
h_pool1=max_pool_2x2(h_conv1) #進行max-pooling

#初始化第二個卷積層的權重和偏置
W_conv2=weight_variable([5,5,32,64]) #5*5的采樣窗口,64個卷積核從32個平面抽取特征
b_conv2=bias_variable([64]) #每一個卷積核一個偏執值

#把h_pool1和權值向量進行卷積,再加上偏執值,然后應用於relu激活函數
h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
h_pool2=max_pool_2x2(h_conv2)#進行maxpooling

#28*28的圖像第一次卷積后還是28*28,第一次池化后變成14*14,最后得到32張14*14的平面
#第二次卷積后為14*14,第二次池化后為7*7,最后得到64張7*7的平面
#經過上面的操作后得到64張7*7的平面

#初始化第一個全連接的權值
W_fc1=weight_variable([7*7*64,100]) #上一層有7*7*64個神經元,全連接層有1024個神經元
b_fc1=bias_variable([100]) #1024個節點

#把池化層2的輸出扁平化為1維
h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64])
#求第一個全連接層的輸出
h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

#keep_prob用來表示神經元的輸出概率
keep_prob=tf.placeholder(tf.float32)
h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)

#初始化第二個全連接層
W_fc2=weight_variable([100,10])
b_fc2=bias_variable([10])

#計算輸出
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2)+b_fc2)

#交叉墒代價函數
cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
#使用AdamOptimizier進行優化
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

#結果存放在一個布爾列表中
correct_prediction=tf.equal(tf.argmax(prediction,1), tf.argmax(y,1)) #argmax返回一維張量中最大的值所在的位置

#求准確率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(21):
        for batch in range(n_batch):
            batch_xs,batch_ys=mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7})

        acc=sess.run(accuracy,feed_dict={x:mnist.test.images, y:mnist.test.labels,keep_prob:1.0})
        print ("Iter "+str(epoch) + ", Testing Accuracy= " +str(acc))

 

運行效果:  

 

 

目錄:

  1. tensorflow簡介、目錄
  2. tensorflow中的圖(02-1)
  3. tensorflow變量的使用(02-2)
  4. tensorflow中的Fetch、Feed(02-3)
  5. tensorflow版helloworld---擬合線性函數的k和b(02-4)
  6. tensorflow非線性回歸(03-1)
  7. MNIST手寫數字分類simple版(03-2)
  8. 二次代價函數、交叉熵(cross-entropy)、對數似然代價函數(log-likelihood cost)(04-1)
  9. 多層網絡通過防止過擬合,增加模型的准確率(04-2)
  10. 修改優化器進一步提升准確率(04-3)
  11. 手寫數字識別-卷積神經網絡cnn(06-2)
  12. 循環神經網絡rnn與長短時記憶神經網絡簡述(07-2)
  13. 循環神經網絡lstm代碼實現(07-3)
  14. tensorflow模型保存和使用08
  15. 下載inception v3  google訓練好的模型並解壓08-3
  16. 使用inception v3做各種圖像分類識別08-4
  17. word2vec模型訓練簡單案例
  18. word2vec+textcnn文本分類簡述及代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM