web-dev-qa-db-ja.com

トレーニング中にバッチサイズを変更するにはどうすればよいですか?

トレーニング中、各エポックで、バッチサイズを変更したいと思います( 実験的 目的のため)。カスタムCallbackを作成するのは適切なようですが、batch_sizeModelクラスのメンバーではありません。

私が見る唯一の方法は、オーバーライドすることです fit_loop そして公開batch_size各ループのコールバックに。コールバックを使用せずにそれを行うためのよりクリーンで高速な方法はありますか?

7
Totem

カスタムデータジェネレーターを使用して、トレーニングループに渡すデータを制御する方がよいと思います。これにより、さまざまなサイズのバッチを生成したり、データをその場で処理したりできます。概要は次のとおりです。

_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 を使用することもできます。

5
nuric

ここに着陸した他の人にとって、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) 
3
slund

ほとんどの場合、受け入れられた答えが最善です。バッチサイズを変更しないでください。 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を使用して、ディメンションを簡単に追加および削除します。

0
David Parks