mnist的卷積神經(jīng)網(wǎng)絡(luò)例子和上一篇博文中的神經(jīng)網(wǎng)絡(luò)例子大部分是相同的。但是CNN層數(shù)要多一些,網(wǎng)絡(luò)模型需要自己來構(gòu)建。
程序比較復(fù)雜,我就分成幾個部分來敘述。
首先,下載并加載數(shù)據(jù):
1
2
3
4
5
|
import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets( "MNIST_data/" , one_hot = True ) #下載并加載mnist數(shù)據(jù) x = tf.placeholder(tf.float32, [ None , 784 ]) #輸入的數(shù)據(jù)占位符 y_actual = tf.placeholder(tf.float32, shape = [ None , 10 ]) #輸入的標簽占位符 |
定義四個函數(shù),分別用于初始化權(quán)值W,初始化偏置項b, 構(gòu)建卷積層和構(gòu)建池化層。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#定義一個函數(shù),用于初始化所有的權(quán)值 W def weight_variable(shape): initial = tf.truncated_normal(shape, stddev = 0.1 ) return tf.Variable(initial) #定義一個函數(shù),用于初始化所有的偏置項 b def bias_variable(shape): initial = tf.constant( 0.1 , shape = shape) return tf.Variable(initial) #定義一個函數(shù),用于構(gòu)建卷積層 def conv2d(x, W): return tf.nn.conv2d(x, W, strides = [ 1 , 1 , 1 , 1 ], padding = 'SAME' ) #定義一個函數(shù),用于構(gòu)建池化層 def max_pool(x): return tf.nn.max_pool(x, ksize = [ 1 , 2 , 2 , 1 ],strides = [ 1 , 2 , 2 , 1 ], padding = 'SAME' ) |
接下來構(gòu)建網(wǎng)絡(luò)。整個網(wǎng)絡(luò)由兩個卷積層(包含激活層和池化層),一個全連接層,一個dropout層和一個softmax層組成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#構(gòu)建網(wǎng)絡(luò) x_image = tf.reshape(x, [ - 1 , 28 , 28 , 1 ]) #轉(zhuǎn)換輸入數(shù)據(jù)shape,以便于用于網(wǎng)絡(luò)中 W_conv1 = weight_variable([ 5 , 5 , 1 , 32 ]) b_conv1 = bias_variable([ 32 ]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) #第一個卷積層 h_pool1 = max_pool(h_conv1) #第一個池化層 W_conv2 = weight_variable([ 5 , 5 , 32 , 64 ]) b_conv2 = bias_variable([ 64 ]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) #第二個卷積層 h_pool2 = max_pool(h_conv2) #第二個池化層 W_fc1 = weight_variable([ 7 * 7 * 64 , 1024 ]) b_fc1 = bias_variable([ 1024 ]) h_pool2_flat = tf.reshape(h_pool2, [ - 1 , 7 * 7 * 64 ]) #reshape成向量 h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) #第一個全連接層 keep_prob = tf.placeholder( "float" ) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) #dropout層 W_fc2 = weight_variable([ 1024 , 10 ]) b_fc2 = bias_variable([ 10 ]) y_predict = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) #softmax層 |
網(wǎng)絡(luò)構(gòu)建好后,就可以開始訓(xùn)練了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
cross_entropy = - tf.reduce_sum(y_actual * tf.log(y_predict)) #交叉熵 train_step = tf.train.GradientDescentOptimizer( 1e - 3 ).minimize(cross_entropy) #梯度下降法 correct_prediction = tf.equal(tf.argmax(y_predict, 1 ), tf.argmax(y_actual, 1 )) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float" )) #精確度計算 sess = tf.InteractiveSession() sess.run(tf.initialize_all_variables()) for i in range ( 20000 ): batch = mnist.train.next_batch( 50 ) if i % 100 = = 0 : #訓(xùn)練100次,驗證一次 train_acc = accuracy. eval (feed_dict = {x:batch[ 0 ], y_actual: batch[ 1 ], keep_prob: 1.0 }) print 'step %d, training accuracy %g' % (i,train_acc) train_step.run(feed_dict = {x: batch[ 0 ], y_actual: batch[ 1 ], keep_prob: 0.5 }) test_acc = accuracy. eval (feed_dict = {x: mnist.test.images, y_actual: mnist.test.labels, keep_prob: 1.0 }) print "test accuracy %g" % test_acc |
Tensorflow依賴于一個高效的C++后端來進行計算。與后端的這個連接叫做session。一般而言,使用TensorFlow程序的流程是先創(chuàng)建一個圖,然后在session中啟動它。
這里,我們使用更加方便的InteractiveSession類。通過它,你可以更加靈活地構(gòu)建你的代碼。它能讓你在運行圖的時候,插入一些計算圖,這些計算圖是由某些操作(operations)構(gòu)成的。這對于工作在交互式環(huán)境中的人們來說非常便利,比如使用IPython。
訓(xùn)練20000次后,再進行測試,測試精度可以達到99%。
完整代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
# -*- coding: utf-8 -*- """ Created on Thu Sep 8 15:29:48 2016 @author: root """ import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist = input_data.read_data_sets( "MNIST_data/" , one_hot = True ) #下載并加載mnist數(shù)據(jù) x = tf.placeholder(tf.float32, [ None , 784 ]) #輸入的數(shù)據(jù)占位符 y_actual = tf.placeholder(tf.float32, shape = [ None , 10 ]) #輸入的標簽占位符 #定義一個函數(shù),用于初始化所有的權(quán)值 W def weight_variable(shape): initial = tf.truncated_normal(shape, stddev = 0.1 ) return tf.Variable(initial) #定義一個函數(shù),用于初始化所有的偏置項 b def bias_variable(shape): initial = tf.constant( 0.1 , shape = shape) return tf.Variable(initial) #定義一個函數(shù),用于構(gòu)建卷積層 def conv2d(x, W): return tf.nn.conv2d(x, W, strides = [ 1 , 1 , 1 , 1 ], padding = 'SAME' ) #定義一個函數(shù),用于構(gòu)建池化層 def max_pool(x): return tf.nn.max_pool(x, ksize = [ 1 , 2 , 2 , 1 ],strides = [ 1 , 2 , 2 , 1 ], padding = 'SAME' ) #構(gòu)建網(wǎng)絡(luò) x_image = tf.reshape(x, [ - 1 , 28 , 28 , 1 ]) #轉(zhuǎn)換輸入數(shù)據(jù)shape,以便于用于網(wǎng)絡(luò)中 W_conv1 = weight_variable([ 5 , 5 , 1 , 32 ]) b_conv1 = bias_variable([ 32 ]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) #第一個卷積層 h_pool1 = max_pool(h_conv1) #第一個池化層 W_conv2 = weight_variable([ 5 , 5 , 32 , 64 ]) b_conv2 = bias_variable([ 64 ]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) #第二個卷積層 h_pool2 = max_pool(h_conv2) #第二個池化層 W_fc1 = weight_variable([ 7 * 7 * 64 , 1024 ]) b_fc1 = bias_variable([ 1024 ]) h_pool2_flat = tf.reshape(h_pool2, [ - 1 , 7 * 7 * 64 ]) #reshape成向量 h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) #第一個全連接層 keep_prob = tf.placeholder( "float" ) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) #dropout層 W_fc2 = weight_variable([ 1024 , 10 ]) b_fc2 = bias_variable([ 10 ]) y_predict = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) #softmax層 cross_entropy = - tf.reduce_sum(y_actual * tf.log(y_predict)) #交叉熵 train_step = tf.train.GradientDescentOptimizer( 1e - 3 ).minimize(cross_entropy) #梯度下降法 correct_prediction = tf.equal(tf.argmax(y_predict, 1 ), tf.argmax(y_actual, 1 )) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float" )) #精確度計算 sess = tf.InteractiveSession() sess.run(tf.initialize_all_variables()) for i in range ( 20000 ): batch = mnist.train.next_batch( 50 ) if i % 100 = = 0 : #訓(xùn)練100次,驗證一次 train_acc = accuracy. eval (feed_dict = {x:batch[ 0 ], y_actual: batch[ 1 ], keep_prob: 1.0 }) print ( 'step' ,i, 'training accuracy' ,train_acc) train_step.run(feed_dict = {x: batch[ 0 ], y_actual: batch[ 1 ], keep_prob: 0.5 }) test_acc = accuracy. eval (feed_dict = {x: mnist.test.images, y_actual: mnist.test.labels, keep_prob: 1.0 }) print ( "test accuracy" ,test_acc) |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/denny402/p/5853538.html