【发布时间】:2020-10-06 21:16:08
【问题描述】:
我尝试预测不同消息的标签(36 类)。我为 Keras 使用 LSTM 和 tensorflow。当我预测 11 条消息的标签 (Y) 时,我得到了一些结果。但是,当我预测 59 条消息(11 + 48 条新行)的标签时,这 11 条更改的预测...
网络很简单:
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
tf.keras.layers.LSTM(embedding_dim2, dropout=0.5, recurrent_dropout=0.5),
tf.keras.layers.Dense(n_class, activation='softmax')])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
rnn= model.fit(X_train, y_train, epochs= nb_epoch, batch_size=batch_size,validation_split=0.1, shuffle=True)
score = model.evaluate(X_test,y_test)
训练结束后,我在未标记的数据上测试模型。我使用了 W2V 和典型的 model.predict(unlabeled_data) 函数。这是结果
(Y)标签 30 28 1 28 31 27 31 30 30 30 0
当我添加新的 38 行时,前十一个的结果。
(Y)标签 28 30 28 28 27 1 31 31 0 28 31 31 31 28 31 31 27 30 4 ...
有人知道我做错了什么吗?据我所知,处理更简单的帧(Sklearn),如果我使用相同的模型,相同消息的结果应该不会有所不同。 Jupyter 和 PyCharm(生产代码)中的相同故事。
感谢您的帮助。
如何准备数据和进行预测?
从 csv 加载
data = pd.read_csv("path", sep=';', usecols=['text'])
X = data['text']
tokenizer = Tokenizer(num_words=top_words)
tokenizer.fit_on_texts(X)
sequences_train = tokenizer.texts_to_sequences(X)
word_index = tokenizer.word_index
X_padded = sequence.pad_sequences(sequences_train, maxlen=mxlen)
然后我预测
prediction = model.predict(X_padded)
df_prediction = pd.DataFrame(prediction)
df_prediction['num_max'] = df_prediction.max(axis=1)
df_prediction['label'] = df_prediction.idxmax(axis=1)
pred = df_prediction.iloc[:, 37:39]
print(pred)
在下一条线索中,我更改了输入,但代码保持不变。
【问题讨论】:
-
也许其他人可以给出更好或更详细的答案,但这通常源于随机性问题。通过为 NumPy 设置随机种子并尽可能设置 random_state 参数,您可以更好地复制结果。初始化网络时固有的随机性会导致问题。
-
但是在预测过程中,权重不应该改变,对吧?
-
好吧,但是当我为相同的输入(11 条消息两次)重新运行预测时,预测保持不变。仅当 11 条消息是较大集合的一部分时,预测才会发生变化...我使用相同的标记器和 W2V...
-
@mb0850 权重是什么意思?在这个例子中我不使用 wieghts(平衡数据)?可能我没看懂……
-
只是为了确保我理解你在说什么,在预测时,你传递了 11 个句子/序列并得到 11 个预测。然后,您将 11 个序列附加 48 行并获得总共 59 个预测,但您会看到 59 个预测中的前 11 个与之前的预测不匹配,我假设您没有重新训练您的模型-在预测之间。对吗?
标签: python tensorflow keras