【问题标题】:Results of loaded keras model are different加载的keras模型结果不同
【发布时间】:2021-07-31 03:39:08
【问题描述】:

我正在尝试构建一个 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, Y_train, 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", "feel relax", "feel energy", "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) 之前为预测文本加载了该标记器。

【问题讨论】:

  • 下一步是比较模型与加载模型的权重。 get weights。如果这对根本原因没有帮助,请告诉我们。谢谢

标签: python keras deep-learning lstm sentiment-analysis


【解决方案1】:

在您的测试火车拆分代码中,您需要提供一个随机状态以获得相似的结果。例如; X_train,X_test,Y_train,Y_test = train_test_split(文本,标签,test_size=0.20,random_state=15)。 尝试每个状态,如 1,2,3,4....一旦你得到你喜欢的结果,你就可以保存它并在相同的随机状态之后使用。希望它能解决你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2019-07-11
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2018-08-05
    相关资源
    最近更新 更多