我正在构建用于图像分割的全卷积网络体系结构。对于每个图像,我都希望对类别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
我无法弄清楚此实现有什么问题。你有什么主意吗?
答案 0 :(得分:0)
我发现了问题:我无法对图像进行过拟合,因为我的简单网络没有足够的内存来存储所有2个1x1卷积滤波器的输入->输出映射(720 * 1280 = 921600映射)(2 * 3 = 6个神经元)。
解决方案是回到FCN32实现,并尝试过度拟合一个图像的512x512子样本。多亏了合并层,在上采样之前,每像素分类是在16x16图像上完成的。给定FC层的大小(2层4096个过滤器和1层2个过滤器-二进制分类),它能够适当地过拟合。然后,我尝试使用720x1280的图像,效果也很好。