現在、tfコードをtfrecordsとtfdatasetに移行しています。私のアプリケーションでは、トレーニングされたモデルは通常、すべてのトレーニングサンプルを見るずっと前に収束します。したがって、私は通常、データジェネレーターの長さを、1つのエポックに収めたいバッチの数に設定し、ジェネレーターで、次のエポックで、ジェネレーターが前のエポックの最後のサンプルの後にピックアップするようにします。これにより、すべてのコールバックが希望どおりに機能し(特に早期停止)、各エポックで見えないデータを使用してモデルをトレーニングできます。
tfデータセットとtfrecordsを使用してこの動作を実現するにはどうすればよいですか?tensorflow Githubのデータセット定義を読みましたが、これが可能かどうかはわかりません。
私が設定した場合、これには2つの可能な解決策があると思いますsteps_per_epoch
:
しかし、私もその方法がわかりません。ですから、これについて何か洞察があれば、私は非常に感謝します。
今のところ、常に1つのエポックでトレーニングしてから、新しいtfrecordファイルで新しいデータセットを初期化するというエレガントでない回避策を使用できますが、特にコールバックに関しては、より良い方法があることを願っています。
あなたが何を達成しようとしているのか完全に理解できているかわかりません。あなたはあれが欲しい:
それでおしまい?
私の観点からは、steps_per_epoch
議論はあなたの最善の策です。たとえば、100個のアイテム(サンプルまたはバッチ)を含むデータセットがあり、steps_per_epoch=20
それを設定した場合、最初のエポックでモデルに0から19のアイテムが表示され、2番目のエポックで20から39のアイテムが表示されます。コードのどの部分も上書きする必要はありません。
データセットの動作を模倣しようとすることは、おそらく良い考えではありません(注意することが多すぎる、多くの(ハードな)作業が必要です)。
最後の段落から、各エポックに特定のTFRecordファイルからのデータをフィードする必要があることを理解しています。多分あなたは見ることができますtf.data.Dataset.flat_map
。TFRecordファイル(同じファイルが複数回表示される可能性があります)のリストを作成し、その上に「flat_map
」を作成TFRecordDataset
します。
files = tf.data.Dataset.from_tensor_slices([
"file1.tfrecord", "file2.tfrecord",
"file1.tfrecord", "file3.tfrecord"
])
dataset = file.flat_map(TFRecordDataset)
データセットを反復処理するとExample
、file1、file2、file1、file3の順になります。
これがお役に立てば幸いです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加