如何在损失很小的情况下修复深度学习中的零精度

2024-04-19 06:47:29 发布

您现在位置: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)

the loss plot


Tags: 模型build目标modelplotlayersdefplt
1条回答
网友
1楼 · 发布于 2024-04-19 06:47:29

您正在使用loss='binary_crossentropy'layers.Dense(1,activation='sigmoid'),它们用于二进制分类问题

因为您希望预测5个类中的一个,所以您正在考虑一个多类问题

如果您的目标是一个热编码的,看起来是这样的:[0,1,0,0,0]对于一个类,您应该使用layers.Dense(5,activation='softmax')loss='categorical_crossentropy'

如果您的目标不是一个热编码的,这意味着响应是一个引用类号的整数,在前面的示例中是[1](正类的位置),那么您应该使用layers.Dense(5,activation='softmax'),并将loss函数更改为loss='sparse_categorical_crossentropy',因为您的目标变量被编码为稀疏向量(指零向量中包含1的项的索引)

相关问题 更多 >