Tensorflow.kerasでDensenetとMobileNetを使っていた時のこと。
accやauc、lossは更新されるが、val_aucが0.5000のまま一切更新されず、val_accやval_lossも同じ値を取り続けていた。
Epoch 2/100
91/91 [==============================] - ETA: 0s - loss: 0.1925 - auc: 0.5667
Epoch 00002: val_auc did not improve from 0.50000
91/91 [==============================] - 28s 303ms/step - loss: 0.1925 - auc: 0.5667 - val_loss: 0.0685 - val_auc: 0.5000
Epoch 3/100
91/91 [==============================] - ETA: 0s - loss: 0.0231 - auc: 0.8605
Epoch 00003: val_auc did not improve from 0.50000
91/91 [==============================] - 27s 302ms/step - loss: 0.0231 - auc: 0.8605 - val_loss: 0.0685 - val_auc: 0.5000
Epoch 4/100
91/91 [==============================] - ETA: 0s - loss: 0.0222 - auc: 0.8767
Epoch 00004: val_auc did not improve from 0.50000
Epoch 00004: ReduceLROnPlateau reducing learning rate to 0.0005000000237487257.
91/91 [==============================] - 28s 305ms/step - loss: 0.0222 - auc: 0.8767 - val_loss: 0.0685 - val_auc: 0.5000
Epoch 5/100
91/91 [==============================] - ETA: 0s - loss: 0.0226 - auc: 0.8744
Epoch 00005: val_auc did not improve from 0.50000
91/91 [==============================] - 27s 301ms/step - loss: 0.0226 - auc: 0.8744 - val_loss: 0.0685 - val_auc: 0.5000
画像のpreprocess_inputやchannnel first, lastの確認もしてみたが、特に問題ない。
ResnetやEfficientNetだと問題なく値が更新されていくのでデータセットは大丈夫のはず。
loss functionやoptimizerを変えても上手く行かず、悩んでいた。
DenseNetの論文を見てみると
The initial learning rate is set to 0.1, and is divided by 10 at 50% and 75% of the total number of training epochs.
https://arxiv.org/abs/1608.06993
On ImageNet, we train models for 90 epochs with a batch size of 256.
The learning rate is set to 0.1 initially, and is lowered by 10 times at epoch 30 and 60
epochが進むにつれてlearning rateを10で割っていってるようなので同じように真似してみたところ、learning rateを0.0001にしたあたりで学習が上手く進み始め、val_acc等の値も更新され始めた。
学習係数もハイパーパラメータの1つであると再認識することが出来た。
参考
Densely Connected Convolutional Networks
Recent work has shown that convolutional networks can be substantially deeper, more accurate, and efficient to train if ...
コメント