首页 > 解决方案 > 仅预测单类

问题描述

我使用 VGG16 实现迁移学习,对糖尿病视网膜病变二元分类进行分类。即使在平衡了类之后,我的模型也只能预测单个类。为什么会这样。下面是我的代码

base_model=VGG16(weights='imagenet',include_top=False) #imports the mobilenet model and discards the last 1000 neuron layer.

x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(1024,activation='relu')(x) #we add dense layers so that the model can learn more complex functions and classify for better results.
x=Dense(1024,activation='relu')(x) #dense layer 2
x=Dense(512,activation='relu')(x) #dense layer 3
preds=Dense(1,activation='softmax')(x) #final layer with softmax activation
vgg=Model(inputs=base_model.input,outputs=preds)

标签: pythonconv-neural-network

解决方案


似乎您在输出中使用了softmax激活函数。当您对具有多个可能类别的输入进行分类时,通常使用 Softmax,因为它输出概率分布(即所有元素总和为 1)。它首先对每个元素求幂,然后将每个元素除以所有元素的总和。

但是,如果您只有一个输出单元,则必须始终输出 1,因为它将计算 exp(x_1) / exp(x_1) = 1

对于您正在执行的二进制分类任务,我建议您改用sigmoid输出激活函数:

base_model=VGG16(weights='imagenet',include_top=False) #imports the mobilenet model and discards the last 1000 neuron layer.

x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(1024,activation='relu')(x) #we add dense layers so that the model can learn more complex functions and classify for better results.
x=Dense(1024,activation='relu')(x) #dense layer 2
x=Dense(512,activation='relu')(x) #dense layer 3
preds=Dense(1,activation='sigmoid')(x) #final layer with softmax activation
vgg=Model(inputs=base_model.input,outputs=preds)

这假设您的训练数据集中的标签是 0 和 1。


推荐阅读