Tensorflow之nn 簡單神經網路學習
阿新 • • 發佈:2019-02-05
最近在深入研究深度學習,關於機器學習的基本知識就略過不說了,在深度學習裡面,一些概念性的東西還是很好理解的,重點是如何利用已有的知識去構建一個合適解決實際問題的模型,然後用各種小trick去把引數調優。
試水階段,為了訓一個簡單的二分類問題,搭了一個兩層的神經網路
這裡是不加bias的簡單模型
def init_weight(shape):
return tf.Variable(tf.random_normal(shape, stddev=0.01))
def model(X, w_h, w_o):
h = tf.nn.sigmoid(tf.matmul(X, w_h))
return tf.matmul(h, w_o)
注意tensorflow的結構是先構圖(模型)再訓練,所以需要先將圖中的變數和結點宣告清楚:
X = tf.placeholder("float", [None, 36])
Y = tf.placeholder("float", [None, 2])
w_h = init_weight([36, 16])
w_o = init_weight([16, 2])
py_x = model(X, w_h, w_o)
predict_op = tf.argmax(py_x,1)
cost = tf.reduce_mean(tf.nn.softmax _cross_entropy_with_logits(py_x, Y))
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)
X為訓練樣本,Y為訓練標籤,w_h, w_o為模型中的引數。cost是交叉熵代價,可以設定不同的代價函式。train_op是訓練過程中的下降梯度(參考概念back-propagation),當然有不同的下降方法可以使用,0.05是學習速率,這也是個很重要的引數。
模型和變數構建完之後,就可以開始訓練了,需要啟動session:
with tf.Session() as sess:
tf.initialize_all_variables().run ()
for i in range(1000):
for start, end in zip(range(0, len(trX), 128), range(128, len(trX)+1, 128)):
sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]})
accu = np.mean(np.argmax(teY, axis=1) == sess.run(predict_op, feed_dict={X:teX}))
可以手動設定訓練1000此停止,也可以根據validation accuracy的變化情況決定何時停止。trX,trY,teX,teY分別為載入資料後的訓練集(樣本,標籤)和測試集(樣本,標籤)。可以通過觀察測試集的準確率調整模型訓練引數,也可以觀察訓練集準確率、代價函式(cost)等。詳細的除錯經驗研究之後再更新。