MNIST在TensorFlow中的實現及解釋摘要

2021-09-25 03:36:35 字數 2565 閱讀 7632

交叉熵及其在tensorflow中的表示

回歸問題一般用均方誤差作成本函式,

而對於分類問題,常用的成本函式是交叉熵(cross-entropy),定義為

其中y是我們**的概率分布,y』是實際的分布。

交叉熵可以看做反映**不匹配的指標,或者說該指標反映實際情況出乎預料的程度。注意交叉熵是非對稱的。在tensorflow中,交叉熵表示為下面的**:

cross_entropy = -tf.reduce_sum (y_ * tf.log (y))

因為交叉熵一般會與softmax回歸一起使用,所以tensorflow對這兩個功能進行了統一封裝,並提供了tf.nn.softmax_cross_entropy_with_logits函式。可以直接通過下面的**來實現使用了softmax回歸之後的交叉熵函式。注意與公式中的y不同,**中的y是softmax函式呼叫前的值。最後呼叫tf.reduce_mean函式取平均值,因為是批量傳入的,針對每張會計算出乙個交叉熵。

y = tf.matmul (x, w) + b

cross_entropy = tf.reduce_mean (tf.nn.softmax_cross_entropy_with_logits (labels = y_, logits = y))

優化器及訓練

tensorflow

支援多種不同的優化器,比較常用的優化方法有三種:

tf.train.gradientdescentoptimizer

tf.train.adamoptimizer

tf.train.momentumoptimizer 如:

train_step = tf.train.gradientdescentoptimizer (0.01).minimize (cross_entropy)

現在我們開始訓練模型,迭代1000次。注意會話物件執行的不是w、b也不是y,而是train_step。

for i in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100)

sess.run (train_step, feed_dict = )

該迴圈的每個步驟中,我們都會隨機抓取訓練資料中的100個批處理資料點,然後我們用這些資料點作為引數替換之前的佔位符來執行train_step操作。

argmax

在numpy中有個非常有用的函式argmax,它能給出陣列中最大元素所在的索引值。tensorflow中也有類似的argmax函式。

correct_prediction = tf.equal (tf.argmax(y,1), tf.argmax(y_,1))

accuracy = tf.reduce_mean (tf.cast(correct_prediction, "float"))

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

conv2d說明

tensorflow中,tf.nn.conv2d函式實現卷積層前向傳播的演算法。這個函式的前兩個引數分別表示輸入資料x和權重w,均為4個維度的張量,如前所述。權重在初始化時應該加入少量的雜訊來打破對稱性以及避免0梯度,這裡我們用tf.truncated_normal函式生成的隨機量填充。函式的隨後兩個引數定義卷積的方式,包括過濾器在影象上滑動時移動的步長及填充方式。

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

# 這裡使用tf.reshape函式校正張量的維度,-1表示自適應

x_image = tf.reshape (x, [-1, 28, 28, 1])

w_conv1 = tf.variable (tf.truncated_normal ([5, 5, 1, 32], stddev = 0.1))

h_conv1 = tf.nn.relu (tf.nn.conv2d(x_image, w_conv1, strides = [1, 1, 1, 1], padding = 'same') + b_conv1)

conv2d的第乙個引數是我們的樣本,一般是[batch, height, width, channels]這樣的格式,batch是我們的樣本數量,也是我們訓練mini batch的時候的block size。 height和width是的長和寬,channels是顏色通道的數量。

第二個引數是引數矩陣(在dnn中也就是引數w),這是乙個4維矩陣,前兩個維度是過濾器的大小,上面我們使用5*5的過濾器,第三個維度是我們的樣本資料一共有多少個顏色通道,因為我們用的mnist資料是灰度而非是rgb, 所以只有乙個顏色通道,第三個維度是1。 最後乙個維度是我們要使用多少個過濾器,這裡我們使用的是32個過濾器。 所以在這裡我們的引數是5*5*1*32個引數。

input_data中的read_data_sets方法

樣本數量過大,一次性讀入記憶體是不行的。所以引入mini batch,一次只訓練batch size個樣本。

2000輪訓練的cnn使用gpu只用了11秒。 速度快的飛起

詳見:《一文讀懂tensorflow基礎 》

MNIST手寫數字識別 tensorflow

神經網路一半包含三層,輸入層 隱含層 輸出層。如下圖所示 現以手寫數字識別為例 輸入為784個變數,輸出為10個節點,10個節點再通過softmax啟用函式轉化為 值。如下,準確率可達0.9226 import tensorflow as tf from tensorflow.examples.tu...

在jupyter中使用tensorflow的方法

由於tensorflow是另乙個虛擬環境,需要重灌jupyter notebook 首先由於我是後來重灌過anaconda,所以將原envs資料夾下的tenorflow直接複製到了新的envs,測試後可以匯入,沒有報錯 然後開啟anaconda prompt 就可以啟用tensorflow環境了 a...

在linux環境下安裝tensorflow

2.執行命令 pip install tensorflow gpu 1.0.0 cp27 none linux x86 64.whl ypi 4.在linux 下gpu版本需要安裝cuda,cudnn 4.1安裝cuda 2.執行命令安裝 sudo sh cuda 8.0.27 linux.run ...