【问题标题】:Tensorflow for image segmentation: Batch normalization has worst performance用于图像分割的 TensorFlow:批量归一化性能最差
【发布时间】:2018-08-16 03:33:19
【问题描述】:

我正在使用 TensorFlow 解决多目标回归问题。具体来说,在一个完全卷积的残差网络中,用于逐像素标记,输入是图像,标签是掩码。在我的例子中,我使用大脑 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)

【问题讨论】:

    标签: tensorflow deep-learning image-segmentation batch-normalization


    【解决方案1】:

    这可能是一个幼稚的猜测,但也许你的批量太小了。如果批次足够大以表示层输入值的分布,则归一化可能会很好。如果批次太小,信息可能会因标准化而丢失。 由于输入图像大小 (1600x1200x3),批处理大小必须很小 (

    【讨论】:

    • 嗨@ewbasso,谢谢你的建议。我一直在尝试改变小批量的大小,但我的结果很糟糕。 [见问题] (stackoverflow.com/questions/50239137/…) 你对为什么改变批量大小会停止学习过程有什么建议吗?
    【解决方案2】:

    对于与通过网络传递的语义信息相关的任务,批量规范化是一种糟糕的规范化选择。查看条件规范化方法 - 自适应实例规范化等以理解我的观点。此外,这篇论文 - https://arxiv.org/abs/1903.07291。批归一化洗掉了网络的所有语义信息。

    【讨论】:

      【解决方案3】:

      我尝试使用 PASCAL VOC2012 数据集在 FCN - 8 架构上进行批量标准化。 正如其他人在上面提到的那样,它给出了糟糕的结果,但是在没有批量归一化层的情况下,该模型表现良好。我对网络性能不佳的一个假设是,在解码器架构中,我们主要关注的是使用 CNN 作为媒介以可学习的方式对特征空间进行上采样,因为问题的特征图是在 1x1 卷积中设置的提取特征的base net的末端。

      我们甚至将编码器的前几层输出添加到解码器(受 resnet 架构的启发),这样做的原因是为了减少更深架构中梯度消失问题的影响。

      当我们想要从图片或图片的子区域预测某些类别时,批归一化效果非常好,因为我们没有解码器架构来对预测的特征空间进行上采样。

      如果我错了,请纠正我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 2017-08-16
        • 1970-01-01
        • 2017-07-01
        • 2021-03-20
        • 2018-06-08
        相关资源
        最近更新 更多