Mask R-CNNの続き
修士研究で植生の検出をするために、matterport社のMask R-CNNを使ってインスタンスセグメンテーションを実装しています。
他にもエラー記事をまとめているのでご覧下さい。
AttributeError: module 'tensorflow' has no attribute 'log' を解決した話。
AttributeError: 'Model' object has no attribute 'metrics_tensors' が発生しました。
準備が終わり、以下のプログラムを実行していざ学習をさせようとすると…
model.train(dataset_train, dataset_val,
learning_rate=config.LEARNING_RATE,
epochs=40,
augmentation=augmentation,
layers='heads')
AttributeError: 'Model' object has no attribute 'metrics_tensors'
このようなエラーが発生してしまいます。
早速、解決していきましょう。
解決方法1:kerasのダウングレード
お馴染み、githubの質問コーナーに同様のトラブルが記載されていました。
kerasを2.0.8にダウングレードすれば良さそうです。
しかし、ダウングレードによって他のコードでもエラーが発生する危険性があり、いたちごっこになりそうだったので、私は解決方法2・3を試しました。
解決方法2:keras_model.metrics.append(loss)に書き換え
前にも紹介しましたが、このエラーはmodel.pyに書かれているコードが古いことに起因しています。
Ctrl+Fで検索することで該当箇所を見つけ、kerasの新バージョンに対応するコードに書き換えました。
self.keras_model.metrics.append(loss)
結果、エラーは解消!学習を進めることが出来ました!
一件落着!と、思いきや…何かがおかしい!
Epoch 1/20 105/105 [==============================] - 1146s 11s/step - loss: 2.8658 - val_loss: 2.2283
本来ならば、rpn_class_loss等が計算されるはずなのに、計算されているlossは2種類だけなのです。
これを解決するためには解決方法3を試す必要があります。
<参考>Mask R-CNNで計算されるlossについての解説はこちら
loss function #1111
解決方法3:keras_model.add_metric(loss,name)に書き換え
を見てみたところ、もう一つの解決方法が紹介されていました。
先程同様、model.pyの該当部分を以下のように書き換えます。
self.keras_model.add_metric(loss,name)
すると、エラーを発生させずに、かつ他のlossも計算させることができました!
(実行結果は追い追い更新します…)
まとめ
まとめると、自分が今悩んでいることは、以前地球上の誰かも悩んでいたと踏んでいるので、
他にもMask R-CNNでのエラーが発生したらgithub Issuesを見てみて下さい!
日本語でヒットしないものでも、英語ではヒットすることが多くあるので、英語の重要性をひしひしと感じますね~
一件落着です!
参考になればいいね!お願いします~