Возможные объяснения увеличения потерь?

У меня есть набор данных из 40 тыс. изображений из четырех разных стран. Изображения содержат разные предметы: сцены на открытом воздухе, городские сцены, меню и т. д. Я хотел использовать глубокое обучение для геотегирования изображений.

Я начал с небольшой сети из 3 слоев conv->relu->pool, а затем добавил еще 3, чтобы углубить сеть, поскольку задача обучения непростая.

Моя потеря связана с этим (как с 3-х, так и с 6-уровневыми сетями): введите здесь описание изображения:

Потери фактически начинаются плавно и снижаются в течение нескольких сотен шагов, но затем начинают подкрадываться.

Каковы возможные объяснения моего роста потерь?

Моя начальная скорость обучения очень низкая: 1e-6, но я также пробовал 1e-3|4|5. Я проверил дизайн сети на работоспособность на крошечном наборе данных из двух классов с предметами, отличными от классов, и потери постоянно снижаются по мере необходимости. Точность поезда колеблется на уровне ~40%


person JohnAllen    schedule 05.10.2016    source источник


Ответы (2)


Обычно я бы сказал, что ваша скорость обучения слишком высока, однако похоже, что вы исключили это. Вы должны проверить величину чисел, входящих и исходящих из слоев. Вы можете использовать tf.Print для этого. Возможно, вы каким-то образом случайно вводите черное изображение или можете найти слой, где числа сходят с ума.

Кроме того, как вы рассчитываете перекрестную энтропию? Возможно, вы захотите добавить небольшой эпсилон внутрь журнала, поскольку его значение будет стремиться к бесконечности, когда его ввод приближается к нулю. Или, что еще лучше, используйте функцию tf.nn.sparse_softmax_cross_entropy_with_logits(...), которая позаботится о числовой стабильности за вас.

Поскольку стоимость вашей кроссэнтропии настолько высока, похоже, что сеть выводит почти все нули (или значения, близкие к нулю). Поскольку вы не разместили никакого кода, я не могу сказать, почему. Я думаю, что вы можете просто обнулить что-то в расчете функции стоимости случайно.

person chasep255    schedule 05.10.2016
comment
Я использую tf.nn.sparse_softmax_cross_entropy_with_logits(...) FYI. - person JohnAllen; 05.10.2016
comment
Я подумал, что ты можешь быть. В противном случае стоимость ушла бы в бесконечность, и вы получили бы нан. По какой-то причине вывод определенно становится нулевым. Может быть, попробуйте использовать активацию elu вместо relu, так как они не умирают при нуле. - person chasep255; 05.10.2016
comment
Я использую tf.nn.elus в своих конверсионных слоях и relu в последнем скрытом слое: hidden = tf.nn.relu(tf.matmul(reshape, fc1_weights) + fc1_biases). Возможно, я смогу попробовать элю и там. - person JohnAllen; 05.10.2016
comment
Вам не нужна активация на последнем слое, так как функция softmax является активацией. Также убедитесь, что ваши веса инициализированы как положительными, так и отрицательными значениями. - person chasep255; 05.10.2016
comment
Это даже немного сильнее - вы абсолютно не хотите, чтобы relus в последнем слое, вы хотите, чтобы логиты могли переходить к произвольным отрицательным значениям. - person etarion; 05.10.2016

Я также столкнулся с проблемой, я использовал библиотеку keras (бэкэнд tensorflow)

    Epoch 00034: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-34-0.627.hdf50
Epoch 35/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.2870 - acc: 0.9331 - val_loss: 2.7904 - val_acc: 0.6193
Epoch 36/150
226160/226160 [==============================] - 65s 288us/step - loss: 0.2813 - acc: 0.9331 - val_loss: 2.7907 - val_acc: 0.6268

Epoch 00036: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-36-0.627.hdf50
Epoch 37/150
226160/226160 [==============================] - 65s 286us/step - loss: 0.2910 - acc: 0.9330 - val_loss: 2.5704 - val_acc: 0.6327
Epoch 38/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.2982 - acc: 0.9321 - val_loss: 2.5147 - val_acc: 0.6415

Epoch 00038: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-38-0.642.hdf50
Epoch 39/150
226160/226160 [==============================] - 68s 301us/step - loss: 0.2968 - acc: 0.9318 - val_loss: 2.7375 - val_acc: 0.6409
Epoch 40/150
226160/226160 [==============================] - 68s 299us/step - loss: 0.3124 - acc: 0.9298 - val_loss: 2.8359 - val_acc: 0.6047

Epoch 00040: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-40-0.605.hdf50
Epoch 41/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.2945 - acc: 0.9315 - val_loss: 3.5825 - val_acc: 0.5321
Epoch 42/150
226160/226160 [==============================] - 65s 287us/step - loss: 0.3214 - acc: 0.9278 - val_loss: 2.5816 - val_acc: 0.6444

Когда я увидел свою модель, она состояла из слишком большого количества нейронов. Короче говоря, модель была переоснащена. Я уменьшил количество нейронов в 2 плотных слоях (с 300 до 200 нейронов)

person yunus    schedule 17.05.2018
comment
Переобучение не увеличивает потери при обучении, а скорее относится к ситуации, когда потери при обучении уменьшаются до небольшого значения, а потери при проверке остаются высокими. - person AveryLiu; 30.04.2021