神經網路提公升mnist識別率

2021-08-09 07:52:03 字數 3167 閱讀 7081

跟著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...