跟著tensorflow入門學習構建乙個神經網路提公升mnist識別率,最終提公升到接近1的正確率了,基本參考****,自己打上去順便理解下過程,不懂得地方做了中文標註
# -*- coding:gbk -*-
import input_data
import tensorflow as tf
mnist=input_data.read_data_sets("mnist_data/", one_hot=true)
#新增x作為佔位符
x=tf.placeholder("float", [none, 784])
#正確結果佔位符
y_=tf.placeholder("float", [none,10])
#設定權重函式
defweight_variable
(shape):
#tf.truncated_normal(shape, mean, stddev) :shape表示生成張量的維度,mean是均值,stddev是標準差。這個函式產生正態分佈,均值和標準差自己設定
#權重在初始化時應該加入少量的雜訊來打破對稱性以及避免0梯度
initial=tf.truncated_normal(shape, stddev=0.1)
return tf.variable(initial)
#設定偏置函式
#由於我們使用的是relu神經元,因此比較好的做法是用乙個較小的正數來初始化偏置項,以避免神經元節點輸出恒為0的問題(dead neurons)
defbias_variable
(shape):
initial=tf.constant(0.1, shape=shape)
return tf.variable(initial)
#卷積函式
#卷積使用1步長,0邊距的模板,池化用2x2的模板
defconv2d
(x, w):
#x:待卷積的矩陣具有[batch, in_height, in_width, in_channels]這樣的shape
#w:卷積核具有[filter_height, filter_width, in_channels, out_channels]這樣的shape
#strides:卷積時在影象每一維的步長,這是乙個一維的向量,長度4
return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='same')
#池化函式
#和卷積基本相同
defmax_pool_2x2
(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='same')
#卷積在每個5x5的patch中算出32個特徵。
#卷積的權重張量形狀是[5, 5, 1, 32],前兩個維度是patch的大小,
#接著是輸入的通道數目,最後是輸出的通道數目
w_conv1=weight_variable([5, 5, 1, 32])
b_conv1=bias_variable([32])
#shape:[batch, in_height, in_width, in_channels]
x_image=tf.reshape(x, [-1,28,28,1])
#卷積+偏置,然後給relu啟用函式,最後啟用函式返回值池化
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])
b_conv2=bias_variable([64])
h_conv2=tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)
h_pool2=max_pool_2x2(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])
h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)
#dropout方法減輕過擬合問題
keep_prob=tf.placeholder("float")
h_fc1_drop=tf.nn.dropout(h_fc1, keep_prob)
#softmax層
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))
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=)
print("step %d, training accuracy %g"%(i, train_accuracy))
train_step.run(feed_dict=)
print("test accuracy %g"%accuracy.eval(feed_dict=))
mnist手寫體識別 卷積神經網路
coding utf 8 通過卷積神經網路進行 author elijah 引入資料集 from tensorflow.examples.tutorials.mnist import input data import tensorflow as tf mnist input data.read d...
TensorFlow 神經網路MNIST手寫識別
專案稍有停歇,終於有時間來玩一下tensorflow和dl了。看了官網入門教程就先來說說神經網路吧。神經網路其實是一種演算法,能夠提供給我們一種複雜的非線性模型hw,b x 並以此來擬合我們的資料。又因為它的構造和處理資訊的模式有點像人類,這讓神經網路更顯得神奇。神經網路中的引數weight和bia...
為什麼能用神經網路來執行MNIST識別?
為什麼神經網路能做分類識別 訓練的邏輯 在n x n的網路中,第一次訓練時通過預設的weights和bias處理,輸入x,會得到輸出y.把y和預期的結果做對比,用backpropagation演算法來調整weights和bias.下一次訓練,輸入新的x,處理時用的就是剛才調整過的weights bi...