python - 仅预测单类
问题描述
我使用 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)
解决方案
似乎您在输出中使用了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。
推荐阅读
- javascript - 为什么组件不会响应自定义事件?
- r - 功能问题。Tidyeval过滤
- windows - FMX 表单不会通过单击任务栏最小化;动画不起作用
- laravel - 如何获取属于模型类的所有记录作为 1-M 多态关系的关系
- c# - 从前面带有分隔符的文本中删除单词(使用正则表达式)
- reactjs - 无法在 docker 容器中运行的 nginx 上的子目录下部署 react 应用程序
- java - 为什么缺少授权标头?
- libgdx - 有没有办法在表格内以圆形图案排列按钮?
- python - 用于 Django 模板中的后端调用的 GraphQL/Graphene
- angular - Bootstrap 4侧边栏折叠不起作用 - Angular 6