【问题标题】:How to match predicted class and prabablity with actual labels如何将预测的类别和概率与实际标签相匹配
【发布时间】:2021-03-13 10:41:48
【问题描述】:

我已经训练了一个基于双向 LSTM 和密集层输出的深度学习模型。使用model.predict(x) 获得的输出概率与我的实际标签(一个热编码标签)匹配是非常令人困惑的。此外,model.predict_classes(x) 输出 (0,1,2) 也令人困惑。我如何将这些输出与我的原始标签联系起来。下面是我的代码 sn-p 供参考:

model = Sequential()

model.add(Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))
model.add(SpatialDropout1D(0.5))


model.add(Bidirectional(tf.keras.layers.LSTM(250, return_sequences=True,activation='tanh')))
model.add(Bidirectional(tf.keras.layers.LSTM(250)))

model.add(Dropout(0.5))



model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
#model.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy'])
print(model.summary())

history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10)

model.predict_classes(test_doc)
model.predict(test_doc)

如果有人请帮助识别此序列模型中带有实际标签的输出。

【问题讨论】:

  • 如果没有看到您对标签所做的任何处理,很难判断
  • @NicolasGervais 我已经使用Y = pd.get_dummies(df['Sentiment']).values在单热编码中转换了我的标签,即 0,1,2

标签: python tensorflow deep-learning predict one-hot-encoding


【解决方案1】:

假设您为标签 (0, 1, 2) 进行了一次热编码,您将拥有向量作为模型的输出。

因此,例如,如果您有一个类别为 0 的实例,您的目标向量将是:

[1, 0, 0]

如果你有一个类 1 的实例,你的目标向量将是:

[0, 1, 0]

如果你有一个类 2 的实例,你的目标向量将是:

[0, 0, 1]

.predict 方法将为您提供目标中每个类别的概率。因此,因为您有 3 个类(0、1、2),所以您将获得一个大小为 3 且具有三个概率的向量

model.predict(x) # vector of size 3 with 3 probabilities

类似这样的:

#class0, class1, class2
[0.31,   0.4,    0.29]

并且这些概率总和为 1,因为您使用了 softmax 激活函数。

方法.predict_classes,会为你从向量中选择概率最高的类进行解码

所以如果你有一个概率向量:

#class0, class1, class2
[0.31,   0.4,    0.29]

你会得到 1,因为向量中的最大值是目标向量中索引为 1 的值,它代表类 1

PS。您可以让模型进行一次热编码,将损失更改为“sparse_categorical_crossentropy”:

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

不使用pd.get_dummies(df['Sentiment']).value

【讨论】:

  • 感谢您的友好回答。问题仍然不清楚,我们应该以什么顺序考虑概率。因为标签为 1 的文档可能会先出现,而 0 和 2 可能会在后出现。
  • @BilalChandio 尝试使用“sparse_categorical_crossentropy”进行编码。不使用 pd.get_dummies(df['Sentiment']).value
  • sparse_categorical_crossentropy 适用于类数较多的情况。但是,我也尝试过,但我的网络要求标签是单热编码的。
  • 稀疏分类交叉熵将您的标签在后台转换为一个热编码器向量
  • 这个问题仍然没有答案,这些array([[0.31454232, 0.181991 , 0.50346667]], dtype=float32) 中的哪个概率代表0,1 或2 类
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 2020-08-25
  • 2018-12-24
  • 2022-06-28
  • 2020-04-13
  • 2016-11-19
  • 1970-01-01
  • 2017-12-23
相关资源
最近更新 更多