TensorFlow實現MNIST的卷積神經網路

2021-08-22 07:27:16 字數 3696 閱讀 1610

在此篇部落格中我們將學習使用tensorflow搭建乙個卷積神經網路(cnn)模型,並使用它來訓練mnist資料集。

構建乙個cnn模型需要以下幾個步驟:

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)

trx,try,tex,tey=mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels

接著需要對資料進行處理,我們要把trx和try的shape變成[-1,28,28,1]這裡-1表示不需要考慮輸入影象的數量,28×28是影象的長寬畫素值,1表示影象的通道數(這裡是黑白影象所以為1通道)。**如下:

trx=trx.reshape(-1,28,28,1)

tex=tex.reshape(-1,28,28,1)

x=tf.placeholder('float',[none,28,28,1])

y=tf.placeholder('float',[none,10])

(2) 初始化權重與定義網路。這裡我們將搭建乙個擁有3個卷基層和三個池化層,隨後接1個全連線層和1個輸出層的卷積神經網路。**如下:

#定義權重函式

def init_weights(shape):

return(tf.variable(tf.random_normal(shape,stddev=0.01)))

#初始化權重

w=init_weights([3,3,1,32])#patch大小為3*3,輸入維度1,輸出維度32

w2=init_weights([3,3,32,64])#patch大小為3*3,輸入維度32,輸出維度64

w3=init_weights([3,3,64,128])#patch大小為3*3,輸入維度64,輸出維度128

w4=init_weights([128*4*4,625])#全連線層,輸入128*4*4,是上一層輸出資料三維轉變為1維,輸出維度625

w_o=init_weights([625,10])#輸出層,輸入維度625,輸出維度10(表示10類)

#定義神經網路

def model(x,w,w2,w3,w4,w_o,p_keep_conv,p_keep_hidden):

#定義第一組卷積層和池化層,最後dropout掉一些神經元

l1a=tf.nn.relu(tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='same'))

l1=tf.nn.max_pool(l1a,ksize=[1,2,2,1],strides=[1,2,2,1],padding='same')

l1=tf.nn.dropout(l1,p_keep_conv)

#定義第二組卷積層和池化層,最後dropout掉一些神經元

l2a=tf.nn.relu(tf.nn.conv2d(l1,w2,strides=[1,1,1,1],padding='same'))

l2=tf.nn.max_pool(l2a,ksize=[1,2,2,1],strides=[1,2,2,1],padding='same')

l2=tf.nn.dropout(l2,p_keep_conv)

#定義第三組卷積層和池化層,最後dropout掉一些神經元

l3a=tf.nn.relu(tf.nn.conv2d(l2,w3,strides=[1,1,1,1],padding='same'))

l3=tf.nn.max_pool(l3a,ksize=[1,2,2,1],strides=[1,2,2,1],padding='same')

l3=tf.reshape(l3,[-1,w4.get_shape().as_list()[0]])

l3=tf.nn.dropout(l3,p_keep_conv)

#全連線層,最後dropout掉一些神經元

l4=tf.nn.relu(tf.matmul(l3,w4))

l4=tf.nn.dropout(l4,p_keep_hidden)

#輸出層

pyx=tf.matmul(l4,w_o)

return(pyx)

我們接下來定義dropout的佔位符——keep_conv和keep_hidden,它表示一層中有多少比例的神經元被留下來,這個東西可以有效的避免過擬合問題。然後利用定義的model生成網路模型得到**值,**如下:

p_keep_conv=tf.placeholder('float')

p_keep_hidden=tf.placeholder('float')

py_x=model(x,w,w2,w3,w4,w_o,p_keep_conv,p_keep_hidden)

接下來定義損失函式,這裡採用tf.nn.softmax_cross_entropy_with_logits來比較**值和真值的差異,並做均值處理。定義訓練操作(train_op),這裡採用rmprop演算法的優化器tf.train.rmspropoptimizer,學習率為0.001,衰減值為0.9,使損失減小,**如下:

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

train_op=tf.train.rmspropoptimizer(0.001,0.9).minimize(cost)

predict_op=tf.argmax(py_x,1)

(3) 訓練模型和評估模型

#定義訓練和測試時的批次

batch_size=128

test_size=256

#在會話中啟**,開始訓練和測試

with tf.session() as sess:

tf.global_variables_initializer().run()

for i in range(100):

training_batch=zip(range(0,len(trx),batch_size),

range(batch_size,len(trx)+1,batch_size))

for star,end in training_batch:

sess.run(train_op,feed_dict=)

test_indices=np.arange(len(tex))

np.random.shuffle(test_indices)

test_indices=test_indices[0:test_size]

print(i,np.mean(np.argmax(tey[test_indices],axis=1)==sess.run(predict_op,feed_dict=)))

結果如下(此程式為python3,如果程式報錯可以刪除中文注釋,有時候python程式中不允許出現中文注釋):

tensorflow教程學習三深入MNIST

載入資料 from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets mnist data one hot true 我們使用interactivesession類可以更加靈活地...

Python keras神經網路識別mnist

上次用matlab寫過乙個識別mnist的神經網路,位址在 這次又用keras做了乙個差不多的,畢竟,現在最流行的專案都是python做的,我也跟一下潮流 資料是從本地解析好的影象和標籤載入的。神經網路有兩個隱含層,都有512個節點。import numpy as np from keras.pre...

Python keras神經網路識別mnist

上次用matlab寫過乙個識別mnist的神經網路,位址在 這次又用keras做了乙個差不多的,畢竟,現在最流行的專案都是python做的,我也跟一下潮流 資料是從本地解析好的影象和標籤載入的。神經網路有兩個隱含層,都有512個節點。import numpy as np from keras.pre...