2015-11-17 4 views
3

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

# h_fc2 is my output layer, y_ is my label image. 
ssd = tf.reduce_sum(tf.square(y_ - h_fc2)) 

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(ssd) 

Проблема заключается в том, что веса расходятся, и я получаю ошибку

ReluGrad input is not finite. : Tensor had Inf values 

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

ssd_min_1 = tf.reduce_sum(tf.square(y_ - tf.minimum(h_fc2, 1))) 
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(ssd_min_1) 

ли мой следует ожидать наблюдения?

Редактировать: Предложения @mdaoust оказались правильными. Главное - нормализовать размер партии. Это может быть сделано независимо от размера партии, используя этот код

squared_diff_image = tf.square(label_image - output_img) 
# Sum over all dimensions except the first (the batch-dimension). 
ssd_images = tf.reduce_sum(squared_diff_image, [1, 2, 3]) 
# Take mean ssd over batch. 
error_images = tf.reduce_mean(ssd_images) 

С этим изменением, лишь незначительное снижение скорости обучения (0.0001) было необходимо.

+0

Разве все еще отклоняется, если вы установили скорость обучения намного ниже? –

+0

Я редактировал в решении, которое я сейчас использую. – panmari

ответ

3

Существует множество способов получить конечные результаты.

Но оптимизаторы, особенно простые, такие как градиентный спуск, могут расходиться, если скорость обучения «слишком высока».

Вы пробовали просто делить курс обучения на 10/100/1000? Или нормализация на pixels*batch_size, чтобы получить среднюю ошибку на пиксель?

Или один из more advanced optimizers? Например, tf.train.AdamOptimizer() с настройками по умолчанию.

+0

Не могли бы вы привести пример использования? Просто замена GradientDescentOptimizer на 'AdamOptimizer' не работает. – panmari

+0

И хорошая идея с включением размера партии в нормализации, я не думал об этом! – panmari

+0

На данный момент я решил нормализовать SSD с помощью batch_size (так это действительно SSD) и установить скорость обучения намного ниже (делится на 1000), как вы предложили. Спасибо, что указал мне в правильном направлении. – panmari