1. 程式人生 > >完整神經網路樣例程式

完整神經網路樣例程式

1.訓練神經網路解決二分類問題

import tensorflow as tf

#numpy是一個科學計算的工具包,這裡通過Numpy工具包生成模擬資料集
from numpy.random import RandomState

#定義訓練資料batch的大小
batch_size = 8

#定義神經網路的引數
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))
#tf.random_normal([2,3], stddev=2)會產生一個2x3矩陣,矩陣中的元素是均值為0、標準差為1的隨機數。
#在shape的一個維度上使用None可以方便使用不同batch大小。 #在訓練時需要把資料分成比較小的batch,但是在測試時,可以一次性使用全部的資料。 #當資料集比較小時這樣比較方便測試,但資料集比較大時,將大量資料放入一個batch可能會導致記憶體溢位 x = tf.placeholder(tf.float32, shape=(None, 2), name='x_input') y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y_input') #定義神經網路前向傳播的過程 a = tf.matmul(x, w1) y =
tf.matmul(a, w2) #定義損失函式和反向傳播的演算法 cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) train_step = tf.train.AdagradOptimizer(0.001).minimize(cross_entropy) #通過隨機數產生一個模擬資料集 rdm = RandomState(1) dataset_size = 128 X = rdm.rand(dataset_size, 2) #定義規則來給出樣本的標籤。在這裡x1+x2<1的樣例都被認為是正樣本(比如零件合格),而其他為負樣本(比如零件不合格)
#在這裡使用0表示負樣本,1表示正樣本。大部分分類問題的神經網路都會採用0和1的表示方法。 Y = [[int(x1+x2<1)] for (x1, x2) in X] #建立一個會話來執行tensorflow程式 with tf.Session() as sess: init_op = tf.initialize_all_variables() #初始化變數 sess.run(init_op) print (sess.run(w1)) print (sess.run(w2)) #設定訓練的輪數 STEPS = 5000 for i in range(STEPS): #每次選取batch_size個樣本進行訓練 start = (i * batch_size) % dataset_size end = min(start+batch_size, dataset_size) #通過選取的樣本訓練神經網路並更新引數 sess.run(train_step, feed_dict={x: X[start:end], y_:Y[start:end]}) if i % 1000 == 0: #每隔一段時間計算所有資料上的交叉shuang並輸出 total_cross_entropy = sess.run(cross_entropy, feed_dict={x:X, y_:Y}) print ("After %d training steps, cross entropy on all data is %g"%(i,total_cross_entropy)) print (sess.run(w1)) print (sess.run(w2))

2.訓練神經網路的過程總結 從上面的程式可以總結出訓練神經網路的過程可以分為以下3個步驟:

1.定義神經網路的結構和前向傳播的的輸出結果。
2.定義損失函式以及選擇反向傳播優化的演算法。
3.生成會話(tf.Session)並且在訓練資料上反覆執行反向傳播優化演算法。

無論神經網路的結構如何變化,這3個步驟是不變的。