为什么一个张量流模型针对同一数据预测不同的概率和Y?

时间:2020-10-06 21:16:08

标签: python tensorflow keras

我尝试预测不同消息的标签(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行时,结果为前11个。

(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)

在下一路径中,我更改输入,但是代码保持不变。

1 个答案:

答案 0 :(得分:3)

应在培训数据上安装令牌生成器,并使用该令牌生成器对您的测试/预测数据进行令牌化。

从您的代码看来,您似乎正在创建一个新的令牌生成器,并将其拟合到要传递给模型以进行预测的测试数据上(该模型已针对由其他令牌生成器令牌化的数据进行了训练)。

最重要的是,num_words的{​​{1}}自变量从其适合的数据集中选择最常见的单词。但是,由于您的预测数据具有不同的标记器(仅适用于测试语料库),因此它可能具有完全不同的最常用词。

代码更改:

Tokenizer

然后使用您用于标记训练数据的标记器来标记(# tokenizer = Tokenizer(num_words=top_words) # remove line # tokenizer.fit_on_texts(X) #remove line )测试数据。

注意:此建议严格基于问题中提供的代码段