トレーニング中、各エポックで、バッチサイズを変更したいと思います( 実験的 目的のため)。カスタムCallback
を作成するのは適切なようですが、batch_size
はModel
クラスのメンバーではありません。
私が見る唯一の方法は、オーバーライドすることです fit_loop
そして公開batch_size
各ループのコールバックに。コールバックを使用せずにそれを行うためのよりクリーンで高速な方法はありますか?
カスタムデータジェネレーターを使用して、トレーニングループに渡すデータを制御する方がよいと思います。これにより、さまざまなサイズのバッチを生成したり、データをその場で処理したりできます。概要は次のとおりです。
_def data_gen(data):
while True: # generator yields forever
# process data into batch, it could be any size
# it's your responsibility to construct a batch
yield x,y # here x and y are a single batch
_
これで、model.fit_generator(data_gen(data), steps_per_Epoch=100)
を使用してトレーニングできます。これにより、エポックごとに100バッチが生成されます。これをクラス内にカプセル化する場合は、 Sequence を使用することもできます。
ここに着陸した他の人にとって、Kerasでバッチサイズ調整を行う最も簡単な方法は、(異なるバッチサイズで)fitを複数回呼び出すことです。
model.fit(X_train, y_train, batch_size=32, epochs=20)
# ...continue training with a larger batch size
model.fit(X_train, y_train, batch_size=512, epochs=10)
ほとんどの場合、受け入れられた答えが最善です。バッチサイズを変更しないでください。 99%の確率で、この質問が出てくるより良い方法がおそらくあります。
ネットワークの途中でバッチサイズを変更することが適切であるという例外的なケースを抱えている1%の人のために、これにうまく対処するgitの議論があります。
https://github.com/keras-team/keras/issues/4807
要約すると、Kerasはバッチサイズを変更することを望まないため、チートしてディメンションを追加し、batch_sizeが1で動作していることをkerasに伝える必要があります。たとえば、10個のcifar10画像のバッチのサイズは[10, 32, 32, 3]
、今では[1, 10, 32, 32, 3]
になります。ネットワーク全体でこれを適切に再形成する必要があります。 tf.expand_dims
およびtf.squeeze
を使用して、ディメンションを簡単に追加および削除します。