python - 使用 LSTM 层在 Keras 中进行预测
问题描述
我正在尝试使用 Keras 构建文本标签(多标签)神经网络。
我已经建立了一个大约 2000 个单词的字典,并将训练样本编码为长度为 140 的单词索引序列(带有填充)。
由于结果数据看起来像一个 2D 数组size (num_samples, 140)
。样本数量约为 30k。
这是我的神经网络的定义
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。因此,没有在任何测试样本上设置标签。
如果我predict()
在刚刚用于训练模型的相同训练数据上运行,则会观察到相同的行为。
但是如果我运行,mdl.evaluate()
我会得到与模型拟合过程中显示的相同的 0.93 精度。
我究竟做错了什么?
解决方案
如果您的类不平衡,则准确性不是很好的指标。成像您有一个包含 80% 的 0 和 20% 的 1 的数据集。您可以创建一个在所有情况下都返回 0 的模型,其准确率将等于 80%。
推荐阅读
- pandas - 如何在除交叉表之外的 Pandas 中进行 groupby 语句
- c++ - 在主文件中声明命名空间不会延续到头文件:“使用命名空间标准;”
- java - 为什么在打印空引用时不调用覆盖的 toString
- android - 查询文档时,任务在 Firestore 中重复
- python - UnicodeDecodeError:“utf-8”编解码器无法解码位置 0-1 中的字节:无效的继续字节
- r - doc_parse_raw 中的错误(x,编码 = 编码,base_url = base_url,as_html = as_html,:内部错误:大量输入查找 [1]
- c# - Xamarin 谷歌地图
- javascript - 多个循环和推送到数组的问题
- javascript - ReferenceError {wildcard} 未定义 firebase 云函数
- node.js - MERN API GET 请求在 Heroku 上返回 404,适用于本地 Raspi 服务器