如何在tensorflow中训练卷积滤波器

How to train convolution filters in tensorflow

我正在尝试训练一个神经网络,它将被水平线(以及未来的角)激活。

我绘制了一个包含垂直线和水平线的图像(参见下面的 link)。然后在 photoshop 中我在水平线的顶部画标记,我希望网络激活的地方。

原始图像和标签图像如下所示: original lbl_hor

现在这个任务看起来很简单,但是我无法让tensorflow来训练这样的网络。这是我的代码:

input = tf.convert_to_tensor(original, tf.float32)
label = tf.convert_to_tensor(lbl_hor, tf.float32)

W1 = tf.Variable(tf.random_normal([5,5,1,1]))
b1 = tf.Variable(0.1)
W2 = tf.Variable(tf.random_normal([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)

loss = tf.square(l2 - label)
loss_sum = tf.reduce_sum(loss)
train_op = tf.train.AdamOptimizer(0.01).minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for i in range(0, 100):
    sess.run(train_op)

网络每次都给出不可预测的输出,有时只是黑色。我试图将标签乘以某个常数,以便激活具有更大的权重 - 效果不大...

你能帮我弄清楚如何训练这样的网络或找出我的代码有什么问题吗?

终于找到答案了。 这很尴尬,但如果有人需要,请在此处发布。

首先,我应该确保我的标签和网络输出是标准化的:

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。不知道为什么会这样,但这是有效的...