Наконец-то разобрался с ответом.
Это стыдно, но если кому-то это нужно, выкладывайте это здесь.
Во-первых, я должен убедиться, что мои метки и сетевой выход нормализованы:
output_normalized = tf.nn.l2_normalize(l2)
label_normalized = tf.nn.l2_normalize(label)
Во-вторых, тензор tf.square(l2 - label)
имеет форму [1, 200, 200, 200]
- это явно не так. Поэтому я изменил его дальше:
output_normalized = tf.reshape(tf.nn.l2_normalize(l2), [200, 200])
label_normalized = tf.nn.l2_normalize(label)
loss = tf.square(output_normalized - label_normalized)
Вот новый код, который работает совершенно нормально:
input = tf.convert_to_tensor(original, tf.float32)
label = tf.convert_to_tensor(lbl_hor, tf.float32)
W1 = tf.Variable(tf.ones([5,5,1,1]))
b1 = tf.Variable(0.1)
W2 = tf.Variable(tf.ones([5,5,1,1]))
b2 = tf.Variable(0.1)
l1 = tf.nn.conv2d(input, W1, [1,1,1,1], 'SAME')
l1 = l1 + b1
l1 = tf.nn.relu(l1)
l2 = tf.nn.conv2d(l1, W2, [1,1,1,1], 'SAME')
l2 = l2 + b2
l2 = tf.nn.relu(l2)
output_normalized = tf.reshape(tf.nn.l2_normalize(l2), [200, 200])
label_normalized = tf.nn.l2_normalize(label)
loss = tf.square(output_normalized - label_normalized)
loss_sum = tf.reduce_sum(loss)
train_op = tf.train.AdamOptimizer(0.1).minimize(loss_sum)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(0, 100):
sess.run(train_op)
По какой-то причине tf.random_normal
в качестве начальных значений не дает стабильного обучения каждый раз, поэтому я использовал tf.ones
вместо этого. Не уверен, почему это происходит, но это работает ...