TF階段性小總結(前向傳播/反向傳播)

TF階段性小總結(前向傳播/反向傳播)

來自專欄 TensorFlow學習之路

話不多說,直接上代碼:

#coding:utf-8#兩層簡單神經網路(全連接)#tf3_3.pyimport tensorflow as tfimport os #只顯示warning和erroros.environ["TF_CPP_MIN_LOG_LEVEL"]=2#定義輸入和參數x = tf.constant([[0.7,0.5]])w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))#定義前向傳播過程a = tf.matmul(x,w1)y = tf.matmul(a,w2)#用會話計算結果with tf.Session() as sess: init_op = tf.global_variables_initializer() sess.run(init_op) print ("x in tf3_3.py is :
",sess.run(x)) print ("w1 in tf3_3.py is :
",sess.run(w1)) print ("a in tf3_3.py is :
",sess.run(a)) print ("w2 in tf3_3.py is :
",sess.run(w2)) print ("y in tf3_3.py is :
",sess.run(y))

  • 使用了os來降低顯示信息的級別
  • 如果參數是「1」的話,則顯示所有的信息
  • 如果參數是「2」的話,則只顯示error和warning
  • 如果參數是「3」的話,則只顯示error

這裡的標題是<兩層簡單神經網路(全連接)>,之前在接觸CNN的時候有接觸過關於全連接的概念,但是那個時候還是不太懂,參考了以下博客,感覺有了一定程度的理解:

對於全連接層的理解 - CSDN博客?

blog.csdn.net圖標

之前接觸CNN的時候,就只是一直覺得全連接那一層那麼那麼多東西,亂七八糟的不知道是什麼,根據博主所說:

連接層實際就是卷積核大小為上層特徵大小的卷積運算,卷積後的結果為一個節點,就對應全連接層的一個點。

假設最後一個卷積層的輸出為7×7×512,連接此卷積層的全連接層為1×1×4096。

連接層實際就是卷積核大小為上層特徵大小的卷積運算,卷積後的結果為一個節點,就對應全連接層的一個點。如果將這個全連接層轉化為卷積層:

1.共有4096組濾波器

2.每組濾波器含有512個卷積核

3.每個卷積核的大小為7×7

4.則輸出為1×1×4096

但是其實標題中的全連接指的是全連接神經網路,示意圖如下所示:

最簡單的全連接神經網路

在tf3_3.py中,我們只定義了前向傳播過程,在神經網路的實現過程中一個很重要的步驟是搭建NN結構,從輸入到輸出(先搭建計算圖,再用會話執行),那麼前向傳播是什麼呢?

前向傳播就是搭建模型的計算過程,讓模型具有推理能力,可以針對一組輸入給出相應的輸出


第二段代碼:

#tf3_4.pyimport tensorflow as tfx = tf.placeholder(tf.float32,shape=(1,2))w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))a = tf.matmul(x,w1)y = tf.matmul(a,w2)with tf.Session() as sess: init_op = tf.global_variables_initializer() sess.run(init_op) print ("y in tf3_4.py is:
",sess.run(y,feed_dict={x:[[0.7,0.5]]}))

這段代碼與上一段的代碼的主要區別在於將原本為constant類型的x設置為了placeholder的形式,因為在實際應用中,我們需要一次喂入一組或者多組的輸入,讓神經網路輸出y,那麼我們就可以先用tf.placehloder給輸入x佔位,如果一次喂一組數據那麼在shape的第一維位置寫1,第二個位置看有幾個輸入特徵(比如需要輸入的特徵有體積和重量兩種方式,那麼就是兩個輸入特徵)。如果一次想喂入多組數據,那麼在shape的第一維位置就要寫None表示先空著。第二維位置寫有幾個輸入特徵,這樣在feed_dict中就可以喂入若干組輸入特徵了。


第三段代碼:

#coding:utf-8#導入模塊,生成模擬數據集#tf3_5.pyimport tensorflow as tfimport numpy as np BATCH_SIZE = 8seed = 23455#基於seed產生隨機數rng = np.random.RandomState(seed)#隨機數返回32行2列的矩陣,表示32組體積和重量作為輸入數據集X = rng.rand(32,2)#從X這個32行2列的矩陣中 取出一行 判斷如果和小於1 給Y賦值1 如果和不小於1 給Y賦值0#作為輸入數據集的標籤(正確答案)Y = [[int(x0 + x1 <1)] for (x0,x1) in X]print ("X:
",X)print ("Y:
",Y)#定義神經網路的輸入、參數和輸出,定義前向傳播過程x = tf.placeholder(tf.float32,shape=(None,2))y_ = tf.placeholder(tf.float32,shape=(None,1))w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))a = tf.matmul(x,w1)y = tf.matmul(a,w2)#定義損失函數及反向傳播方法loss = tf.reduce_mean(tf.square(y-y_))#train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss)train_step = tf.train.AdamOptimizer(0.001).minimize(loss)#生成會話,訓練STEPS輪with tf.Session() as sess: init_op = tf.global_variables_initializer() sess.run(init_op) #輸出目前(未經訓練)的參數取值 print ("w1:
",sess.run(w1)) print ("w2:
",sess.run(w2)) print ("
") STEPS = 3000 for i in range(STEPS): start = (i*BATCH_SIZE)%32 end = start+BATCH_SIZE sess.run(train_step,feed_dict={x: X[start:end], y_: Y[start:end]}) if i%500 == 0: total_loss = sess.run(loss,feed_dict={x:X,y_:Y}) print("After %d training step(s),loss on all data is %g"%(i,total_loss)) print ("
") print ("w1:
",sess.run(w1)) print ("w2:
",sess.run(w2))

在這段代碼中,我們就可以看到反向傳播的過程,那麼反向傳播是什麼呢:

反向傳播:訓練模型參數,在所有參數上用梯度下降,使神經網路模型在訓練數據上的損失函數最小

這裡涉及到一個損失函數的概念

損失函數:計算得到的預測值y與已知答案y_的差距

損失函數的計算有很多方法,均方誤差MSE是比較常用的方法之一

均方誤差:求前向傳播計算結果與已知答案之差的平方再求平均

反向傳播訓練方法有很多種,都是以減小loss值為優化目標,有梯度下降、momentum優化器、adam優化器等優化方法,關於這幾種優化方法的概述,在前面的博客里有具體描述

想做好多事的hzp:TF學習之旅(二)?

zhuanlan.zhihu.com圖標

在優化器中都需要一個叫做學習率的參數,如果學習率選擇過大會出現震蕩不收斂的情況,如果學習率選擇過小,會出現收斂速度慢的情況。


至此,一個簡單神經網路就可以大概搭建出來了,總結一下搭建神經網路的八股:

  1. 導入模塊,生成模擬數據集

import tensorflow as tf<常量定義><生成數據集>

2.前向傳播:定義輸入、參數和輸出

x = y_ =w1 = w2 = a = y =

3.反向傳播:定義損失函數、反向傳播方法

loss = train_step =

4.生成會話,訓練STEPS輪

with tf.session() as sess: Init_op = tf.global_variables_initializer() sess_run(init_op) STEPS = 3000 for i in range(STEPS): start = end = sess.run(train_step,feed_dict:)

推薦閱讀:

隨鹿晗之後,王俊凱竟然公開了女朋友,竟然是她!
一周男星著裝丨襯衫搭長褲,過度最合適,但我卻愛上了王俊凱這件牛仔夾克
王俊凱、馬天宇、張彬彬清爽出街,原來男神們的春裝都愛穿這些!
王俊凱聲討《高能少年團》,除了不當剪輯,人才流失、創新不足才是浙江衛視的真·病症

TAG:易烊千璽 | 王俊凱 | 王源 |