Как обучить сверточные фильтры в тензорном потоке - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь обучить нейронную сеть, которая будет активирована горизонтальными линиями (и в будущем углами).

Я рисую изображение, которое содержит как вертикальные, так и горизонтальные линии (см. Ссылку ниже). Затем в фотошопе я рисую отметки поверх горизонтальных линий, места, где я хочу активировать сеть.

Исходные изображения и изображения этикеток выглядят так: оригинал lbl_hor

Теперь задача кажется легкой, но я не могу заставить тензорный поток обучить такую ​​сеть. Вот мой код:

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 голосов
/ 17 ноября 2018

Наконец-то разобрался с ответом. Это стыдно, но если кому-то это нужно, выкладывайте это здесь.

Во-первых, я должен убедиться, что мои метки и сетевой выход нормализованы:

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 вместо этого. Не уверен, почему это происходит, но это работает ...

...