Tensorflowのバージョンを2にアップしたら予想速度が遅くなったので改善するために実施した内容を記載しておきます。
これを問題と考えるか、仕様変更と考えるかは微妙なところかな。
ベースとなる速度測定
colabでMNISTのデータを使ってTensorflow1と2のpredict速度を見てみます。
tensorflow2のほうが2-3倍時間がかかってます。
同じデータ、モデルを使っているにも関わらずtensorflow2にするとパフォーマンスが下がっています。
速度については、googleの状態もあると思うのであくまで「目安」ということで。
tensorflow1.15 | tensorflow2.8 |
0.2779936800000087 | 0.745621589999999 |
原因は何か?
チュートリアルを見ても、予想はpredictで行ってるし、指定しているオプションも影響を与えているようには見えない。
こういう時は、とりあえず公式ドキュメントを読む必要があります。
tf.keras.model.predict
以下のような記載がありました。
predictの処理はバッチ処理で行うので大量データの予測もできるけど、入力データが少ない場合はバッチ処理がボトルネックになる模様。
その場合はpredictで予想するのではなくmodelを使用して予測しなさいということか。
どこまでがsmallなのか良く分からんが多分収まってると思うのでtensorflow2で再度実測してみる。
Computation is done in batches. This method is designed for batch processing of large numbers of inputs. For small numbers of inputs that fit in one batch, directly use __call__() for faster execution, e.g., model(x), or model(x, training=False)
めちゃくちゃ早い。というかtensorflow1より速いんじゃないの。
こういうところもチュートリアルで扱っておくべきだと思うんですよね。
predict | model(x, training=False) |
0.7335773080000081 | 0.08335476600001357 |
予測値は大丈夫か?
早くなったのはいいんですが、チュートリアルに書いておらずドキュメントに「ちょっと」書いてるくらいなので結果は大丈夫なのかという部分が気になりますよね。
次は予測値を見てみます。
predictの場合
[ -3.7139685 -6.2986946 -2.0299964 2.8393102 -12.94842 -3.0600672 -17.860565 12.266244 -6.1799517 -1.6720631]
[-12.792265 5.756531 16.515759 1.5888011 -17.771368 -0.91568977 -8.079978 -16.047636 -5.0575094 -13.378511 ]
[-7.4891434 7.156741 -1.3621305 -3.4815187 -3.7936823 -3.984666 -3.284366 -0.8118116 -2.1395054 -5.173973 ]
[10.276918 -7.656104 1.2446342 -5.3817415 -4.2292 -4.3134503 -0.48161146 -3.7149622 -5.8856645 -0.17537576]
model(x, training=False)の場合
[ -3.7139685 -6.2986946 -2.0299964 2.8393102 -12.94842 -3.0600672 -17.860565 12.266244 -6.1799517 -1.6720631]
[-12.792265 5.756531 16.515759 1.5888011 -17.771368 -0.91568977 -8.079978 -16.047636 -5.0575094 -13.378511 ]
[-7.4891434 7.156741 -1.3621305 -3.4815187 -3.7936823 -3.984666 -3.284366 -0.8118116 -2.1395054 -5.173973 ]
[10.276918 -7.656104 1.2446342 -5.3817415 -4.2292 -4.3134503 -0.48161146 -3.7149622 -5.8856645 -0.17537576]
うん、一緒。
予測値としても問題無いですね。
注意点として、model(x, training=False)で予測した場合の戻り値がnumpyのような配列ではなくテンソルで返ってきます。
tf.Tensor([ -3.7139685 -6.2986946 -2.0299964 2.8393102 -12.94842 -3.0600672 -17.860565 12.266244 -6.1799517 -1.6720631], shape=(10,), dtype=float32)
このままだと使いにくいので、戻り値を「result」とかで受けたのであれば「result = result.numpy()」という形で配列に変更した方が使いやすいです。