首页 > 解决方案 > 如何在损失正常的情况下修复深度学习中的零精度

问题描述

我有一个 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)

损失图

标签: pythontensorflowkerasdeep-learning

解决方案


您正在使用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 的项目的索引)


推荐阅读