Невозможно наложить простую свертку на одном изображении - PullRequest
0 голосов
/ 06 сентября 2018

Я работаю над созданием архитектуры полностью сверточной сети для сегментации изображений. Для каждого изображения я хочу классифицировать каждый пиксель позади класса № 0 (фон) или класса № 1.

Поскольку вся моя сеть не работает должным образом - вообще (сходясь только к прогнозированию класса 0), я упростил ее до более элементарной сети, которая по сути является полностью связным слоем:

X = tf.placeholder(tf.float32, shape=[None, 720, 1280, 3])
y = tf.placeholder(tf.int32, shape=[None, 720, 1280])
logits= tf.layers.conv2d(X, filters=2, kernel_size=1, strides=1, padding="SAME", 
    activation=tf.nn.relu)
labels = tf.contrib.layers.one_hot_encoding(y, 2)
xentropy = tf.losses.softmax_cross_entropy(labels, logits)
loss = tf.reduce_mean(xentropy)
optimizer = tF.train.AdamOptimizer(learning_rate=1e-1)
training_op = optimizer.minimize(loss)

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

Epoch 0, train loss: 0.2580, eval loss: 0.5867
Epoch 1, train loss: 0.2572, eval loss: 0.5946
Epoch 2, train loss: 0.2569, eval loss: 0.6009
Epoch 3, train loss: 0.2567, eval loss: 0.6048
Epoch 4, train loss: 0.2567, eval loss: 0.6067
Epoch 5, train loss: 0.2566, eval loss: 0.6072
Epoch 6, train loss: 0.2566, eval loss: 0.6070
Epoch 7, train loss: 0.2566, eval loss: 0.6066
Epoch 8, train loss: 0.2565, eval loss: 0.6061
...
Epoch 686, train loss: 0.2553, eval loss: 0.5916

Я не могу понять, что не так с этой реализацией. У тебя есть идеи?

1 Ответ

0 голосов
/ 13 сентября 2018

Я обнаружил проблему: я не смог переопределить мои изображения, потому что в моей простой сети не было достаточно памяти для запоминания всех отображений ввода-> вывода (720 * 1280 = 921600 сопоставлений) только с 2 фильтрами со сверткой 1x1 (2 * 3 = 6 нейронов).

Решение состояло в том, чтобы вернуться к реализации FCN32 и попытаться установить подвыборку 512x512 одного изображения. Благодаря объединению слоев перед повышением сэмплирования выполняется классификация по пикселям для изображения 16x16. Учитывая размер слоев FC (2 слоя из 4096 фильтров и 1 слой из 2 фильтров - бинарная классификация), он смог правильно подобрать. Затем я попытался с изображением 720x1280, и это также сработало.

...