Тензор потока: увеличение потерь CNN softmax - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь внедрить die U-Net в Tensorflow, но у меня не получается потерять сходство, оно увеличивается (значительно) независимо от скорости обучения.Я пробовал скорость обучения от 0,1 до 1,0E-8, чем ниже скорость, тем дольше убыток уменьшается, но в какой-то момент (когда потери все еще довольно высоки; при LR 1,0E-8 примерно на 600 итераций)потеря увеличивается до NaN.

Я предполагаю, что мой градиент взрывается, но я не знаю, как это исправить.Я заметил, что когда я использую сигмоид вместо кросс-энтропийной потери softmax, моя сеть действительно сходится.

Входной сигнал CNN представляет собой RGB-изображение формы [256, 256, 3] (значения 0-255) и метка с 3 классами формы [256, 256, 3], где каждое из 3 измерений состоит только из 0 и 1.

Вот мой код:

x_input = tf.placeholder(tf.float32, [None, 256, 256, 3])
y_input = tf.placeholder(tf.float32, [None, 256, 256, 3])

activation = tf.nn.elu

conv1_1 = tf.layers.conv2d(x_input, 64, 3, padding="same", activation=activation)
conv1_2 = tf.layers.conv2d(conv1_1, 64, 3, padding="same", activation=activation)
pool1_1 = tf.layers.max_pooling2d(conv1_2, pool_size=2, strides=2)

conv2_1 = tf.layers.conv2d(pool1_1, 64*2, 3, padding="same", activation=activation)
conv2_2 = tf.layers.conv2d(conv2_1, 64*2, 3, padding="same", activation=activation)
pool2_1 = tf.layers.max_pooling2d(conv2_2, pool_size=2, strides=2)

conv3_1 = tf.layers.conv2d(pool2_1, 64*2*2, 3, padding="same", activation=activation)
conv3_2 = tf.layers.conv2d(conv3_1, 64*2*2, 3, padding="same", activation=activation)
pool3_1 = tf.layers.max_pooling2d(conv3_2, pool_size=2, strides=2)

conv4_1 = tf.layers.conv2d(pool3_1, 64*2*2*2, 3, padding="same", activation=activation)
conv4_2 = tf.layers.conv2d(conv4_1, 64*2*2*2, 3, padding="same", activation=activation)
pool4_1 = tf.layers.max_pooling2d(conv4_2, pool_size=2, strides=2)

conv5_1 = tf.layers.conv2d(pool4_1, 64*2*2*2*2, 3, padding="same", activation=activation)
conv5_2 = tf.layers.conv2d(conv5_1, 64*2*2*2*2, 3, padding="same", activation=activation)

deconv6_1 = tf.layers.conv2d_transpose(conv5_2, 64*2*2*2, 2, strides=2, padding="valid", activation=activation)
cc6_1 = crop_concat(conv4_2, deconv6_1)
conv6_1 = tf.layers.conv2d(cc6_1, 64*2*2*2, 3, padding="same", activation=activation)
conv6_2 = tf.layers.conv2d(conv6_1, 64*2*2*2, 3, padding="same", activation=activation)

deconv7_1 = tf.layers.conv2d_transpose(conv6_2, 64*2*2, 2, strides=2, padding="valid", activation=activation)
cc7_1 = crop_concat(conv3_2, deconv7_1)
conv7_1 = tf.layers.conv2d(cc7_1, 64*2*2, 3, padding="same", activation=activation)
conv7_2 = tf.layers.conv2d(conv7_1, 64*2*2, 3, padding="same", activation=activation)

deconv8_1 = tf.layers.conv2d_transpose(conv7_2, 64*2, 2, strides=2, padding="valid", activation=activation)
cc8_1 = crop_concat(conv2_2, deconv8_1)
conv8_1 = tf.layers.conv2d(cc8_1, 64*2, 3, padding="same", activation=activation)
conv8_2 = tf.layers.conv2d(conv8_1, 64*2, 3, padding="same", activation=activation)

deconv9_1 = tf.layers.conv2d_transpose(conv8_2, 64, 2, strides=2, padding="valid", activation=activation)
cc9_1 = crop_concat(conv1_2, deconv9_1)
conv9_1 = tf.layers.conv2d(cc9_1, 64, 3, padding="same", activation=activation)
conv9_2 = tf.layers.conv2d(conv9_1, 64, 3, padding="same", activation=activation)

logits = tf.layers.conv2d(conv9_2, 3, 1, padding="same", activation=None)

# ------------------------------------------------------

flat_logits = tf.reshape(logits, [-1, 3])
flat_labels = tf.reshape(y_input, [-1, 3])

#loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=flat_labels, logits=flat_logits) # seems to work
loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=flat_labels, logits=flat_logits)
loss = tf.reduce_mean(loss)

optimizer = tf.train.AdamOptimizer(0.0001).minimize(loss)
...