質問: self.model.fit(x_train, y_train, batch_size=8, epochs=epochs, validation_split=0.2, ) self.model.summary() ``` お願いします。
回答: > > 1, バッチ分データを分割して学習(batch_size=2, data_set=400の場合、400/2回学習)、割り切れなかったりした場合は切り捨て?して計算してくれる(はず) > > > 400 / 2 = 200 回重みの更新されるので、その認識であっています。 端数となるサンプルを切り捨てるかどうかはライブラリの実装に依ります。 > > 2, batch_size=1であれば確率的になる。 > > > バッチサイズ1の場合 確率的勾配法 になりますが、`バッチサイズ < サンプル数`であれば、サンプル全部の勾配をサンプルの一部の勾配で近似しているわけなので、確率的といえます。 > > 3, 指定しない場合はDefault=32となる(Noneでも)。 > > > その認識であっています。公式ドキュメント記載の通り。 > > batch_size: 整数またはNone.設定したサンプル数ごとに勾配の更新を行います. 指定しなければデフォルトで32になります. > > > Sequentialモデル - Keras Documentation > > 4, batch_sizeは2^nで決めると良い。(ケースバイケース) > > > 2の累乗がよいという特段の理由はありません。 プログラマにとって、2の累乗はキリのいい数なので、32や64といった値がよく使われているだけです。 * バッチサイズを小さくする: 局所解に嵌りずらくなる。 GPU を使用する場合、計算効率が悪くなる。 * バッチサイズを大きくする: 局所解に嵌りやすくなる。 GPU を使用する場合、一度に計算できたほうが計算効率がよい。 あまり大きい値にしすぎると、GPU のメモリに乗り切らない場合もある。 どのくらいの値がよいかというのはハイパーパラメータなので、ケースバイケースです。 エラーについて > > Incompatible shapes: [8] vs. [8,64,64] > > > そのエラーはモデル作成時または fit() 関数による学習時のどちらのタイミングででましたか? 後者の場合、モデルは `(None, 64, 64, 3)` の入力を期待しているので、 fit 関数に与えるデータ x_train の形状は (サンプル数, 64, 64, 3) の numpy 配列、y_train は (サンプル数, クラス数) の numpy 配列の必要があります。 x_train.shape, y_train.shape を print してみてそのようになっているか確認してみてください。 追記 よく見たら、Conv2D -> Dense の間に Flatten する層が抜けていますね。 エラーはそれが原因です。 動作確認したコード ``` from tensorflow.keras.layers import Input, Conv2D, Dense, Flatten from tensorflow.keras.models import Model inputs = Input(shape=(64, 64, 3)) x1 = Conv2D(64, 3, padding="same", activation="relu")(inputs) x2 = Flatten()(x1) x3 = Dense(64, activation="relu")(x2) outputs = Dense(8, activation="softmax")(x3) model = Model(inputs=inputs, outputs=outputs) model.compile(loss="categorical_crossentropy", optimizer="Adam", metrics=["accuracy"]) model.summary() x_train = np.random.randn(1000, 64, 64, 3) y_train = np.random.randn(1000, 8) model.fit(x_train, y_train, batch_size=8, epochs=100, validation_split=0.2) ```