Как работать с наборами данных imagenet2012 и обучением vgg16? - PullRequest
0 голосов
/ 21 апреля 2019

Я хочу тренировать модель vgg16 в Tensorflow. Из-за стоимости вычислений я случайным образом разбил наборы проверочных данных Imagenet2012 на 80% (40 изображений для каждого класса) обучающих наборов данных и 20% (10 изображений для каждого класса) тестовых наборов данных. Кроме того, я начинаю тренировки с предварительно подготовленных гирь модели keras.applications.vgg16.VGG16.

Вот мои проблемы:

  1. Похоже, что наборы данных imagenet2012 (валидация) имеют два разных вида меток. Сначала я помечаю данные проверки метками в ILSVRC2012_devkit_t12/data/ILSVRC2012_validation_ground_truth.txt, но предварительно обученная модель имеет почти нулевую точность. Затем я нахожу другой файл метки, и предварительно обученная модель достигает 50% точности без обучения. Интересно, почему существует два вида этикеток, и какие мне следует использовать для предварительно обученной модели?

  2. Я тренирую vgg16 с двумя выпадающими слоями (скорость = 0,5) после fc6 и fc7. Точность набора обучающих данных увеличивается до 88%, но точность набора тестовых данных достигает только 50%. Гиперпарамс выглядит так:

regularizer_conv = tf.contrib.layers.l2_regularizer(scale=0.002)
regularizer_fc = tf.contrib.layers.l2_regularizer(scale=0.002)


model.train(sess=session, n_epochs=20, lr=0.001)
model.train(sess=session, n_epochs=40, lr=0.0001)
model.train(sess=session, n_epochs=60, lr=0.00001)

Журнал тренировок первых 10 эпох подобен:

epoch=1, batch=1250/1251, curr_loss=10.656956, train_acc=40.747500%, used_time:1.00s
Epoch:1, val_acc=48.150000%, val_loss=10.497776
epoch=2, batch=1250/1251, curr_loss=10.434262, train_acc=46.047500%, used_time:0.99s
Epoch:2, val_acc=47.100000%, val_loss=10.343517
epoch=3, batch=1250/1251, curr_loss=10.222428, train_acc=51.230000%, used_time:1.00s
Epoch:3, val_acc=48.910000%, val_loss=10.170202
epoch=4, batch=1250/1251, curr_loss=10.036579, train_acc=54.595000%, used_time:1.00s
Epoch:4, val_acc=47.790000%, val_loss=10.031280
epoch=5, batch=1250/1251, curr_loss=9.859999, train_acc=57.695000%, used_time:0.99s
Epoch:5, val_acc=47.360000%, val_loss=9.890789
epoch=6, batch=720/1251, curr_loss=9.716121, train_acc=61.154514%, used_time:0.99s
Epoch:6, val_acc=48.110000%, val_loss=9.753889
epoch=7, batch=1250/1251, curr_loss=9.539424, train_acc=62.747500%, used_time:1.01s
Epoch:7, val_acc=45.440000%, val_loss=9.650524
epoch=8, batch=1250/1251, curr_loss=9.394654, train_acc=64.752500%, used_time:0.99s
Epoch:8, val_acc=47.010000%, val_loss=9.510695
epoch=9, batch=1250/1251, curr_loss=9.257372, train_acc=66.647500%, used_time:0.99s
Epoch:9, val_acc=46.740000%, val_loss=9.399683
epoch=10, batch=1250/1251, curr_loss=9.127071, train_acc=68.267500%, used_time:0.99s
Epoch:10, val_acc=47.560000%, val_loss=9.283911
...

Кажется, что способность обобщения явно не увеличивается. Тогда как я могу улучшить точность тестовых наборов данных?

...