0

Установка

Я создаю автокодер с тензором для изображений. Мои изображения составляют около 30 пикселей по длине и ширине. Я использую 5 слоев:Tensorflow autoencoder: Как получить репрезентативный результат?

  1. входной слой
  2. слой энкодер с 256 нейронов с линейными функциями. (Этот слой должен функционировать как препроцессорный PCA.)
  3. Уровень кодировщика с 128 нейронами с сигмовидными функциями.
  4. Декодерный слой с 256 нейронами с сигмовидными функциями.
  5. Декодер/выходной слой с таким количеством нейронов, что и вход с линейной функцией.

Все слой использует уклоны и определяется как этот

layer_1 = tf.nn.sigmoid(tf.add(
    tf.matmul(x, tf.Variable(tf.random_normal([n_input, n_hidden_1]))), 
    tf.Variable(tf.random_normal([n_hidden_1])) 
)) 

Моей стоимость определяются

cost = tf.reduce_mean(tf.div(tf.reduce_sum(tf.pow(y_true - y_pred, 2)), 2)) 

и я использовал RMSPropOptimizer с начала скоростью 0.01 обучения.

Я обучил автокодерам около 250000 изображений. Ниже я показываю результаты тестовых данных, с которыми я не тренировался. Верхняя строка всегда показывает входные изображения, нижняя строка всегда показывает выходные изображения.

Я использовал автоассоциатор удовлетворительного по данным MNIST (ячейки массива являются значением от 0-1): enter image description here

Я использовал автоассоциатор удовлетворительный на фотографиях, которые я взял себя (ячейки массива являются значением от 0-100): enter image description here

Где среднеквадратичные ошибки

rmse = tf.sqrt(tf.reduce_mean(tf.square(tf.sub(y_true, y_pred)), axis=1)) 

являются, как и следовало ожидать - выше первых трех фотографий (Darke Нед, побелевшие, поставить крест), и ниже для неизменных фотографий:

17.5, 29.6, 12.9, 11.7, 11.2, 11.7, 7.3, 7.1, 7.1, 8.1 

Но автоассоциатор не работает удовлетворительно для текстурных изображений (ячеек массива являются 0-1). Во-первых, я использовал RMSPropOptimizer и получил

enter image description here

С моей стоимости, где довольно высока во время тренировки и не изменял, я последовал совету от https://stackoverflow.com/a/40956761/4533188 и используемого AdamOptimizer. Действительно, я получил лучшие результаты с

enter image description here

Хотя затраты ниже, они по-прежнему неизменными в течение эпох:

enter image description here

Также вывод изображения довольно темно.Я считаю, что это может также причина, почему мои rmse s являются не как я бы ожидать:

0.4642, 0.2669, 0.4976, 0.4378, 0.4753, 0.4688, 0.4615, 0.4571, 0.4691, 0.4487 

Пожалуйста, обратите внимание, что я хотел бы ожидать, что rmse s высок для первого изображения в связи с точкой в ​​центре и второе изображение, поскольку оно затемнено. Я думаю, причина, по которой rmse s не так надеялась, потому что выходные изображения настолько темные.

Вопросы

  1. Почему расходы не уменьшаются в течение эпох и что я могу сделать, чтобы получить это происходит?
  2. Почему выходные изображения настолько темные и что я могу сделать, чтобы они лучше отображали входные изображения?
  3. Как я могу получить rmse?

ответ

0

Ваша сеть явно не обучение

  • Ваши Autoenconder слои не симметричны
  • Не используйте сигмовидной, используйте РЕЛУ
  • Используйте лучший метод инициализации (конкретное распределение зависит от функция активации)
  • Разделите вес слоев кодировщика и декодера
+0

1. Какова ваша рекомендация для слоев, если я хочу, чтобы выход был линейным, и чтобы первый скрытый слой был линейным? 3. Что вы рекомендуете для сигмовидных, линейных, ReLU? 4. Что вы имеете в виду? Поделитесь ими с SO? – Make42

+0

2. Почему я должен использовать ReLU вместо сигмоида? – Make42

+0

ReLU оказалось легче тренироваться, чем сигмовидный. Я рекомендую вам изучить этот очень хороший ресурс, чтобы быть успешным в развитии нейронных сетей; deeplearningbook.org – fabrizioM

Смежные вопросы