CNN(Convolutional Neural Networks) 卷積神經網絡簡單講就是把一個圖片的數據傳遞給CNN,原涂層是由RGB組成,然后CNN把它的厚度加厚,長寬變小,每做一層都這樣被拉長,最后形成一個分類器

在 CNN 中有幾個重要的概念:
stride,就是每跨多少步抽取信息。每一塊抽取一部分信息,長寬就縮減,但是厚度增加。抽取的各個小塊兒,再把它們合并起來,就變成一個壓縮后的立方體。
padding,抽取的方式有兩種,一種是抽取后的長和寬縮減,另一種是抽取后的長和寬和原來的一樣。
pooling,就是當跨步比較大的時候,它會漏掉一些重要的信息,為了解決這樣的問題,就加上一層叫pooling,事先把這些必要的信息存儲起來,然后再變成壓縮后的層
利用tensorflow搭建CNN,也就是卷積神經網絡是一件很簡單的事情,筆者按照官方教程中使用MNIST手寫數字識別為例展開代碼,整個程序也基本與官方例程一致,不過在比較容易迷惑的地方加入了注釋,有一定的機器學習或者卷積神經網絡制式的人都應該可以迅速領會到代碼的含義。
#encoding=utf-8
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
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') # strides第0位和第3為一定為1,剩下的是卷積的橫向和縱向步長
def max_pool_2x2(x):
return tf.nn.max_pool(x,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME')# 參數同上,ksize是池化塊的大小
x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10])
# 圖像轉化為一個四維張量,第一個參數代表樣本數量,-1表示不定,第二三參數代表圖像尺寸,最后一個參數代表圖像通道數
x_image = tf.reshape(x,[-1,28,28,1])
# 第一層卷積加池化
w_conv1 = weight_variable([5,5,1,32]) # 第一二參數值得卷積核尺寸大小,即patch,第三個參數是圖像通道數,第四個參數是卷積核的數目,代表會出現多少個卷積特征
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
# 第二層卷積加池化
w_conv2 = weight_variable([5,5,32,64]) # 多通道卷積,卷積出64個特征
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
# 原圖像尺寸28*28,第一輪圖像縮小為14*14,共有32張,第二輪后圖像縮小為7*7,共有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]) # 展開,第一個參數為樣本數量,-1未知
f_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1)
# dropout操作,減少過擬合
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(f_fc1,keep_prob)
w_fc2 = weight_variable([1024,10])
b_fc2 = bias_variable([10])
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2)
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv)) # 定義交叉熵為loss函數
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # 調用優化器優化
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
for i in range(2000):
batch = mnist.train.next_batch(50)
if i%100 == 0:
train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})
print "step %d, training accuracy %g"%(i, train_accuracy)
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
print "test accuracy %g"%accuracy.eval(feed_dict={x: mnist.test.images[0:500], y_: mnist.test.labels[0:500], keep_prob: 1.0})
在程序中主要注意這么幾點:
1、維度問題,由于我們tensorflow基于的是張量這樣一個概念,張量其實就是維度擴展的矩陣,因此維度特別重要,而且維度也是很容易使人迷惑的地方。
2、卷積問題,卷積核不只是二維的,多通道卷積時卷積核就是三維的
3、最后進行檢驗的時候,如果一次性加載出所有的驗證集,出現了內存爆掉的情況,由于是使用的是云端的服務器,可能內存小一些,如果內存夠用可以直接全部加載上看結果
4、這個程序原始版本迭代次數設置了20000次,這個次數大約要訓練數個小時(在不使用GPU的情況下),這個次數可以按照要求更改。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。