如何在张量流中训练卷积滤波器

时间:2018-11-10 18:37:59

标签: python tensorflow convolution

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

我绘制的图像同时包含垂直线和水平线(请参见下面的链接)。然后在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)

网络每次都提供不可预测的输出,有时只是黑色。我尝试将标签乘以某个常数,以使激活具有更大的权重-作用不大...

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

1 个答案:

答案 0 :(得分:0)

最后弄清楚了答案。 令人尴尬,但如果有人需要,请在此处发布。

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

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。不知道为什么会这样,但这行得通...