iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
AI & Data

30 天在 Colab 嘗試的 30 個影像分類訓練實驗系列 第 4

【4】實驗 Batch size大小對訓練模型的影響

Colab連結

相信每個人在學習ML時,都會遇到超參數 Batch size 應該要設置多少才好的問題,一般大家在教科書上學到的大部分是:當 Batch size 很小或甚至為1時,模型損失值下降方式會以比較小步且方向雜亂的方式向下,反之當 Bach size 較大時,因為每次 gradient 都會拿一批資料作為下降方式的參考,所以步伐較大且方向較一致。

https://ithelp.ithome.com.tw/upload/images/20210918/20107299b4BiHgHxnH.png

圖片來源

而除了模型影響以外,還有硬體限制的問題,如果今天 GPU 記憶體不夠大,而且又那麼剛好你也需要訓練一個大型模型,你所能設定的最大 Batch size 也無法過高。

以下我們制定了四種 Batch size ,分別是16, 32, 64, 128來觀察對模型的影響,按照Day1的訓練經驗,這個問題應該至少能夠得到85%左右的準確度。

實驗一:Batch_size=16

SHUFFLE_SIZE=1000
EPOCHS = 50
BATCH_SIZE=16
LR = 0.1

ds_train = train_split.map(
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(SHUFFLE_SIZE)
ds_train = ds_train.batch(BATCH_SIZE)
ds_train = ds_train.prefetch(tf.data.experimental.AUTOTUNE)

ds_test = test_split.map(
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_test = ds_test.batch(BATCH_SIZE)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.experimental.AUTOTUNE)

base = tf.keras.applications.MobileNetV2(input_shape=(224, 224, 3), include_top=False, weights='imagenet')
net = tf.keras.layers.GlobalAveragePooling2D()(base.output)
net = tf.keras.layers.Dense(NUM_OF_CLASS)(net)

model = tf.keras.Model(inputs=[base.input], outputs=[net])

model.compile(
    optimizer=tf.keras.optimizers.SGD(LR),
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)

history = model.fit(
    ds_train,
    epochs=EPOCHS,
    validation_data=ds_test,
    verbose=True)

產出:

loss: 0.0032 - sparse_categorical_accuracy: 1.0000 - val_loss: 2.3630 - val_sparse_categorical_accuracy: 0.4500

https://ithelp.ithome.com.tw/upload/images/20210918/201072998rUNTLxP37.png

訓練集loss急速下降,後期驗證集沒什麼起色,沒有泛化。

實驗二:Batch_size=32

loss: 1.9535 - sparse_categorical_accuracy: 0.8559 - val_loss: 3.7203 - val_sparse_categorical_accuracy: 0.2196

https://ithelp.ithome.com.tw/upload/images/20210918/201072997CHr1dtIla.png

相較於實驗一,訓練集和驗證集都有穩定下降,但看來需要更多 epoch 來運行。

實驗三:Batch_size=64

loss: 8.4681e-04 - sparse_categorical_accuracy: 1.0000 - val_loss: 0.5873 - val_sparse_categorical_accuracy: 0.8382

https://ithelp.ithome.com.tw/upload/images/20210918/20107299e9TVbxOLQz.png

前五個 epoch 訓練後,訓練集準確度就幾乎已達99.9%,但仍有學到特徵讓後續的驗證集準確度爬起來。

實驗四:Batch_size=128

loss: 0.3136 - sparse_categorical_accuracy: 0.9990 - val_loss: 1.7577 - val_sparse_categorical_accuracy: 0.6902

https://ithelp.ithome.com.tw/upload/images/20210918/20107299AjPZKczPkY.png

個人覺得線圖最合理的實驗,不像實驗三的訓練集暴衝,而是和驗證集一起穩定進步,雖然最終的 loss 和 accuracy 沒有實驗三來得好,但線圖很健康。

經過這四次的實驗之後,我們分別拿到 loss 值是[2.36, 3.72, 0.58, 1.75], 準確度是[45%, 21.9%, 83.8%, 69%],Batch size為64時,效果最好,這部分仍無法下定論,因為其他 Batch size 若在經過更多的 epochs ,說不定也能取得不錯的準確度,而我自己的實務經驗來說,我基本上都是能把 Batch size 撐高就撐高,一方面訓練較為有效率,另一方面較高的 Batch size 也有助於 Batch Normalization Layer 學習。


上一篇
【3】訓練前先暖身 - 學習率 Warm-up 策略
下一篇
【5】超參數 Batch size 與 Learning rate 的關係實驗
系列文
30 天在 Colab 嘗試的 30 個影像分類訓練實驗31

尚未有邦友留言

立即登入留言