я должен использовать float или классы в качестве вывода для последнего слоя в моей нейронной сети? - PullRequest
0 голосов
/ 17 мая 2019

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

Я мог бы спроектировать последний слой так, чтобы он возвращал одиночное число с плавающей запятой, и использовать, скажем, среднеквадратичное значение.ошибка (MSE), как потеря того, что возвращаемое число с плавающей запятой близко к желаемому целому числу.Или я мог бы думать о каждой целочисленной возможности как о «классе» и использовать потерю кросс-энтропии (CE) для оптимизации.

Есть ли какие-либо аргументы в пользу любого из этих вариантов?

Кроме того, что, если целью является число с плавающей точкой в ​​диапазоне от 1 до 10?Я мог бы также превратить это в проблему класса / CE.

До сих пор я пробовал вариант CE (который работает на каком-то уровне) и думаю попробовать вариант mse, но хотел бы отступить и подумать раньшепродолжение.Такие мысли должны включать рассуждения о том, почему один подход может превзойти другой.

Я работаю с Pytorch версии 1.0.1 и Python 3.7.

Спасибо за любые указания.

1 Ответ

0 голосов
/ 20 мая 2019

Я решил просто реализовать плавающую головку с L1Loss в Pytorch, и я создал простой, но эффективный набор синтетических данных для проверки реализации.Набор данных создал изображения, в которые были случайно нарисованы несколько маленьких квадратов.Обучающая метка представляла собой просто число квадратов, разделенных на 10, число с плавающей точкой с одной десятичной цифрой.Сеть обучалась очень быстро и с высокой степенью точности - тестовые образцы были верны с точностью до одной десятичной цифры.

Что касается исходного вопроса, то пробежки, которые я сделал, определенно благоприятствовали плаванию над классом.

Мое предположение заключается в том, что реализация в классах имела базовую неточность в присваивании классов и, что, возможно, более важно, реализация класса не имеет понятия «метрика».То есть, реализация float, даже если она пропустит точное совпадение, попытается сгенерировать выходную метку «близко» к метке ввода, в то время как реализация класса не имеет понятия «близко».

Одно предупреждение с Pytorch.Если вы подходите к одному значению с плавающей запятой, обязательно поместите его в вектор длины 1 в генераторе данных.Pytorch не может обрабатывать «обнаженное» число с плавающей точкой (даже если оно становится вектором, когда пакет готов).Но это не жалуется.Это стоило мне кучу времени.

...