Keras 为什么我的深度学习模型总是给出1个类的输出?
我在Keras上训练CNN模型,将图像分为两类。我有大约600张0级的图片和1000张1级的图片。我的模型如下所示。问题是它总是给我高样本类的输出。我试图将最后一个激活函数改为sigmoid,但毫无帮助。我还尝试添加批量规范化以及正则化和退出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)
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
,为a类分配权重1.0
10/6
- 如上所述,1600个样本不足以学习有意义的特征。特别是当你有一个很深的神经网络的时候。因此,你可以尝试的是转移学习。可以找到一个非常详细的教程(这是一个关于SO文档的教程)。确保在教程中仔细查看图层的可视化效果
- 此外,为了测试模型的性能,您可能需要尝试有意过度拟合。可以找到快速检查表