Tensorflow 不能在单个图像上过度拟合简单卷积

Tensorflow 不能在单个图像上过度拟合简单卷积,tensorflow,conv-neural-network,image-segmentation,Tensorflow,Conv Neural Network,Image Segmentation,我正在为图像分割构建一个完全卷积的网络架构。对于每幅图像,我想对后面的每一个像素进行分类,无论是从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

我正在为图像分割构建一个完全卷积的网络架构。对于每幅图像,我想对后面的每一个像素进行分类,无论是从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

我不知道这个实现有什么问题。你有什么想法吗?

我发现了问题:我不能过度拟合我的图像,因为我的简单网络没有足够的内存来记忆所有的输入->输出映射720*1280=921600映射,只有2个带1x1卷积的过滤器2*3=6个神经元


解决方案是回到FCN32实现,并尝试过拟合一个图像的512x512子样本。得益于池层,在上采样之前,每像素分类在16x16图像上完成。考虑到FC层的大小(2层4096个过滤器和1层2个过滤器-二进制分类),它能够适当地过度拟合。然后我尝试了720x1280的图像,效果也不错。

你忘了问问题。事实上,我编辑了这篇文章。删除了relu激活。在最初的VGG16实现中,所有卷积层都使用了relu激活功能,所以应该可以使用它。此外,我测试了它没有,没有明显的改善。