我正在尝试使用Keras构建文本标签(多标签)神经网络。
我建立了约2000个单词的字典,并将训练样本编码为长度为140(带填充)的单词索引的序列。
结果数据看起来像size (num_samples, 140)
的2D数组。样本数量约为3万。
这是我的神经网络上的定义
mdl = Sequential()
mdl.add(Embedding((vocab_len + 1), 300, input_length=140))
mdl.add(LSTM(100))
mdl.add(Dense(train_y.shape[1], activation="sigmoid"))
mdl.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=["accuracy"])
history = mdl.fit(train_x, train_y, epochs=4, verbose=1, validation_data=(valid_x, valid_y), batch_size=100)
在训练期间,Keras在训练数据和验证数据上均显示约0.93的准确性。看起来很有希望。
但是当我尝试对测试数据调用预测时
pred_y = mdl.predict(test_x, batch_size=100)
我得到一个数组,其中所有行看起来都相同,且所有行均小于0.5。因此,没有在任何测试样品上设置标签。
Sample output from mdl.predict()
如果我在刚用于训练模型的相同训练数据上运行predict()
,则会观察到相同的行为。
但是,如果我运行mdl.evaluate()
,则模型拟合期间的准确度将达到0.93。
我在做什么错了?
答案 0 :(得分:0)
如果您的班级不平衡,那么准确度就不是一个好的指标。成像您的数据集包含80%的0和20%的1。您可以创建一个在所有情况下均返回0的模型,其准确度等于80%。
答案 1 :(得分:0)
@
将输出每个类别的概率
model.predict(test_x, batch_size=100)
将输出最可能的类别/实际预测
因此,从您的问题来看,您似乎想要model.predict_classes(test_x, batch_size=100)
。运行model.predict_classes
以查看所有可用功能。
如果要从dir(model)
输出生成model.predict_classes
输出,请执行
model.predict
这是什么,它遍历了每一行,例如,下面是model.predict的输出,其中包含class1,class2,class3的概率
[[0.15,0.73,0.02],#注意概率总和= 1
[0.23,0.33,0.44]
找到最大概率的索引,即0.73的索引为1,并创建该索引的数组,因此输出为[1、2]。
pred = model.predict()
pred_classes_output = pred.argmax(axis=1)
对model.evaluate
进行检查。
我也希望您能理解,如果您的样本存在固有的偏倚,比如说您有90个1级,10个2级,那么只要预测1即可获得90%的准确度,即基线准确度。