【问题标题】:Why one tensorflow model predicts different probs and Y for the same data?为什么一个张量流模型预测相同数据的不同概率和 Y?
【发布时间】: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


【解决方案1】:

标记器应该适合训练数据,并且您的测试/预测数据应该使用该标记器进行标记。

从您的代码看来,您正在创建一个新的分词器并将其拟合到您传递给模型以进行预测的测试数据(该模型是根据由不同分词器分词的数据进行训练的)。

最重要的是,Tokenizernum_words 参数从它所拟合的数据语料库中选择最常用的词。但是,由于您的预测数据具有不同的标记器(仅适用于测试语料库),因此它可能具有完全不同的最常用词。

代码更改:

# tokenizer = Tokenizer(num_words=top_words) # remove line
# tokenizer.fit_on_texts(X)  #remove line

然后使用您用来标记训练数据的标记器来标记 (texts_to_sequences()) 您的测试数据。

(注意:此建议严格基于问题中提供的代码sn-p)

【讨论】:

  • 我会在白天测试它,然后我会在这里返回结果。现在,非常非常感谢!!!
  • 圣洁... @mb850 你是对的!!!现在它起作用了......真是一个无意识的错误......再次感谢!
猜你喜欢
  • 2020-06-04
  • 1970-01-01
  • 2013-12-08
  • 2016-10-01
  • 2017-01-04
  • 2017-11-22
  • 1970-01-01
  • 2021-01-27
相关资源
最近更新 更多