Win環境でkeras.utils.plot_model使ってkerasモデルを表示する

# 2022/1/21追記

久しぶりに環境を作ってみたところgraphvizをpipインストールするだけでgraphviz本体もインストールしてくれるようになっていました。また、pydot3が上手く入らなかったのでpydotをインストールしたところ上手く動いたので以下で2022/1/21現在は以下でインストールしてもらうのがよさげです。


```terminal:terminal
pip install pydot, graphviz
```

tensorflow側の挙動は変わってなかったので以下で出る筈です。

```python:python
import tensorflow as tf
if tf.__version__.split('.')[0]=='2':
    from tensorflow import keras
else:
    import keras

# モデルをつくります
inputs = keras.layers.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation='relu')(x)
x = keras.layers.Dropout(0.2)(x)
x = keras.layers.Dense(10, activation=None)(x)
predictions = keras.layers.Activation('softmax')(x)
model = keras.Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# モデルを可視化します
keras.utils.plot_model(model, show_shapes=True, expand_nested=True)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/1216dbf7-a689-c679-e2df-5764a9ab058a.png" width=30%>


# やりたいこと

kerasのモデルを下みたいに表示してくれるkeras.utils.plot_modelをWindows環境で使えるようにします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/1216dbf7-a689-c679-e2df-5764a9ab058a.png" width=30%>

# 試行環境
Windows10
python 3.6

# graphvizのインストール
keras.utils.plot_modelはgraphvizを使用しますが、pipでは入らないのでgraphvizをインストールしておく必要があります。

こちらの手順がとても分かりやすいのでそのままやってみます
http://ruby.kyoto-wu.ac.jp/info-com/Softwares/Graphviz/

#### ダウンロードしてインストールする

まず、graphvizを公式ページからダウンロードします。

graphviz公式
http://www.graphviz.org/
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/f87a76f6-d5ad-60b9-9225-09b494685f1e.png" width=30%>

Downloadページに各OSのページへのリンクがあります。Windowsの場合はStable 2.38 Windows install packagesになります。インストーラーが置いてありますのでダウンロードしてインストールします。

#### PATHを通す

環境変数のPATHにgraphvizのbinフォルダを追加します。今回はgraphviz 2.38を使うのでPATHは以下になります。

```
C:\Program Files (x86)\Graphviz2.38\bin
```
PATHが通ったか確認しておきます。コマンドプロンプトからdot.exeを呼んでみましょう。

```terminal:コマンドプロンプト
c:\> dot -V
dot - graphviz version 2.38.0 (20140413.2041)
```
PATHが通っているのを確認できました。

# python側のpackageをインストールする
pydotではなくpydot3をインストールします。tensorflow2.0.0はpydot3を呼ぶようでpydotでは動きません。pydot, pydot3, pydot-ng, pydotplusなどいろいろあってよく分からないんですが、python3だとpydot3という事なのかな？誰か教えてほしいです。

```terminal:コマンドプロンプト
pip install pydot3
pip install graphviz
```
# モデルを出力してみる

```python:python
import tensorflow as tf
if tf.__version__.split('.')[0]=='2':
    from tensorflow import keras
else:
    import keras

# モデルをつくります
inputs = keras.layers.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation='relu')(x)
x = keras.layers.Dropout(0.2)(x)
x = keras.layers.Dense(10, activation=None)(x)
predictions = keras.layers.Activation('softmax')(x)
model = keras.Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# モデルを可視化します
keras.utils.plot_model(model, show_shapes=True, expand_nested=True)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/1216dbf7-a689-c679-e2df-5764a9ab058a.png" width=30%>
出来ました！

# エラーと原因
ざっくり2つエラーが出る原因があると思います。

以下が出る場合はpython packageのpydotまたはgraphvizが入ってないという意味です。tensorflow2.0はpydot3を呼びますので、pydotではなくpydot3をインストールしてください。

```
Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
```
以下が出る場合はgraphviz本体がインストールされていないかPATHが通っていません。コマンドプロンプトからdot.exe -Vが呼べる場合はこのエラーは出ない筈です。

```
InvocationException: GraphViz's executables not found
```

# 注意点

jupyter notebookでやってる場合、kerasがimportされた時点でpydotとgraphvizもimportされますが、なくてもそのまま進行します。逆に言うとkerasがimportされた時点でpydotとgraphvizがなかったら、その後でインストールしても以下のメッセージは変わりません。

```
Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
```
kernelをrestartしてimport kerasをやり直さないと反映されませんので注意してください。