TensorFlow创建DeepDream网络
TensorFlow創建DeepDream網絡
Google 于 2014 年在 ImageNet 大型視覺識別競賽(ILSVRC)訓練了一個神經網絡,并于 2015 年 7 月開放源代碼。
該網絡學習了每張圖片的表示。低層學習低級特征,比如線條和邊緣,而高層學習更復雜的模式,比如眼睛、鼻子、嘴巴等。因此,如果試圖在網絡中表示更高層次的特征,會看到從原始 ImageNet 中提取的不同特征的組合,例如鳥的眼睛和狗的嘴巴。
考慮到這一點,如果拍攝一張新的圖片,并嘗試最大化與網絡高層的相似性,那么結果會得到一張新的視覺體驗的圖片。在這張新視覺體驗的圖片中,由高層學習的一些模式如同是原始圖像的夢境一般。下圖是一張想象圖片的例子:
圖 1 Google Deep Dreams 的示例
準備工作
從網上下載預訓練的 Inception 模型(https://github.com/martinwicke/tensorflow-tutorial/blob/master/tensorflow_inception_graph.pb)。
具體做法
-
導入 numpy 進行數值計算,functools 定義一個或多個參數已經填充的偏函數,Pillow 用于圖像處理,matplotlib 用于產生圖像:
-
設置內容圖像和預訓練模型的路徑。從隨機噪聲的種子圖像開始:
-
以 graph 的形式加載從網上下載的 Inception 網絡。初始化一個 TensorFlow 會話,用 FastGFile(…) 加載這個 graph,并用 ParseFromstring(…) 解析該 graph。之后,使用 placeholder(…) 方法創建一個占位符作為輸入。 imagenet_mean 是預先計算的常數,這里的內容圖像減去該值以實現數據標準化。事實上,這是訓練得到的平均值,規范化使得收斂更快。該值將從輸入中減去并存儲在 t_preprocessed 變量中,然后用于加載 graph 定義:
-
定義一些 util 函數來可視化圖像,并將 TF-graph 生成函數轉換為常規 Python 函數(請參閱下面的示例):
-
計算圖像的梯度上升值。為了提高效率,應用平鋪計算,其中在不同的圖塊上計算單獨的梯度上升。通過多次迭代對圖像應用隨機偏移以模糊圖塊的邊界:
-
定義用來減少輸入層均值的優化對象。通過考慮輸入張量,該梯度函數可以計算優化張量的符號梯度。為了提高效率,圖像被分割成幾塊,然后調整大小并添加到塊數組中。對于每個塊,使用 calc_grad_tiled 函數:
- 加載特定的內容圖像,并開始想象。在這個例子中,作者的臉被轉化成類似于狼的模樣:
圖 2 深度轉換的例子,其中一個作者變成了狼
解讀分析
神經網絡存儲訓練圖像的抽象描述:較低層存儲線條和邊緣等特征,較高層存儲較復雜的圖像特征,如眼睛、臉部和鼻子。通過應用梯度上升過程,這里使損失函數最大化并促使發現類似于由較高層記憶的圖案的內容圖片模式。這樣網絡就生成了令人致幻的圖片。
總結
以上是生活随笔為你收集整理的TensorFlow创建DeepDream网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VGG16迁移学习实现
- 下一篇: TensorFlow文本情感分析实现