簡體   English   中英

加載 keras model 的結果不同

[英]Results of loaded keras model are different

我正在嘗試構建一個 LSTM model 來檢測文本的情緒。 (0 -> 正常,1 -> 可恨)在我訓練了 model 之后,我將一些文本發送到我的 model 進行預測。 預測的結果和我預期的一樣。 但是,在我將 model 加載為“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))的 output 是:

 [[0.0387207 ]
 [0.02622151]
 [0.3856796 ]
 [0.03749594]]

具有“正常”情緒的文本結果更接近 0。具有“仇恨”情緒的文本結果更接近 1。

正如您在 output 中看到的那樣,我的結果是一致的,因為它們具有“正常”的情緒。

但是,在我加載 model 后,我總是遇到不同的結果。 這是我的代碼:

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

Output print(model.predict(x=test_samples_tokens_pad))

[[0.9838583 ]
 [0.99957573]
 [0.9999665 ]
 [0.9877912 ]]

如您所見,相同的 LSTM model 將文本視為具有可恨的上下文。

這個問題我該怎么辦?

編輯:我解決了這個問題。 我保存了 model 訓練時使用的分詞器。 然后,我在tokenizer.fit_on_texts(texts)之前為預測文本加載了該標記器。

在您的測試列車拆分代碼中,您需要提供一個隨機的 state 以獲得類似的結果。例如; X_train,X_test,Y_train,Y_test = train_test_split(文本,標簽,test_size=0.20,random_state=15)。 嘗試每一個 state 像 1,2,3,4....一旦你得到你喜歡的結果然后你可以保存它並使用相同的隨機 state。希望它能解決你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM