Tensorflow で Deep Dream

#今回の内容
Deep Learning で Deep Dream してみようという企画。
Deep Dreamってなんですか？という意見があると思いますが手っ取り早く説明すると "画像合成" です。
もう少し具体的に言うと以下のような感じです。
（１）事前に合成に使用する画像とその特徴を学習させる
（２）その後，適当な画像を入力する
（３）その画像内に事前学習させた画像と似た特徴を持つ部分に対して画像を合成する
＃間違ってたら訂正お願いします。

今回は事前学習した Deep Neural Network を利用する内容になっています。
前置きはこれぐらいにして早速説明に入りましょう。

#元ネタたち
以下の動画とソースコードの内容に沿って取り組んでいきます。

- 元ネタ動画：YouTubeの[この動画](https://www.youtube.com/watch?v=MrBzgvUNr4w&t=152s&fbclid=IwAR2yd9DtU3RuPufmOfuefxwhZSKQ2doLfhnbwMUe8QBXIVGKtsq9Dr-jr5k)

- 元ネタソースコード：YouTube動画から移動した先の[このソースコード](https://github.com/llSourcell/deep_dream_challenge/blob/master/deep_dream.py)

#実行環境
- MacOS 10.13.1
- Python 3.6.5：Anaconda-Navigatorと一緒にインストールされる？
- Anaconda-Navigator 1.8.7 でインストールするパッケージたち
 - spyder：デバッグしながら実行する場合。硬派な方は Terminal で実行を！
 - TensorFlow 1.10.0：言わずと知れた Machine Learning のパッケージ
 - numpy 1.15.2：データの取り込みやTensorFlowの計算時に利用
 - pillow 6.1.0(PIL)：画像ファイルを取り込むときに利用
 - matplotlib 3.1.0：処理結果を表示するのに利用

#ソースコード
修正したソースコードは[こちら](https://github.com/WaterIsland/DLStudy/blob/master/tensorflow/source/deepdream/deep_dream.py)

ざっくり修正点は以下の通り。細かな修正に関しては完全に私の趣味の世界なので興味があれば確認してみてください。
##Step 0 の追加

```python:deep_dream.py
#Step 0 - download image file from repository of 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/tutorials/deepdream'
    image_url = 'https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/pilatus800.jpg?raw=true'
    image_name = 'pilatus800.jpg'
#    local_image_file = os.path.join(data_dir, image_name)
    if not os.path.exists(image_name):
        # Download
        model_url = urllib.request.urlretrieve(image_url, image_name)
```

上記のようにTensorFlow本家のレポジトリから画像ファイルをダウンロードする処理を追加しました。
**自分で用意した画像ファイルを使いたいときは，上記内容をすべて削除して以下の記述だけにしてください。**

```python:deep_dream.py
    image_name = 'あなたが利用したい画像ファイルのパス'
```

##Step 1 の修正

```python:deep_dream.py
        # Download
        #model_url = urllib.request.urlopen(url, local_zip_file)
        model_url = urllib.request.urlretrieve(url, local_zip_file)
```

ファイルをダウンロードする処理が間違っていたので修正。

#Deep Dream の実行
（１）Anaconda-Navigator で spyder を起動
<img width="750" alt="スクリーンショット 2019-08-19 21.49.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/4fda8e53-b278-934b-e51e-930e55e6a632.png">

（２）[ソースコード](https://github.com/WaterIsland/DLStudy/blob/master/tensorflow/source/deepdream/deep_dream.py)をコピペ
<img width="811" alt="スクリーンショット 2019-08-19 21.56.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/382ef970-499d-a25f-4b73-714c4b2caa95.png">

（３）実行する
右下のスペースに以下のような画像が，ちょっとずつ変化しながら３〜４個ぐらい表示されるはず。
<img width="381" alt="スクリーンショット 2019-08-19 22.00.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/9bb1c288-9624-9dbf-a66f-1f2155d56c78.png">
Terminal で実行すると画像が大きめなので確認しやすい。
<img width="576" alt="スクリーンショット 2019-08-19 21.59.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143341/88e832cd-2056-83e3-652a-5593ccb7ed02.png">

#終わりに
今回は既存の学習結果を利用した体験を提供しました。
合成結果をみるとナイトメアな様相でトラウマを植え付けられるかもしれませんが，こんなことできるんですよ，ということを知っておくことが大切です。

自然言語に触れていた身としては Doc2Vec とか Word2Vec とか textgen を試したいところですが，GPUがないので気の遠くなるような時間との戦いです。
＃　一回試して２日ほったらかしても終わってなかった。。。

ということでブルジョアな方は是非TensorFlow対応のGPUを購入するか，冴えてる方は　Theano とか　Chainer とかを試してみてください。