Machine learning Keras:多类NLP任务中的模型评估与模型预测精度差异

Machine learning Keras:多类NLP任务中的模型评估与模型预测精度差异,machine-learning,deep-learning,keras,Machine Learning,Deep Learning,Keras,我正在keras中为NLP任务训练一个简单的模型,代码如下。变量名对于训练集、测试集和验证集是自解释的。这个数据集有19个类,所以网络的最后一层有19个输出。标签也是热编码的 nb_类=19 model1=Sequential() 模型1.添加(嵌入)(nb_单词, 他说,, 权重=[嵌入矩阵], 输入长度=最大序列长度, 可培训=错误) 模型1.add(LSTM(num_LSTM,dropout=rate_drop_LSTM,returnal_dropout=rate_drop_LSTM))

我正在keras中为NLP任务训练一个简单的模型,代码如下。变量名对于训练集、测试集和验证集是自解释的。这个数据集有19个类,所以网络的最后一层有19个输出。标签也是热编码的

nb_类=19
model1=Sequential()
模型1.添加(嵌入)(nb_单词,
他说,,
权重=[嵌入矩阵],
输入长度=最大序列长度,
可培训=错误)
模型1.add(LSTM(num_LSTM,dropout=rate_drop_LSTM,returnal_dropout=rate_drop_LSTM))
模型1.添加(辍学率(辍学率)
model1.add(BatchNormalization())
模型1.add(密集(num_密集,激活=act))
模型1.添加(辍学率(辍学率)
model1.add(BatchNormalization())
model1.add(密集(nb_类,激活='sigmoid'))
model1.compile(loss='binary\u crossentropy',optimizer='adam',metrics=['accurity'])
#一个热编码所有标签
ytrain\u enc=np\u utils.to\u分类(列车标签)
yval_enc=np_utils.to_category(val_标签)
YTESTENT=np_utils.to_category(测试标签)
模型1.拟合(列车数据、ytrain enc、,
验证数据=(val数据,yval enc),
纪元=200,
批次尺寸=384,
洗牌=正确,
详细=1)
在第一个纪元之后,这给了我这些输出

纪元1/200
216632/216632[===========================================================================-2442s-损失:0.1427-会计科目:0.9443-会计科目:0.0526-会计科目:0.9826
然后,我在测试数据集上评估了我的模型,这也显示了大约0.98的准确性

model1.评估(测试数据,y=ytestence,批大小=384,详细=1)
但是,标签是一个热编码的,所以我需要类的预测向量,以便生成混淆矩阵等。所以我使用

PREDICTED\u CLASSES=model1.PREDICTED\u CLASSES(测试数据,批量大小=384,详细程度=1)
温度=总和(测试标签==预测类)
温度/透镜(测试标签)
0.83

这表明总预测类的准确率为83%,然而
model1。evaluate
显示了98%的准确率!!我做错了什么?我的损失函数可以用分类类标签吗?我为预测层选择的
sigmoid
激活函数可以吗?或者keras评估模型的方式存在差异?请就可能出现的问题提出建议。这是我第一次尝试建立一个深入的模型,因此我对这里的错误没有太多的理解。

我发现了问题所在<代码>度量=['accurity']根据成本函数自动计算准确度。因此,使用
binary\u crossentropy
显示二进制精度,而不是分类精度。使用
categorical\u crossentropy
会自动切换到分类精度,现在它与使用
model1.predict()手动计算的结果相同。余扬正确地指出了多类问题的代价函数和激活函数

附言:通过使用
metrics=['binary\u-accurity','category\u-accurity']

Great catch(+1),可以同时获得分类和二元精度-不幸的是,我不得不从头开始重新发现和理解这个问题-请参阅-尽管如此,我还是更新了我的答案以链接到您的答案。。。