【问题标题】:Why my deep learning model always give an output of 1 class?为什么我的深度学习模型总是给出 1 类的输出?
【发布时间】:2018-01-13 10:44:32
【问题描述】:

我正在 Keras 上训练一个 CNN 模型来对属于 2 个类别的图像进行分类。我有大约 600 张 0 类图像和 1000 张 1 类图像。我的模型如下所示。问题是它总是给我更高样本的类的输出。我试图将最后一个激活函数更改为 sigmoid,但它根本没有帮助。我还尝试添加批量标准化以及正则化和 dropout。

def model(input_shape):
    #Define the input placeholder as a tensor with shape input_shape
    X_input = Input(input_shape)
    # First layer
    X = Conv2D(32,(5,5),strides=(1,1),padding='same',name='conv1')(X_input)
    X = BatchNormalization()(X)
    X = Activation('relu')(X)
    X = MaxPooling2D((3,3),strides=2,name='pool1')(X)

# Second layer
    X = Conv2D(32,(5,5),strides=(1,1),padding='same',name='conv2')(X)
    X = BatchNormalization()(X)
    X = Activation('relu')(X)
    X = AveragePooling2D((3,3),strides=2,name='pool2')(X)

# Third layer
    X = Conv2D(64,(5,5),strides=(1,1),padding='same',name='conv3')(X)
    X = BatchNormalization()(X)
    X = Activation('relu')(X)
    X = AveragePooling2D((3,3),strides=2,name='pool3')(X)

# Flatten
    X = Flatten()(X)
    X = Dense(64,activation='softmax',name='fc1')(X)
    X = dropout(0.5)(X)
    X = Dense(2,activation='softmax',name='fc2')(X)

# Create the model
    model = Model(inputs = X_input,outputs = X)

    return model

【问题讨论】:

  • 你的数据标准化了吗?
  • 您的数据是关于什么的?是汽车吗?猫?或与生物学有关的东西?掌握有关数据的任何信息也很重要。
  • @FalconUA 这是肿瘤组织病理学图像。有 2 类:恶性和良性。
  • @MarcinMożejko 是的,当然。
  • 训练和验证?

标签: keras conv-neural-network


【解决方案1】:

好的,您有一个 2 类分类问题,其中类中的样本数量不平衡。这个问题在医学诊断中尤其常见,不仅让您头疼。

您已经说过您正在解决的具体问题是对肿瘤组织病理学图像进行分类。这些图像的模式非常丰富,因此总共 1600 张图像通常不足以学习有意义的特征和表示。 minibatch 中的分布也是不平衡的,因此梯度总是会稍微向一类分类的局部最小值移动(假设其他过滤器会产生随机噪声,因为它们没有时间学习有意义的特征)。

但是,有几种技术可以提高性能:

  • 修剪较大的类,使每个类的样本数大致相同。因此,在您的情况下,将具有 1000 个样本的类减少到 600 个左右。
  • 如果您不想使用较少的数据进行训练,请尝试为每个类分配权重Here 是一个简短示例的链接。因此,在您的特定情况下,您有600A 的图像和1000B 的图像。因此,您可以将权重 1.0 分配给 B 类,将 10/6 分配给 A 类。
  • 如上所述,1600 个样本不足以学习有意义的特征。特别是当你有一个深度神经网络时。因此,您可以尝试迁移学习。可以在here 找到非常详细的教程(这是关于 SO 文档的教程)。请务必仔细查看教程中图层的可视化效果。
  • 此外,为了测试模型的能力,您可能需要尝试故意过拟合。可以在here 找到快速清单。

【讨论】:

  • 感谢您的建议。我尝试了增强和欠采样以在训练集中获得类平衡。我将我的集合分为训练集、验证集和测试集。训练和验证集中有原始数据和增强数据,但测试集中只包含原始数据。调整后我在 val 集上得到的结果是 ~90%,但是当我使用测试集时,它只给出了 76%。我的问题是增强数据是否会影响此结果?数据增强包括水平和垂直翻转、添加噪声和模糊。
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 2019-11-30
  • 2018-02-04
  • 1970-01-01
  • 2023-04-10
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多