TensorFlow 神經網路MNIST手寫識別

2021-07-30 17:05:43 字數 4628 閱讀 9411

專案稍有停歇,終於有時間來玩一下tensorflow和dl了。看了官網入門教程就先來說說神經網路吧。

神經網路其實是一種演算法,能夠提供給我們一種複雜的非線性模型hw,b(x),並以此來擬合我們的資料。又因為它的構造和處理資訊的模式有點像人類,這讓神經網路更顯得神奇。

神經網路中的引數weight和bias是實現分類和回歸問題中重要的部分。在tensorflow中,tf.variable的作用就是儲存和更新神經網路中的引數。下面來看下tensorflow中是如何生成和初始化變數的。

例子:

weight = tf.variable(tf.random_normal([2, 3], 1, stddev=2, seed=1, name='weight'))
這段**就會產生乙個2x3的矩陣,矩陣中的元素是均值為1,標準差為2,隨機種子為1,別名叫』weight』的隨機數。通過正態分佈的隨機數來初始化神經網路中的引數乙個非常常用的方法。還有一些其他的隨機數生成器。

函式名稱

隨機數分布

主要引數

tf.random_normal

正態分佈

平均值,標準差,取值型別

tf.truncated_normal

正態分佈,當如果隨機出來的值偏離平均值超過2個標準差,那麼這個數將被重新隨機

平均值,標準差,取值型別

tf.random_uniform

平均分布

最小,最大取值,取值型別

tf.random_gamma

gamma分布

形狀引數alpha,尺度引數beta,取值型別

tensorflow也支援通過常數來初始化變數

函式名稱

功能例子

tf.zeros

產生全0陣列

tf.zeros([2,3],int32)==>[[0,0,0],[0,0,0]]

tf.ones

產生全1陣列

tf.ones([2,3],int32)==>[[1,1,1],[1,1,1]]

tf.fill

產生乙個全為給定數字的陣列

tf.fill([2,3],3)==>[[3,3,3,],[3,3,3]]

tf.constant

產生乙個給定常量

tf.constant([1,2,3])==>[1,2,3]

當宣告好變數後必須呼叫初始化語句,並執行

init = tf.global_variables_initializer()

sess = tf.session()

sess.run(init)

第一步:匯入資料,初始化引數

import tensorflow.examples

.tutorials

.mnist

.input_data as input_data

mnist = input_data.read_data_sets("mnist_data/", one_hot=true)

# x 不是乙個特定的值,而是乙個佔位符 placeholder ,我們在tensorflow執行計算時輸入這個值

x = tf.placeholder(tf.float32, [none, 784])

y_ = tf.placeholder(tf.float32, shape=[none, 10]) # 用於輸入標籤真正的值

w = tf.variable(tf.zeros([784, 10])) # 初始化權值w

b = tf.variable(tf.zeros([10])) # 初始化偏置項b

第二步:實現回歸模型(使用前向傳播法獲取**值)

# tf.matmul(x,w) 表示 x 乘以 w ,對應之前等式裡面的wx+b;這裡x是乙個2維張量擁有多個輸入。然後再加上b,把和輸入到 tf.nn.softmax 函式裡面。

y = tf.nn

.softmax(tf.matmul(x, w) + b)

第三步:訓練模型(使用反向傳播更新引數)

為了訓練我們的模型,我們首先需要定義乙個指標來評估這個模型的好壞,它與實際值之間的差異,也可以理解為**的準不准。這個指標可以由乙個成本函式得出,這裡選用交叉熵(cross-entropy)作為成本函式。交叉熵越大說明準確度不夠,反之說明準備度比較準。公式如下:

**如下:

cross_entropy = -tf.reduce_sum(y_ * tf.log(y)  # 求交叉熵
使用梯度下降法來反向傳播更新引數,使交叉熵越來越小

train_step = tf.train

.gradientdescentoptimizer(0.01).minimize(cross_entropy) # 用梯度下降法使得交叉熵最小

第四步:評估模型

# argmax 給出某個tensor物件在某一維上的其資料最大值所在的索引值。由於標籤向量是由0,1組成,因此最大值1所在的索引位置就是類別標籤

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) #檢測我們的**是否真實標籤匹配(索引位置一樣表示匹配)

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # 確定正確**項的比例,我們可以把布林值轉換成浮點數,然後取平均值。

完整**:

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)

x = tf.placeholder(tf.float32, [none, 784]) # x 不是乙個特定的值,而是乙個佔位符 placeholder ,我們在tensorflow執行計算時輸入這個值

y_ = tf.placeholder(tf.float32, shape=[none, 10]) # 用於輸入正確值

w = tf.variable(tf.zeros([784, 10])) # 初始化權值w

b = tf.variable(tf.zeros([10])) # 初始化偏置項b

# tf.matmul(x,w) 表示 x 乘以 w ,對應之前等式裡面的wx+b;這裡 x 是乙個2維張量擁有多個輸入。然後再加上 b ,把和輸入到 tf.nn.softmax 函式裡面。

y = tf.nn

.softmax(tf.matmul(x, w) + b)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) # 求交叉熵

train_step = tf.train

.gradientdescentoptimizer(0.01).minimize(cross_entropy) # 用梯度下降法使得交叉熵最小

# argmax 給出某個tensor物件在某一維上的其資料最大值所在的索引值。由於標籤向量是由0,1組成,因此最大值1所在的索引位置就是類別標籤

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) # 檢測我們的**是否真實標籤匹配(索引位置一樣表示匹配)

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # 確定正確**項的比例,我們可以把布林值轉換成浮點數,然後取平均值。

print(accuracy)

init = tf.global_variables_initializer()

with tf.session() as sess:

sess.run(init)

for i in range(10000): # 訓練階段,迭代1000次

batch_xs, batch_ys = mnist.train

.next_batch(100) # 按批次訓練,每批100行資料

sess.run(train_step, feed_dict=) # 執行訓練

if (i % 50 == 0): # 每訓練100次,測試一次

print("accuracy:", sess.run(accuracy, feed_dict=))

上面的程式實現了mnist手寫識別,雖然是最基本的神經網路,但是也基本上囊括了訓練神經網路的過程,總結一下:

1.定義神經網路結構和前向傳播的輸出結果

2.定義成本函式以及選擇反向傳播的優化演算法

3.生成session並且在訓練集上反覆執行反向傳播優化演算法

無論神經網路結構怎麼變,這3個步驟是不會變的!

Tensorflow卷積神經網路

卷積神經網路 convolutional neural network,cnn 是一種前饋神經網路,在計算機視覺等領域被廣泛應用.本文將簡單介紹其原理並分析tensorflow官方提供的示例.關於神經網路與誤差反向傳播的原理可以參考作者的另一篇博文bp神經網路與python實現.卷積是影象處理中一種...

Tensorflow 深層神經網路

維基百科對深度學習的定義 一類通過多層非線性變換對高複雜性資料建模演算法的合集.tensorflow提供了7種不同的非線性啟用函式,常見的有tf.nn.relu,tf.sigmoid,tf.tanh.使用者也可以自己定義啟用函式.3.1.1 交叉熵 用途 刻畫兩個概率分布之間的距離,交叉熵h越小,兩...

Tensorflow(三) 神經網路

1 前饋傳播 y x w1 b1 w2 b2 import tensorflow as tf x tf.constant 0.9,0.85 shape 1,2 w1 tf.variable tf.random normal 2,3 stddev 1,seed 1 name w1 w2 tf.vari...