質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

19709閲覧

kerasのbatch_sizeについて(分からない)

n0pj

総合スコア12

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

2クリップ

投稿2019/05/27 15:21

前提・実現したいこと

kerasのfit関数の引数batch_sizeについてです。
半年ほどニューラルネットワークを勉強しているんですが、つまずきました。
batch_sizeについてですが、以下の事が解だと思っています。

1, バッチ分データを分割して学習(batch_size=2, data_set=400の場合、400/2回学習)、割り切れなかったりした場合は切り捨て?して計算してくれる(はず)
2, batch_size=1であれば確率的になる。
3, 指定しない場合はDefault=32となる(Noneでも)。
4, batch_sizeは2^nで決めると良い。(ケースバイケース)

これらのことから、あまり深く決める必要はないと感じました。
が、しかし、

発生している問題・エラーメッセージ

batch_size=8の場合です。
なぜでしょうか。
これはどの部分を指しているのでしょうか。

Incompatible shapes: [8] vs. [8,64,64]

また、batch_size=64にした場合、こうなります。
よく分かりません。

Incompatible shapes: [24] vs. [24,64,64]

合わすことができれば、こういう風に計算できると思うんですが…

x = np.ones(64) y = np.ones((64, 64, 64)) dot = np.dot(x, y)

該当のソースコード

長いので、関連がありそうな部分だけを載せます。
trainは664、validateは166
Convが1層しかない簡単なネットワークです。

h = 64
w = 64
d = 3
入出力は、
Input
in :(None, 64, 64, 3)
out:(None, 64, 64, 3)
Conv2D
in :(None, 64, 64, 3)
out:(None, 64, 64, 64)
Dense
in :(None, 64, 64, 64)
out:(None, 64, 64, 64)
Dense
in :(None, 64, 64, 64)
out:(None, 64, 64, 3)

Python3

1class teratail(object): 2 def __init__(self, h, w, d, label): 3 self.inputs = Input(shape=(h, w, d), name="inputs") 4 self.x = Conv2D(64, 3, padding="same", activation="relu")(self.inputs) 5 self.x = Dense(64, activation="relu")(self.x) 6 self.outputs = Dense(label, activation="softmax")(self.x) 7 8 def create_model(self): 9 self.model = Model(self.inputs, self.outputs, name="network") 10 11 def model_compile(self): 12 loss_object = tf.losses.CategoricalCrossentropy() 13 optimizer = tf.optimizers.Adam(lr=1e-4) 14 15 self.model.compile(loss=loss_object, 16 optimizer=optimizer, 17 metrics=["accuracy"]) 18 19 def model_fit(self, x_train, y_train, epochs=10): 20 21 _return = self.model.fit(x_train, y_train, 22 batch_size=8, 23 epochs=epochs, 24 validation_split=0.2, 25 ) 26 self.model.summary() 27

お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 する層が抜けていますね。
エラーはそれが原因です。

動作確認したコード

python

1from tensorflow.keras.layers import Input, Conv2D, Dense, Flatten 2from tensorflow.keras.models import Model 3 4inputs = Input(shape=(64, 64, 3)) 5x1 = Conv2D(64, 3, padding="same", activation="relu")(inputs) 6x2 = Flatten()(x1) 7x3 = Dense(64, activation="relu")(x2) 8outputs = Dense(8, activation="softmax")(x3) 9model = Model(inputs=inputs, outputs=outputs) 10model.compile(loss="categorical_crossentropy", optimizer="Adam", metrics=["accuracy"]) 11model.summary() 12 13x_train = np.random.randn(1000, 64, 64, 3) 14y_train = np.random.randn(1000, 8) 15 16model.fit(x_train, y_train, batch_size=8, epochs=100, validation_split=0.2)

投稿2019/05/27 16:12

編集2019/05/28 02:16
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

n0pj

2019/05/28 01:00

回答ありがとうございます。 print(x_train.shape) print(y_train.shape) history = self.model.fit(x_train, y_train, batch_size=8, epochs=epochs, validation_split=0.2, ) としてみました。 (830, 64, 64, 3) (830, 3) 2019-05-28 09:41:04.691352: W tensorflow/core/common_runtime/base_collective_executor.cc:214] BaseCollectiveExecutor::StartAbort Invalid argument: Incompatible shapes: [8] vs. [8,64,64] ... ... 期待する入力になっています。 エラーが発生する場所は最初のepochが開始される前です。 batch_sizeを色々な値に変更すると、1epoch中に発生したりします。 640/664 [===========================>..] - ETA: 0s - loss: 1.0982 - accuracy: 0.34852019-05-28 09:57:08.821007: W tensorflow/core/common_runtime/base_collective_executor.cc:214] BaseCollectiveExecutor::StartAbort Invalid argument: Incompatible shapes: [24] vs. [24,64,64]
tiitoi

2019/05/28 01:27 編集

こちらで動かして検証できないので具体的な原因はわかりませんが、モデル作成には Keras API を使っているのであれば、compile() に指定する損失関数や optimizer は TensorFlow ではなく、Keras のものを使ったほうがいいのではないでしょうか。 https://keras.io/ja/optimizers/ https://keras.io/ja/losses/ 以下の部分 ``` loss_object = tf.losses.CategoricalCrossentropy() optimizer = tf.optimizers.Adam(lr=1e-4) ```
n0pj

2019/05/28 01:40

self.model.compile(loss="categorical_crossentropy", optimizer="Adam", metrics=["accuracy"]) これらで試してみましたが、やはり変わりません…
tiitoi

2019/05/28 02:16

追記にも記載しましたが、Conv2D -> Dense の間に Flatten する層が抜けてますね。 エラーはそれが原因です。
n0pj

2019/05/28 03:14

importしていたのにすっかり忘れていました。ありがとうございます。 Flattenを用いない方法もあった気がするんですが、ご存知でないでしょうか? 全貌が明らかでないので不確かですが、こちらのブログ主さんはできているようです。 何か条件があるのであれば教えていただきたいです。 http://liaoyuan.hatenablog.jp/entry/2018/02/24/124442
tiitoi

2019/05/28 03:37 編集

上記ブログのコードを拝見しましたが Flatten() してから全結合層に渡しています。 > Flattenを用いない方法もあった気がするんですが、ご存知でないでしょうか? Global Average Pooling でも Flatten と同じことができます。 https://qiita.com/Phoeboooo/items/f188eb2426afc8757272 > 何か条件があるのであれば教えていただきたいです。 条件等ではなく、(BatchSize, H, W, C) の配列をそのまま出力数Nの全結合層に渡すと、ブロードキャストで計算され、(BatchSize, H, W, N) の配列が最終的なモデルの出力となるので、そのあとの損失関数の計算で形状の不一致が起こります。 なので、全結合層にわたす前には必ず Flatten してください。
n0pj

2019/05/28 10:05

なるほど…なるほど… 詳しくありがとうございます。 また新しいことを学べました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問