開源|如何用Tensorflow實現LeCun老師論文:《超過均方誤差的深度多規模視頻預測》
文章來源:Github 翻譯:馬卓奇
如何生成對抗式視頻預測
該項目使用生成對抗網路來對視頻進行預測,詳細內容請參考論文《超過均方誤差的深度多規模視頻預測》,作者Mathieu, Couprie & LeCun。官方代碼(使用Torch實現)可以在這裡找到。
鏈接:coupriec/VideoPredictionICLR2016
論文地址:[1511.05440] Deep multi-scale video prediction beyond mean square error
對抗式生成使用兩個網路,一個生成器和一個鑒別器,來改進生成圖像的清晰度。給出視頻的前四幀,生成器會學習如何對下一幀生成準確的預測。給出一張生成的或一張真實圖片,鑒別器會學習如何正確區分生成圖片和真實圖片。兩個網路會進行「競爭」,生成器要嘗試讓鑒別器將它所生成的圖片判斷成真實的圖片。這會驅使生成器產生與真實幀在域內的樣子非常相近的仿造幀。
結果和對比
我在吃豆小姐遊戲的幀序列資料庫上訓練並測試了我的網路。為了對比對抗式訓練和非對抗式訓練的結果,我在生成器和鑒別器上訓練了對抗式網路,進行了500000次迭代,非對抗式網路進行了1000000次迭代(由於非對抗式網路的運行速度大約是對抗式網路的兩倍)。每個網路的訓練時間大概是24小時,運行環境為GTX 980TI GPU。
在下面的例子中,我用64幀圖片進行遞歸運行網路。(即用於生成第一幀的輸入是【輸入1,輸入2,輸入3,輸入4】,用於生成第二幀的輸入是【輸入2,輸入3,輸入4,生成1】,以此類推)。由於網路沒有原始遊戲的動作輸入,它不能預測太多真實的動作(例如吃豆小姐會朝哪個方向轉彎)。所
以,我們的目標不是讓它和真實圖片達到完美一致,而是保持一種乾淨利落,與真實世界相似的表示。下面的示例展示了非對抗式網路能夠多快就變得模糊並且失去小幽靈的顯示。而對抗式網路雖然也出現了一定程度的這種現象,但是在整個視頻序列中至少能保持清晰的表示一些小幽靈這一點上,對抗式網路要好得多。
從這個示例可以看出,對抗式網路能夠在吃豆小姐進行多次轉彎時依然保持清晰的顯示,而非對抗式網路則不能做到這一點。
儘管對抗式網路在清晰性和連貫性上明顯優於非對抗式網路,但非對抗性網路卻產生了一些有趣的,引人注意的錯誤:
使用論文中介紹的誤差測量方法(峰值信噪比和銳差)不能顯示出對抗式訓練和非對抗式訓練的顯著差別。我認為這是因為吃豆小姐遊戲資料庫的幀序列中大部分像素都沒有變化,而論文原文是在真實的視頻上訓練的,也就意味著幀內的大部分內容都會發生變化。儘管如此,對抗式訓練在生成幀的清晰度上產生了質的提高,這一點是很顯然的,尤其時間跨度較長的視頻上效果更明顯。可以通過在該項目的根目錄運行tensorboard --logdir=./Results/Summaries/ 來查看損失和誤差數據。
該如何運行
1 複製或下載repo
2 準備數據:
·如果想復現我的結果,可以在這裡下載吃豆小姐資料庫:https://drive.google.com/open?id=0Byf787GZQ7KvV25xMWpWbV9LdUU。默認行為是把下載的數據放在項目的根目錄下,文件路徑命名為Data/。否則你需要特別說明你的數據位置,參考第3、4部分的設置說明。
·如果你想在自己的視頻上進行訓練,要對視頻進行預處理,讓他們成為如下結構的幀序列(命名或圖像格式都不重要,結構才是最重要的)
- Test
- Video 1
- frame1.png
- frame2.png
- frame ...
- frameN.png
- Video ...
- Video N
- ...
- Train
- Video 1
- frame ...
- Video ...
- Video N
- frame ...
處理訓練數據
網路是在輸入圖像的隨機選取的32x32像素塊上進行訓練的,輸入圖像經過篩選,確保大多數圖像的內容都有變化。要把你的輸入數據處理成這樣的格式,需要在Code/目錄下運行腳本pythonprocess_data,並且進行如下設置:
-n/--num_clips= <# 需要處理的訓練剪裁圖像> (默認值 = 5000000)
-t/--train_dir= <所有訓練幀的存儲路徑>
-c/--clips_dir= <處理過的圖像的存儲路徑>
(我建議將它設置為隱藏路徑這樣文件系統不會因為文件太多而凍結,不要ls這個路徑!)
-o/—overwrite (在clips目錄下覆蓋之前的數據)
-H/--help (顯示用法)
這一步可能要花費幾個小時來完成,取決於你想要多少圖像塊。
訓練、測試
如果你想讓吃豆小姐資料庫即插即用,你可以在這裡下載我訓練好的模型:https://drive.google.com/open?id=0Byf787GZQ7KvR2JvMUNIZnFlbm8。
下載需要使用-l設置。
(例如,python avg_runner.py -l./Models/Adversarial/model.ckpt-500000)
在Code/目錄下運行python avg_runner.py來對你的網路進行訓練以及測試,並且進行如下
設置:
-l/--load_path= <保存模型的相對路徑>
-t/--test_dir= <測試圖像目錄>
-r--recursions= <# 測試的遞歸預測>
-a/--adversarial= <{t/f}> (是否使用對抗式訓練. 默認為是)
-n/--name= < ../Data/Save/*/ 的子目錄,保存該程序的結果>
-O/--overwrite (覆蓋模型所有之前的數據)
-T/--test_only (只進行測試)
-H/--help (顯示幫助)
--stats_freq= <顯示損失或訓練誤差統計表的頻率, in # steps>
--summary_freq= <存儲損失或誤差概要的頻率, in # steps>
--img_save_freq= <存儲生成圖像的頻率, in # steps>
--test_freq= <在測試數據上測試模型的頻率, in # steps>
--model_save_freq= <存儲模型的頻率,in # steps>
常見問題及解決辦法
為什麼不在大於32x32的圖像塊上訓練?為什麼不對整張圖訓練?
原因是顯存使用量。由於鑒別器在卷積後有全連接層,最後一層卷積的輸出必須轉換成一維的數據來連接到全連接層的第一層。該輸出的大小取決於輸入圖像的大小,並且會快速的爆炸式增長。(例如,對於輸入大小為64x64,從128個特徵圖到有512個節點的全連接層,你的網路會有64x64x128x512= 268,435,456 個權重值)。由於這個原因,在比32x32大的塊上進行訓練會導致內存溢出(至少在我的配置下是這樣的)。
幸運的是,只是在訓練階段才需要鑒別器,並且生成器網路是全卷積的,所以你可以用任何大小的圖像來測試你在32x32 的圖像塊上訓練的權重。(這也就是為什麼我生成的視頻可以覆蓋整個吃豆小姐遊戲的界面)
點擊閱讀原文跳轉Github資源
熱門文章推薦
重磅|IEEE:以色列Eyesight-Tech提供"CV安全副駕"降低交通事故死亡率
重磅|痛失吳恩達後 百度在矽谷建第二家人工智慧研發機構欲再招150名AI科學家!
重磅|IEEE發布了最新的世界頂級機器人視頻集錦,不看你會後悔
最新|2017年全球top50機器人公司,大疆僅排第⑨名!
最新|Yann LeCun昨天在清華都講了什麼?(附精彩視頻)
重磅|百度AI負責人吳恩達(Andrew Ng)宣布將從百度辭職
Google發布Distill平台:欲搭建機器學習生態系統
開源|2017 CVPR(Oral Paper):多目標實時體態估測 項目開源
重磅|IBM和萬達簽訂戰略合作協議 助推Watson在華落地
重磅|Google發布新開源圖像演算法工具Guetzli:壓縮35%的圖片大小仍保證高質量
推薦閱讀:
※SCI論文寫作之Experimental section(一)
※No.31- 貝佐斯逆向思維在科研中的運用
※SCI論文中如何描述物理吸脫附實驗結果?
※SCI論文寫作之Results & Discussion(二):句與句之間的邏輯!
TAG:TensorLayer深度学习库 | 学术论文 | 深度学习DeepLearning |