如何在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
。不知道为什么会这样,但这是有效的...
我正在尝试训练一个神经网络,它将被水平线(以及未来的角)激活。
我绘制了一个包含垂直线和水平线的图像(参见下面的 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
。不知道为什么会这样,但这是有效的...