最近正在入坑機器學習,前期以讀代碼為主。買了一本才雲科技鄭澤宇的書,叫做《Tensorflow,實戰Google深度學習框架》,覺得很適合入門的小菜鳥,拿出來跟大家分享下。
下面是第一個完整的訓練神經網絡模型的代碼,里面綜合了作者和我在網上查到的其他人關於代碼的解讀。整理之后如下:
1 #-*-coding:UTF-8-*- 2 import tensorflow as tf 3 #通過numpy工具包生成模擬數據集 4 from numpy.random import RandomState 5 6 #BATCH_SIZE這是定義的一個數量,即一次訓練模型,投入的樣例數,按理說應該是一次投入所有訓練數據的 7 #但是實際操作中一次投入太多數據,會導致電腦死機,因此只好對投入樣例數,進行限制 8 batch_size = 8 9 10 #定義神經網絡的參數:權重w ,stddev=1代表標准差=1,seed隨機數種子,設置后每次產生的數字都相同 11 w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1)) 12 w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1)) 13 14 #我們使用 tf.placeholder() 創建占位符(占位符並沒有初始值,它只會分配必要的內存), 15 #在 session.run()過程中再投遞數據,可以使用 feed_dict 饋送數據。 16 #在shape的一個維度上使用none,不能確定值的形狀時,用None表示 17 x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input") 18 y_= tf.placeholder(tf.float32, shape=(None, 1), name='y-input') 19 20 #定義前向傳播過程 21 a = tf.matmul(x, w1) 22 y = tf.matmul(a, w2) 23 #定義損失函數(交叉熵) 24 #tf.clip_by_value(A, min, max):輸入一個張量A,把A中的每一個元素的值都壓縮在min和max之間。 25 #小於min的讓它等於min,大於max的元素的值等於max。 26 cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 27 #反向傳播算法tf.train.AdamOptimizer實現了Adam算法的優化器(隨機梯度下降算法的擴展式) 28 train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy) 29 30 #生成模擬數據 31 #randomState 函數中數字1,相當於一個seed種子,每次產生的隨機數都是相同的 32 rdm=RandomState(1) 33 #產生一個128行×2列的隨機矩陣 34 X=rdm.rand(128,2) 35 #產生一個布爾型結果矩陣128×1 ,定義規則來給出樣本的標簽。在這里所有x1+x2<1的樣例都被視為正樣本 36 #在這里1代表正樣本,0代表負樣本,大部分的分類問題的神經網絡都采用0和1的表示方法 37 Y=[[int(x0+x1)<1] for(x0,x1)in X] 38 39 #創建一個會話來運行Tensorflow程序,反復運行反向傳播 40 #tf中運行必須放在session對象中,且運行過后,要關閉session 41 with tf.Session()as sess: 42 #初始化變量,也就是上面的Variable變量 43 init_op=tf.initialize_all_variables() 44 sess.run(init_op) 45 # 輸出目前(未經訓練)的參數取值 46 #這里為何還要使用sess.run(w1)來進行操作? 47 #因為此時w1還是個變量,是個對象,直接打印出來是對象的地址 48 print "w1:\n",sess.run(w1) 49 print "w2:\n",sess.run(w2) 50 print "\n" 51 52 # 訓練模型。 53 #設定訓練的輪數 54 STEPS = 5000 55 for i in range(STEPS): 56 #每次選取batch_size個樣本進行訓練 57 start = (i*batch_size) % 128 58 end = (i*batch_size) % 128 + batch_size 59 #通過選取的樣本訓練神經網絡並更新參數 60 sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]}) 61 #每隔一段時間計算在所有數據上的交叉熵並輸出 62 if i % 1000 == 0: 63 total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y}) 64 print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy)) 65 66 # 輸出訓練后的參數取值。 67 print "\n" 68 print "w1:", sess.run(w1) 69 print "w2:", sess.run(w2)