我正在用Keras构建用于文本分类的LSTM,并且在玩不同的输入句子以了解正在发生的事情,但是却得到了奇怪的输出。例如:
句子1 =“星期二,现年51岁的[Mary] Barra女士被任命为下一任GM首席执行官,同时也是第一位在大公司担任高级职位的女性,完成了一次非凡的个人旅程。汽车公司。”
句子2 =“星期二,现年51岁的[玛丽]巴拉女士被任命为通用汽车的下一任首席执行官,也是第一位在一家大型汽车公司担任高级职务的女性。 >
当句子2是输入数组中的唯一元素时,该模型预测类“目标”(0),输出0.4242。它预测“主观”(1),句子1的输出为0.9061。如果它们(作为单独的字符串)都作为输入被输入到同一数组中,则它们都被分类为“主观”(1)-但是句子1的输出为0.8689和2输出0.5607。似乎它们正在影响彼此的输出。每个句子在输入数组中的哪个索引都没有关系。
代码如下:
max_length = 500
from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=5000, lower=True,split=' ')
tokenizer.fit_on_texts(dataset["sentence"].values)
#print(tokenizer.word_index) # To see the dicstionary
X = tokenizer.texts_to_sequences(dataset["sentence"].values)
X = pad_sequences(X, maxlen=max_length)
y = np.array(dataset["label"])
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)
import numpy
from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
# fix random seed for reproducibility
numpy.random.seed(7)
X_train = sequence.pad_sequences(X_train, maxlen=max_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_length)
embedding_vector_length = 32
###LSTM
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
model = Sequential()
model.add(Embedding(5000, embedding_vector_length, input_length=max_length))
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='sigmoid'))
model.add(MaxPooling1D(pool_size=2))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
from keras import optimizers
sgd = optimizers.SGD(lr=0.9)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=3, batch_size=64)
# save model
model.save('LSTM.h5')
然后,我在一个单独的脚本中重新加载了模型,并为其提供了硬编码的句子:
model = load_model('LSTM.h5')
max_length = 500
from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=5000, lower=True,split=' ')
tokenizer.fit_on_texts(article_sentences)
#print(tokenizer.word_index) # To see the dicstionary
X = tokenizer.texts_to_sequences(article_sentences)
X = pad_sequences(X, maxlen=max_length)
prediction = model.predict(X)
print(prediction)
for i in range(len(X)):
print('%s\nLabel:%d' % (article_sentences[i], prediction[i]))
我在训练模型之前以及在加载模型的脚本中设置了随机种子,加载模型时是否缺少某些东西?我应该以其他方式排列数据吗?
答案 0 :(得分:0)
进行预测时,您总是将tokenizer
与预测文本配合使用,因此打印X
,也许您会发现两次预测之间的区别。
预测中的tokenizer
应该与训练中的相同。但是在您的代码中,您将tokenizer
与预测文本配合使用。
答案 1 :(得分:0)
您要安装新的令牌,该令牌不同于训练模型的 tokenzier 。因此,您要做的第一件事是刺 代币,而当预测不符合代币时,再次使用该腌制令牌生成器
您可以直接将标记器用作X = tokenizer.texts_to_sequences(article_sentences)
无需再次适应。希望对您有所帮助!