在神經網路板塊斷斷續續進行了4個月的摸索,逐漸形成了自己對這個領域的認識,寫成部落格一是為了分享自己的觀點,希望不足之處能得到指正;二是作為讀書周記,能督促自己能不要停下來更新部落格,持續學習。好了以下就是我的第一章,用tensorflow搭建乙個簡易的(沒有隱藏層的)神經網路。用tensorflow實現softmax regression識別手寫數字,資料集為mnist
思路:
1)我們在實現手寫識別時,我們首先需要明確輸入(x_input),輸出(y_output)的結構形式,從而確定出輸出輸入層節點和輸出層節點個數。從train set中我們知道,輸入是28*28的矩陣,輸出是0-9即10*1的矩陣,所以輸入節點個數為784,輸出節點個數為10。如下語句:
x = tf.placeholder(tf.float32,[none,784])#none:忽略樣本個數
y_true = tf.placeholder(tf.float32,[none,10])#標籤,none:忽略樣本個數
2)因為我們不涉及隱藏層設計(關於隱藏層將會在cnn章節詳細介紹),所以接下來就要明確biases和weight,在後面關於cnn的介紹中,我將對biases和weight對的具體意義進行闡述。這裡只需要知道,biases和weight是我們做線性回歸擬合曲線時需要的兩個引數,神經網路的學習也就是找出合適的biases和weight,使我們的模型能更好的對已知樣本進行分類,且對新樣本的**有很好的泛化能力。圖示如下!
左邊為784個輸入節點,右邊為10個輸出節點的全連線神經網路,所以可知我們的引數weight的個數為784*784個,但是由於權值共享(關於權值貢獻我在cnn中細說),所以這裡只有784個引數。所以權值weight為784*10的矩陣。矩陣形式滿足:輸入矩陣 * 權值矩陣 = 輸出矩陣 [none,784] * [784,10] = [none,10]; 因為輸出為10維的,所以biases也是10維的所以語句為
w = tf.variable(tf.zeros([784,10])) #權值矩陣
b = tf.variable(tf.zeros([10]))#偏執矩陣
3)然後定義演算法的公式,即神經網路的forwward時的計算 語句為:
y_pre = tf.nn
.softmax(tf.matmul(x,w) + b) #**值,**標籤
這個是用來計算**值的公式,我們將他與標籤值做對比然後通過不斷調整weight和biase來優化模型
4)定義損失函式cost function(tensorflow最厲害將是forward和backward的內容自動實現),只要定義好cost function 訓練時就會自動求導並進行梯度下降,完成對softmax regression的自動學習我們這裡用資訊熵作為cost function ,**如下:
y_true = tf.placeholder(tf.float32,[none,10])#標籤
cross_entropy = tf.reduce_mean(tf.reduce_sum(-y_true * tf.log(y_pre), reduction_indices=[1]))
y_true是我們需要輸入的標籤。
5)指定優化器優化cost function,這裡用傳統的梯度下降演算法即可,學習率選擇0.5
train = tf.train
.gradientdescentoptimizer(0.5).minimize(cross_entropy)
6)迭代對資料進行訓練
for i in range(100):
batch_x,batch_y = mnist.train
.next_batch(100)
sess.run(train,feed_dict=)
7)在test set 或者 validation set 上進行測試,準確率在92%左右。
完整**如下:
import tensorflow as tf
from tensorflow.examples
.tutorials
.mnist import input_data
mnist = input_data.read_data_sets("mnist_data/",one_hot=true)
sess = tf.interactivesession()
x = tf.placeholder(tf.float32,[none,784])
w = tf.variable(tf.zeros([784,10]))
b = tf.variable(tf.zeros([10]))
y_pre = tf.nn
.softmax(tf.matmul(x,w) + b) #**值,**標籤
y_true = tf.placeholder(tf.float32,[none,10])#標籤
cross_entropy = tf.reduce_mean(tf.reduce_sum(-y_true * tf.log(y_pre), reduction_indices=[1]))
train = tf.train
.gradientdescentoptimizer(0.5).minimize(cross_entropy)
tf.global_variables_initializer().run()
for i in range(1000):
batch_x,batch_y = mnist.train
.next_batch(100)
sess.run(train,feed_dict=)
correct_prediction = tf.equal(tf.argmax(y_pre,1),tf.argmax(y_true,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print(accuracy.eval())
總結:明確輸入節點,輸出節點個數;輸入的是所有特徵,輸出的是**標籤;將**標籤和實際輸入的標籤做對比,然後調整權值和偏執,最後得出模型。 基於tensorflow搭建乙個神經網路
一,tensorflow的簡介 tensorflow是乙個採用資料流圖,用於數值計算的 開源軟體庫。節點在圖中表示數字操作,圖中的線 則表示在節點間相互聯絡的多維資料陣列,即張量 它靈活的架構讓你可以在多種平台上展開計算,例 如台式計算機中的乙個或多個cpu 或gpu 伺服器,移動裝置等等。tens...
用tensorflow建造乙個簡單的神經網路
reference 這篇文章主要講怎樣建造乙個完整的神經網路,包括新增神經層,計算誤差,訓練步驟 我們知道乙個神經網路可能包含很多個隱藏層,所以如果我們定義乙個新增層函式,在後面如果需要增加神經層就只需要呼叫我們定義的新增層函式就可以了。神經層裡常見的引數通常有 weights,biases和激勵函...
初識tensorflow,搭建自己的第乙個神經網路
tensorflow的安裝可以參考其他部落格,直接在命令視窗 如果是anaconda的話,就是開啟anaconda prompt就可以了 輸入 pip install tensorflow 命令就可以解決。這樣的話是安裝cpu版本,gpu版本tensorflow安裝可以參考其他的教程。tensorf...