python - 如何在损失正常的情况下修复深度学习中的零精度
问题描述
我有一个 50x22 的数据集,其中包括 22 个特征。目标是对目标进行分类,从 1 到 5,相当于 5 个类。我使用了 98% 准确率的随机森林,但验证为 63%,这是不能令人满意的。这就是为什么我决定创建一个深度模型并创建一个具有 3 层的模型。损失的结果在 6.7*10e-4 左右是可以满足的,但精度固定为零。我认为我的代码有问题。所以有什么问题?
def build_and_compile_model(norm):
model = keras.Sequential([
norm,
layers.Dense(32, activation='relu'),
layers.Dense(32, activation='relu'),
layers.Dense(1,activation='sigmoid')
])
model.compile(optimizer='sgd',
loss='binary_crossentropy',
metrics=[tf.keras.metrics.Accuracy()])
return model
def plot_acc(history):
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.ylim([0, 1])
plt.xlabel('Epoch')
plt.ylabel('Accuracy [GSR]')
plt.legend()
plt.grid(True)
dnn_qoe_model = build_and_compile_model(feature_normalizer)
dnn_qoe_model.summary()
history = dnn_qoe_model.fit(
train_features[:22], train_labels,
validation_split=0.2,
verbose=0, epochs=100)
plot_acc(history)
解决方案
您正在使用loss='binary_crossentropy'
and layers.Dense(1,activation='sigmoid')
,它们用于二进制分类问题。
由于您要预测 5 个类别之一,因此您正在研究一个多类别问题。
如果您的目标是一个看起来像这样的热编码:[0,1,0,0,0]
对于一个类,您应该使用layers.Dense(5,activation='softmax')
and loss='categorical_crossentropy'
。
如果你的目标不是一个热编码的,这意味着响应是一个整数,指的是类号,[1]
在前面的例子中是(正类的位置),你应该使用layers.Dense(5,activation='softmax')
,并将损失函数更改为loss='sparse_categorical_crossentropy'
,如您的目标变量被编码为稀疏向量(指在零向量中包含 1 的项目的索引)
推荐阅读
- python - Repeated vowels and consonants in words in pandas
- c - IntelliSense 自动完成#include 路径但显示“无法打开源文件”错误
- java - 什么是 DeepLab Mobilenet v2 输出以及如何在 Android 上绘制分割掩码?
- libgit2sharp - 如何 Git 获取
使用 libgit2sharp? - javascript - 位于 select2 组件内的按钮的单击事件不会触发
- node.js - 使用邮递员测试 api。但请求正在返回用户名或电子邮件无效
- python - Pyinstaller:QWebEngineView 不能很好地与其他模块配合使用
- laravel - vue for循环中的saldo计数器给出无限循环错误
- c++ - 为什么我不能将此转换后的 directory_iterator 插入向量中?
- r - 如何获取字符串中出现频率最高的字符?