Какую архитектуру выбрать для нейросети, решающей задачу преобразования матрицы?

Здравствуйте!

На руках имеется 10 тысяч пар матриц (входная и выходная) 100*100, причем входную можно преобразовать во выходную, применив некий закон, который мне неизвестен.
Входные матрицы содержат дробные значения широкого диапазона: от нуля до нескольких тысяч (95% - нули), а выходные - целочисленные значения (95% - нули), отражающие принадлежность к одному из 16 классов.

Помимо этого, есть 1 тысяча входных матриц 100*100, для которых нужно более-менее точно воспроизвести выходные.

Первая мысль, которая мне пришла в голову, это то, что передо мной задача регрессии, а значит нейросети должны помочь. Т.к. входная и выходная матрицы имеют равную размерность, то осмысленно использовать архитектуру вида U-Net/DeconvNet/SegNet/RedNet/FCN. Выбор пал на RedNet:
1*QePoqFW4vS4BKmODXZqRXA.png1*RyhqMbfEpRdpYwE55m0UMg.png

Если использую активационную функцию последнего слоя Sigmoid, то, после обучения на 2.5к образцов, получаю точность около 0.5 и полную кашу в выходных данных. Если активационная функция ReLu, то точность получается 0.9, но в выходных данных правильно определяются только нули, а остальные значения уходят за пределы тысячи.

Ранее доводилось обучать только U-Net в задаче сегментации на "дорога есть" и "дороги нет".

Не ошибся ли я с выбором архитектуры?
Если нет, то, полагаю, ошибся я в том, как обучаю нейросеть: нужно разбить выходную матрицу на 16 матриц-масок, где содержалась бы информация о наличии только конкретного класса в данной ячейке матрицы. Т.е. как это делается в U-Net, когда осуществляется сегментация на несколько классов. Ну и активационная функция последнего слоя будет SoftMax, а выходных масок будет 16. Верна ли моя догадка?
  • Вопрос задан
  • 543 просмотра
Решения вопроса 1
sgjurano
@sgjurano
Разработчик
Я правильно понял, что вам нужно каждую ячейку матрицы 100x100, структура и правила формирования которой вам не известны, классифицировать в один из 16 классов?

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

В общем случае вам нужен выходной слой с 16-мерным Softmax на каждый пиксель (получается тензор размерности batch*100*100*16), потом вы берёте для каждого пикселя argmax + 1, и в качестве функции потерь используете кросс-энтропию.

UPD: до меня тут дошло, что во время обучения лучше не брать argmax, а вместо этого применить One-Hot-Encoding на матрицу классов, чтобы получить тензор той же размерности, что и прогнозный.

argmax пригодится на этапе постпроцессинга, когда сеть у вас уже обучена и выдаёт корректные вероятности для классов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы