TensorFlow::Estimatorでモデル改変の際はCPの削除を忘れるな!

やあ子供たち。TensorFlowやってるか。みんな使ってるとかいっても独学はなかなか簡単ではないなーというのがおじさんの感想なんだけど、まー面白いと思えるところまではきたのでなんとか頑張っているよ。

さてさて、最近おじさんは自作のとある機械学習サンプルを実装していて気づいたのだけど、でね、これはEstimatorを使っている話ですので注意して下さい。まー今日のこれタイトルなー。わかってる人にはもう当たり前なんだと思うんだけどおじさんみたく周りに誰も聞ける人がいなくて、独学で、ググりだけできてますみたいな感じだとほんと苦労してたどり着いた内容なんだよね。さて本題に入ろう。
Estimatorを使っていて、train()とかの引数で指定する、ニューラルネットの構造を作成するためのユーザー指定関数、(cnn_mnist.pyの本家サンプルではmodel_fnなどとされているやつ)の中で、まさにdenseだとか、conv2dだとか使ってニューラルネットの構造を記述する場所があると思うんだが、そこの構成を変えると、以下のようなエラーが出てきて、

InvalidArgumentError (see above for traceback): 
Assign requires shapes of both tensors to match. 
lhs shape= [5,7] rhs shape= [5,3]

ま、こうなるとコード変えたのがいかんかったのかなー、もとの構成に戻すと大丈夫だしなー、でも構成変えようとするとエラー出るなー。まだまだ俺も勉強が足りないな、いやしかし間違ってないはず、、なんてね。こんなの真面目に考えてたらほんといろいろ調べちゃうし、勉強しちゃうし、それはそれでいんだろうけど、エラーはなくならなくて、気力が尽きそうになってしまうんですよ。
でまあ、もちろんね、このエラーの文字列で検索すれば、同じことで困ってる質問と回答があるにはあるんだけど、なかなかそうなって理解するまで時間かかっちゃったので、メモしておくぞ。

これはね、このエラーはどういうことかというとここに書いてある話なんですね。
そう。Estimatorというものは、そのコンストラクター呼ぶときに、モデル情報のログを書き出すパスを指定するようになっていて、これがログというか、チェックポイントと呼ばれるものがここに書き出されるわけで、これが実は、普通ログの出力先なんてまずはどうでもいいが適当に出力させておけって感じなのだが、そうじゃないと。どうでもよくないし適当ではうまく動かないのだと。なぜならこれが相当無視できない感じの情報になっていて。
Estimatorの、train(),evaluate(),predict()を使う限り、これはそのプログラムで実行された学習結果とかが、必ずここに出力される感じになっており、しかも、ここが一番タチの悪い点なのだが、次回にこれら関数がよばれるときは、まずはここからこれまでの学習結果をロードしてきてくれちゃうらしいのです!なので、上述のエラーは、「これまでと、そもそもニューラルネットの形が違います」といってきているのは、このチェックポイントなるものから読み込んだニューラルネット構造との不整合を言ってきているというわけだったようです。
んー、まわかってしまえばそれだけのことで、これがいやだったら、一つ方法としては、プログラムの実行の都度、事前にそのログ出力先のフォルダを削除してから、実行する、ということをやればいいようだね。
っていうことがあったりで、どうも、Estimatorなんてのは使わなくてもよさそうなアプローチがありそうなんで、そういうとこを次は勉強してみっかな、という気には前からなってたのだけど、その思いをさらに強くしてくれる今回の一件だったんだなと思ってます。
では今日はこの辺で。チャオ!


___________________