TensorflowでConv2Dを使うとNo algorithm worked!になってしまう時の対処法

公開:2020/12/09
更新:2020/12/09
2 min読了の目安(約2000字TECH技術記事

Kerasを使ってディープラーニングの勉強をしようとしていたところ、CNNを使った学習ができなくなって困ってた話。
根本的に何がだめなのか全くわからないが、一応なんとかなったのでメモ。

環境:

Tensorflow GPUをDockerで動かしている。
GPU: Geforce 1660 Super
CPU: Ryzen 3700X
Host OS: Ubuntu 20.04
Docker Version: 20.10.0
Docker Image: tensorflow/tensorflow:2.4.0rc3-gpu-jupyter(03f19a53cd23)

環境構築はこちらを見て、ホスト側にnvidia-docker2とcuda-driversはインストール済み。

ブラウザからDocker内のJupyter(localhost:8888)にアクセスして使っています。

エラー再現

PythonとKerasによるディープラーニング(François Chollet著)

https://www.amazon.co.jp/PythonとKerasによるディープラーニング-Francois-Chollet/dp/4839964262/ref=asc_df_4839964262_nodl/?tag=jpgo-22&linkCode=df0&hvadid=295719984664&hvpos=&hvnetw=g&hvrand=11255739717063869305&hvpone=&hvptwo=&hvqmt=&hvdev=t&hvdvcmdl=&hvlocint=&hvlocphy=1009309&hvtargid=pla-527433566355&psc=1&th=1&psc=1

5.1のMNISTをCNNで学習させるコードでエラーが出ます。具体的には

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)

model.fit()で、以下のエラーが発生します。

NotFoundError:  No algorithm worked!
	 [[node sequential/conv2d/Conv2D (defined at <ipython-input-7-68f402c82258>:4) ]] [Op:__inference_train_function_993]

コード全文はこちら。

http://nbviewer.jupyter.org/github/fchollet/deep-learning-with-python-notebooks/blob/master/5.1-introduction-to-convnets.ipynb
ソースコード中のimport kerasの部分はimport tensorflow.kerasに書き換えました

解決方法

TensorflowのGitHubにIssueが上がってました。
参考になったのはこちらのコメント

https://github.com/tensorflow/tensorflow/issues/43174#issuecomment-730959541

以下を先頭に追加

from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession

config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)

先頭にこの数行を追加すると無事model.fit()を実行してもエラーが出なくなりました。
理由はよくわかっていないが、とりあえず動きます。