Keras 为什么我的深度学习模型总是给出1个类的输出?

Keras 为什么我的深度学习模型总是给出1个类的输出?,keras,conv-neural-network,Keras,Conv Neural Network,我在Keras上训练CNN模型,将图像分为两类。我有大约600张0级的图片和1000张1级的图片。我的模型如下所示。问题是它总是给我高样本类的输出。我试图将最后一个激活函数改为sigmoid,但毫无帮助。我还尝试添加批量规范化以及正则化和退出 def model(input_shape): #Define the input placeholder as a tensor with shape input_shape X_input = Input(input_shape)

我在Keras上训练CNN模型,将图像分为两类。我有大约600张0级的图片和1000张1级的图片。我的模型如下所示。问题是它总是给我高样本类的输出。我试图将最后一个激活函数改为sigmoid,但毫无帮助。我还尝试添加批量规范化以及正则化和退出

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

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

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

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

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

您是否规范化了数据?您的数据是关于什么的?是汽车吗?猫?还是跟生物学有关的?如果是肿瘤组织病理学图像,获得有关数据的任何信息也很重要。有两门课:恶性和良性。@MarcinMożejko是的,当然有。培训和验证?谢谢你的建议。我试着在训练集中增加和减少取样以达到班级平衡。我将我的集合分为训练集、val集和测试集。训练集和val集中有原始数据和扩充数据,但测试集只包含原始数据。在调优之后,我在val集上得到的结果约为90%,但当我使用测试集时,它仅给出76%。我的问题是,增加的数据是否会影响这个结果?数据增强包括水平和垂直翻转、添加噪声和模糊。