前提・実現したいこと
Python + TensorFlow + Kerasで機械学習をしています。
データセットにはtf.data.Datasetを使用しています。
実現したいのは以下のとおりです。
tf.data.Dataset
から「入力画像」「教師ラベル」「画像ID」を取り出すtf.keras.Model
のpredict()
に「入力画像」を与え、予測結果を得る- 予測結果と「教師ラベル」を比較し、不一致であれば「画像ID」をファイル出力する
tf.data.Dataset
が空になるまで、1.~3.を繰り返す。
発生している問題
当初は、tf.Session
のrun()
を繰り返し実行することで、上記の1.~3.を行う実装にしていました。
しかし、predict()
の結果が意図せぬ不規則な値となってしまいました。
やむをえず、すべてのデータに対してpredict()
を呼び出し、予測結果のリストを作成(loop 1)したあと、再びすべてのデータから「教師ラベル」と「画像ID」のリストを作成(loop 2)し、予測結果のリストと「教師ラベル」のリストを比較する、という陳腐な実装になってしまっています(下記ソースコード参照)。
以上を踏まえてのご質問です。機能としては一応実現できているのですが、下記コードをよりスマートに書き換えることはできないでしょうか?
具体的には、
- データセットに対するループは1回にしたい
- ループの中で予測結果と「教師ラベル」の比較を行いたい
- ループの中で「画像ID」のファイル出力を行いたい
といったところです。
可能であれば、コード例も合わせてご教示いただけると幸いです。
以上よろしくお願いいたします。
該当のソースコード
python
1model = tf.keras.models.load_model('model.h5') 2 3iterator = dataset.make_one_shot_iterator() 4image, label, id = iterator.get_next() 5 6try: 7 while True: # loop 1 8 pred = model.predict(image, steps=1) 9 pred_array = numpy.append(pred_array, pred) 10except tf.errors.OutOfRangeError: 11 pass 12 13with tf.Session() as sess: 14 try: 15 while True: # loop 2 16 ret = sess.run([label, id]) 17 label_array = numpy.append(label_array, ret[0]) 18 id_array = numpy.append(id_array, ret[1]) 19 except tf.errors.OutOfRangeError: 20 pass 21 22output_id_list(id_array[label_array != pred_array])
試したこと
- loop 2 に
predict()
を含めるパターンは、正しい予測結果が得られなかった。
predict()
の内部でもrun()
を呼んでいるから?
- loop 1に
run()
を含めるパターンは、データセットを正しくイテレーションできず、
先頭のデータが常に返ってきてしまった。
補足情報
software | version |
---|---|
python | 3.6.6 |
TensorFlow | 1.10.0 |
Keras | tf.keras |
あなたの回答
tips
プレビュー