1. 程式人生 > >《一個影象復原例項入門深度學習&TensorFlow—第三篇》在TensorFlow中進行深度學習的流程

《一個影象復原例項入門深度學習&TensorFlow—第三篇》在TensorFlow中進行深度學習的流程

1. TensorFlow的基本使用

這裡直接看官方文件的介紹:http://www.tensorfly.cn/tfdoc/get_started/basic_usage.html
我貼出最重要的內容(先看看,慢慢的就理解了):
使用 TensorFlow, 你必須明白 TensorFlow:
1. 使用圖 (graph) 來表示計算任務.
2. 在會話 (Session) 中執行圖(graph)
3. 使用 tensor 表示資料.
4. 通過 變數 (Variable) 維護狀態.
5. 使用 feed 和 fetch 可以為任意的操作(arbitrary operation) 賦值或者從其中獲取資料.

2. 在TensorFlow中進行深度學習的主要流程

這裡我直接貼出一份python虛擬碼來介紹:

# 首先:匯入各種你需要的包 tensorflow numpy...
import tensorflow as tf
import model # 匯入自己定義的包,這樣可以精簡程式碼
# import any pkg if you need
# 構建計算圖
# 1.從訓練集和測試集中獲取mini-batch
Train_Images_Batch,Train_Labels_Batch = input_Data.get_batch(......)
Test_Images_Batch,Test_Labels_Batch = input_Data.get_batch(......)

# 2.定義存放mini-batch的佔位符
x = tf.placeholder(......)
y_label = tf.placeholder(......)

# 3.前向傳播計算網路輸出(model.py檔案中的inference函式定義了我們的網路結構)
y_conv = model.inference(x)

# 4.計算實際輸出和理論輸出之間的均方誤差
loss = tf.reduce_mean(tf.square(y_conv - y_label))

# 5.利用tensorflow自帶的尋優演算法來優化網路引數,使得loss最小,1e-4是學習率
train_op = tf.train.AdamOptimizer(1e-4).minimize(loss)

# 6.初始化所有的區域性和全域性變數
init_op = (tf.local_variables_initializer(),tf.global_variables_initializer())

# 在會話(Session)中執行建立好的計算圖
# 1.開啟一個Session
with tf.Session() as sess: 
# 2.變數初始化
    sess.run(init_op)      

# 3.開始訓練,每個step取出一個mini-batch作為網路的輸入,訓練網路
#   每一次訓練都會使得網路中可學習引數的值向使得loss更小的方向變化一些
#   這裡訓練100000步,也就是引數要向使得loss更小的方向調整10000次,最終達到收斂
    for step in range(100000): 

# 4.產生這一step輸入網路的mini-batch
        train_images_batch,train_labels_batch = sess.run([Train_Images_Batch,Train_Labels_Batch]) 

# 5.將mini-batch餵給網路入口,x和y_label
        sess.run(train_op,feed_dict = {x:train_images_batch,y_label:train_labels_batch})

# 6.網路訓練結束,現在使用網路。將測試資料輸入網路,計算網路輸出值,與實際輸出對比,評價網路
test_images_batch,test_labels_batch = sess.run([Test_Images_Batch,Test_Labels_Batch])
y_pred = sess.run(y_conv,feed_dict = {x:test_images_batch})

3. 總結

TensorFlow將我們的很多繁瑣的程式碼工作都省去了,我們只需要專注於整理輸入資料,構建自己的網路(也就是定義前向傳播過程),選擇損失函式,然後在Session中反覆將不同的mini-batch輸入網路,程式就能自動調整我們所定義網路的中的可學習引數,使得網路輸出與實際輸出之間的差異變小,訓練結束後,對於類似的輸入,網路能夠直接輸出令人滿意的結果。
小到我們即將處理的這個簡單的影象復原例項,大到AlphaGo這種複雜的東東,大致都是這樣一個過程,只是處理的資料不同,評價loss的方式不同,網路結構不同而已。當我們處理完這個例項之後,對於其它問題,你也只需要更換不同的訓練資料,選擇不同的loss評價方法,定義不同的網路結構罷了。所以真是一招鮮吃遍天啊,學習成本真的不高。
下一篇就直接開始流程中的第一步獲取訓練資料

,我個人認為是最總要的一步。