用于图像分割的 Tensorflow:批量归一化性能最差
Tensorflow for image segmentation: Batch normalization has worst performance
我正在使用 TensorFlow 解决 multi-target 回归问题。具体来说,在用于 pixel-wise 标记的全卷积残差网络中,输入是图像,标签是掩码。在我的例子中,我使用大脑 MR 作为图像,标签是肿瘤的掩码。
我使用我的网络取得了相当不错的成绩:
虽然我确信还有改进的余地。因此,我想添加批量归一化。我是这样实现的:
# Convolutional Layer 1
Z10 = tf.nn.conv2d(X, W_conv10, strides = [1, 1, 1, 1], padding='SAME')
Z10 = tf.contrib.layers.batch_norm(Z10, center=True, scale=True, is_training = train_flag)
A10 = tf.nn.relu(Z10)
Z1 = tf.nn.conv2d(Z10, W_conv1, strides = [1, 2, 2, 1], padding='SAME')
Z1 = tf.contrib.layers.batch_norm(Z1, center=True, scale=True, is_training = train_flag)
A1 = tf.nn.relu(Z1)
对于我的网络的每个转换层和转置层。但结果并不是我所期望的。具有批量归一化的网络性能很差。橙色是没有批量归一化的网络损失,而蓝色是:
不仅网络学习速度变慢,而且在使用批归一化的网络中预测的标签也很糟糕。
有人知道为什么会这样吗?
这可能是我的成本函数吗?我目前正在使用
loss = tf.nn.sigmoid_cross_entropy_with_logits(logits = dA1, labels = Y)
cost = tf.reduce_mean(loss)
这可能是一个幼稚的猜测,但也许您的批量大小太小了。如果批处理足够大以表示层输入值的分布,则归一化可能会很好。如果批次太小,标准化可能会丢失信息。
由于输入图像大小 (1600x1200x3),批处理大小必须很小 (<10)。我在语义分割任务上也遇到了批归一化问题。
对于与通过网络传递的语义信息相关的任务,批量归一化是一个糟糕的归一化选择。查看条件规范化方法 - 自适应实例规范化等以理解我的观点。另外,本文 - https://arxiv.org/abs/1903.07291。批量归一化洗掉了网络的所有语义信息。
我使用 PASCAL VOC2012 数据集在 FCN - 8 架构上尝试了批归一化。
正如其他人在上面提到的那样,它给出了糟糕的结果,但是该模型在没有批量归一化层的情况下表现良好。我对网络表现不佳的假设之一是,在解码器架构中,我们主要关注使用 CNN 作为媒介以可学习的方式对特征 space 进行上采样,因为问题的特征图设置在在提取特征的基网末尾执行 1x1 转换。
我们甚至将从编码器输出的前几层添加到解码器(受 resnet 架构启发),这样做的原因是为了减少深层架构中梯度消失问题的影响。
当我们想要从图片或图片的子区域中预测某些 类 时,批量归一化效果非常好,因为我们没有解码器架构来对预测的特征进行上采样 space.
如有错误请指正
我正在使用 TensorFlow 解决 multi-target 回归问题。具体来说,在用于 pixel-wise 标记的全卷积残差网络中,输入是图像,标签是掩码。在我的例子中,我使用大脑 MR 作为图像,标签是肿瘤的掩码。
我使用我的网络取得了相当不错的成绩:
虽然我确信还有改进的余地。因此,我想添加批量归一化。我是这样实现的:
# Convolutional Layer 1
Z10 = tf.nn.conv2d(X, W_conv10, strides = [1, 1, 1, 1], padding='SAME')
Z10 = tf.contrib.layers.batch_norm(Z10, center=True, scale=True, is_training = train_flag)
A10 = tf.nn.relu(Z10)
Z1 = tf.nn.conv2d(Z10, W_conv1, strides = [1, 2, 2, 1], padding='SAME')
Z1 = tf.contrib.layers.batch_norm(Z1, center=True, scale=True, is_training = train_flag)
A1 = tf.nn.relu(Z1)
对于我的网络的每个转换层和转置层。但结果并不是我所期望的。具有批量归一化的网络性能很差。橙色是没有批量归一化的网络损失,而蓝色是:
不仅网络学习速度变慢,而且在使用批归一化的网络中预测的标签也很糟糕。
有人知道为什么会这样吗? 这可能是我的成本函数吗?我目前正在使用
loss = tf.nn.sigmoid_cross_entropy_with_logits(logits = dA1, labels = Y)
cost = tf.reduce_mean(loss)
这可能是一个幼稚的猜测,但也许您的批量大小太小了。如果批处理足够大以表示层输入值的分布,则归一化可能会很好。如果批次太小,标准化可能会丢失信息。 由于输入图像大小 (1600x1200x3),批处理大小必须很小 (<10)。我在语义分割任务上也遇到了批归一化问题。
对于与通过网络传递的语义信息相关的任务,批量归一化是一个糟糕的归一化选择。查看条件规范化方法 - 自适应实例规范化等以理解我的观点。另外,本文 - https://arxiv.org/abs/1903.07291。批量归一化洗掉了网络的所有语义信息。
我使用 PASCAL VOC2012 数据集在 FCN - 8 架构上尝试了批归一化。 正如其他人在上面提到的那样,它给出了糟糕的结果,但是该模型在没有批量归一化层的情况下表现良好。我对网络表现不佳的假设之一是,在解码器架构中,我们主要关注使用 CNN 作为媒介以可学习的方式对特征 space 进行上采样,因为问题的特征图设置在在提取特征的基网末尾执行 1x1 转换。
我们甚至将从编码器输出的前几层添加到解码器(受 resnet 架构启发),这样做的原因是为了减少深层架构中梯度消失问题的影响。
当我们想要从图片或图片的子区域中预测某些 类 时,批量归一化效果非常好,因为我们没有解码器架构来对预测的特征进行上采样 space.
如有错误请指正