如何解决加载keras模型结果不一样
我正在尝试构建 LSTM 模型以检测文本的情绪。 (0 -> 正常,1 -> 可恶)在我训练我的模型后,我将一些文本发送到我的模型进行预测。预测的结果和我预期的一样。但是,将模型加载为“h5”文件后,即使发送相同的文本,也无法获得相同的准确度。这是我的训练代码:
texts = tweets['text']
labels = tweets['label']
labels = LabelEncoder().fit_transform(labels)
labels = labels.reshape(-1,1)
X_train,X_test,Y_train,Y_test = train_test_split(texts,labels,test_size=0.20)
tokenizer.fit_on_texts(X_train)
sequences = tokenizer.texts_to_sequences(X_train)
sequences_matrix = sequence.pad_sequences(sequences,maxlen=max_len)
inputs = Input(name='inputs',shape=[max_len])
layer = Embedding(max_words,50,input_length=max_len)(inputs)
layer = LSTM(64)(layer)
layer = Dense(256,name='FC1')(layer)
layer = Activation('relu')(layer)
layer = Dropout(0.5)(layer)
layer = Dense(1,name='out_layer')(layer)
layer = Activation('sigmoid')(layer)
model = Model(inputs=inputs,outputs=layer)
earlyStopping = EarlyStopping(monitor='val_loss',min_delta=0.0001,restore_best_weights=False)
model.summary()
model.compile(loss='binary_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])
model.fit(sequences_matrix,batch_size=128,shuffle=True,epochs=10,validation_split=0.2,callbacks=[earlyStopping])
model.save("ModelsDL/LSTM.h5")
test_sequences = tokenizer.texts_to_sequences(X_test)
test_sequences_matrix = sequence.pad_sequences(test_sequences,maxlen=max_len)
accr = model.evaluate(test_sequences_matrix,Y_test)
print('Test set\n Loss: {:0.3f}\n Accuracy: {:0.3f}'.format(accr[0],accr[1]))
texts = ["hope","feel relax","feel energy","peaceful day"]
tokenizer.fit_on_texts(texts)
test_samples_token = tokenizer.texts_to_sequences(texts)
test_samples_tokens_pad = pad_sequences(test_samples_token,maxlen=max_len)
print(model.predict(x=test_samples_tokens_pad))
del model
print(model.predict(x=test_samples_tokens_pad))
的输出是:
[[0.0387207 ]
[0.02622151]
[0.3856796 ]
[0.03749594]]
具有“正常”情绪的文本结果更接近于 0。此外,具有“仇恨”情绪的文本结果更接近于 1。
正如您在输出中看到的,我的结果是一致的,因为它们具有“正常”情绪。
但是,我加载模型后,总是遇到不同的结果。这是我的代码:
texts = ["hope","peaceful day"] # same texts
model = load_model("ModelsDL/LSTM.h5")
tokenizer.fit_on_texts(texts)
test_samples_token = tokenizer.texts_to_sequences(texts)
test_samples_tokens_pad = pad_sequences(test_samples_token,maxlen=max_len)
print(model.predict(x=test_samples_tokens_pad))
print(model.predict(x=test_samples_tokens_pad))
的输出:
[[0.9838583 ]
[0.99957573]
[0.9999665 ]
[0.9877912 ]]
如您所见,相同的 LSTM 模型将文本视为具有可恶的上下文。
遇到这个问题我该怎么办?
编辑:我解决了这个问题。我保存了模型训练时使用的标记器。然后,我在 tokenizer.fit_on_texts(texts)
之前为预测文本加载了该分词器。
解决方法
在您的测试列车拆分代码上,您需要给出一个随机状态以获得类似的结果。例如; X_train,X_test,Y_train,Y_test = train_test_split(texts,labels,test_size=0.20,random_state=15)。 尝试每个状态,如 1,2,3,4....一旦你得到你喜欢的结果,你可以保存它并在相同的随机状态之后使用。希望它能解决你的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。