Я пытаюсь использовать 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) было необходимо.
Разве все еще отклоняется, если вы установили скорость обучения намного ниже? –
Я редактировал в решении, которое я сейчас использую. – panmari