简体   繁体   English

在 keras 中加载模型后的不同预测

[英]different prediction after load a model in keras

I have a Sequential Model built in Keras and after trained it give me good prediction but when i save and then load the model i don't obtain the same prediction on the same dataset.我有一个在 Keras 中构建的序列模型,经过训练后它给了我很好的预测,但是当我保存然后加载模型时,我没有在同一数据集上获得相同的预测。 Why?为什么? Note that I checked the weight of the model and they are the same as well as the architecture of the model, checked with model.summary() and model.getWeights().请注意,我检查了模型的权重,它们与模型的架构相同,使用 model.summary() 和 model.getWeights() 检查。 This is very strange in my opinion and I have no idea how to deal with this problem.这在我看来很奇怪,我不知道如何处理这个问题。 I don't have any error but the prediction are different我没有任何错误,但预测不同

  1. I tried to use model.save() and load_model()我尝试使用 model.save() 和 load_model()

  2. I tried to use model.save_weights() and after that re-built the model and then load the model我尝试使用 model.save_weights() 然后重建模型然后加载模型

I have the same problem with both options.我对这两个选项都有同样的问题。

def Classifier(input_shape, word_to_vec_map, word_to_index, emb_dim, num_activation):

    sentence_indices = Input(shape=input_shape, dtype=np.int32)
    emb_dim = 300  # embedding di 300 parole in italiano
    embedding_layer = pretrained_embedding_layer(word_to_vec_map, word_to_index, emb_dim)

    embeddings = embedding_layer(sentence_indices)   

    X = LSTM(256, return_sequences=True)(embeddings)
    X = Dropout(0.15)(X)
    X = LSTM(128)(X)
    X = Dropout(0.15)(X)
    X = Dense(num_activation, activation='softmax')(X)

    model = Model(sentence_indices, X)

    sequentialModel = Sequential(model.layers)    
    return sequentialModel

    model = Classifier((maxLen,), word_to_vec_map, word_to_index, maxLen, num_activation)
    ...
    model.fit(Y_train_indices, Z_train_oh, epochs=30, batch_size=32, shuffle=True)

    # attempt 1
    model.save('classificationTest.h5', True, True)
    modelRNN = load_model(r'C:\Users\Alessio\classificationTest.h5')

    # attempt 2
    model.save_weights("myWeight.h5")

    model = Classifier((maxLen,), word_to_vec_map, word_to_index, maxLen, num_activation)
    model.load_weights(r'C:\Users\Alessio\myWeight.h5') 

    # PREDICTION TEST
    code_train, category_train, category_code_train, text_train = read_csv_for_email(r'C:\Users\Alessio\Desktop\6Febbraio\2test.csv')

    categories, code_categories = get_categories(r'C:\Users\Alessio\Desktop\6Febbraio\2test.csv')

    X_my_sentences = text_train
    Y_my_labels = category_code_train
    X_test_indices = sentences_to_indices(X_my_sentences, word_to_index, maxLen)
    pred = model.predict(X_test_indices)

    def codeToCategory(categories, code_categories, current_code):

        i = 0;
        for code in code_categories:
            if code == current_code:
                return categories[i]
            i = i + 1 
        return "no_one_find"   

    # result
    for i in range(len(Y_my_labels)):
        num = np.argmax(pred[i])

    # Pretrained embedding layer
    def pretrained_embedding_layer(word_to_vec_map, word_to_index, emb_dim):
    """
    Creates a Keras Embedding() layer and loads in pre-trained GloVe 50-dimensional vectors.

    Arguments:
    word_to_vec_map -- dictionary mapping words to their GloVe vector representation.
    word_to_index -- dictionary mapping from words to their indices in the vocabulary (400,001 words)

    Returns:
    embedding_layer -- pretrained layer Keras instance
    """

    vocab_len = len(word_to_index) + 1                  # adding 1 to fit Keras embedding (requirement)

    ### START CODE HERE ###
    # Initialize the embedding matrix as a numpy array of zeros of shape (vocab_len, dimensions of word vectors = emb_dim)
    emb_matrix = np.zeros((vocab_len, emb_dim))

    # Set each row "index" of the embedding matrix to be the word vector representation of the "index"th word of the vocabulary
    for word, index in word_to_index.items():
        emb_matrix[index, :] = word_to_vec_map[word]

    # Define Keras embedding layer with the correct output/input sizes, make it trainable. Use Embedding(...). Make sure to set trainable=False. 
    embedding_layer = Embedding(vocab_len, emb_dim)
    ### END CODE HERE ###

    # Build the embedding layer, it is required before setting the weights of the embedding layer. Do not modify the "None".
    embedding_layer.build((None,))

    # Set the weights of the embedding layer to the embedding matrix. Your layer is now pretrained.
    embedding_layer.set_weights([emb_matrix])

    return embedding_layer

Do you have any kind of suggestion?你有什么建议吗?

Thanks in Advance.提前致谢。

Edit1: if use the code of saving and loading in the same "page" (I'm using notebook jupyter) it works fine. Edit1:如果在同一个“页面”中使用保存和加载的代码(我使用的是笔记本 jupyter),它工作正常。 If I change "page" it doesn't work.如果我更改“页面”,它将不起作用。 Could it be that there is something related with the tensorflow session?会不会和tensorflow session有关系?

Edit2: my final goal is to load a model, trained in Keras, with Deeplearning4J in java. Edit2:我的最终目标是加载一个模型,在 Keras 中训练,在 Java 中使用 Deeplearning4J。 So if you know a solution for "transforming" the keras model in something else readable in DL4J it will help anyway.因此,如果您知道在 DL4J 中以其他可读的方式“转换”keras 模型的解决方案,它无论如何都会有所帮助。

Edit3: add function pretrained_embedding_layer() Edit3: 添加函数 pretrained_embedding_layer()

Edit4: dictionaries from word2Vec model read with gensim Edit4:使用 gensim 读取 word2Vec 模型中的字典

from gensim.models import Word2Vec
model = Word2Vec.load('C:/Users/Alessio/Desktop/emoji_ita/embedding/glove_WIKI')

def getMyModels (model):
word_to_index = dict({})
index_to_word = dict({})
word_to_vec_map = dict({})
for idx, key in enumerate(model.wv.vocab):
    word_to_index[key] = idx
    index_to_word[idx] = key
    word_to_vec_map[key] = model.wv[key]
return word_to_index, index_to_word, word_to_vec_map

Are you pre-processing your data in the same way when you load your model ?加载模型时,您是否以相同的方式预处理数据?

And if yes, did you set the seed of your pre-processing functions ?如果是,您是否设置了预处理功能的种子? If you build a dictionnary with keras, are the sentences coming in the same order ?如果您使用 keras 构建字典,句子的顺序是否相同?

I had the same problem before, so here is how you solve it.我以前也遇到过同样的问题,所以这里是你解决它的方法。 After making sure that the weights and summary are the same, try to print your random seed and check.确保权重和摘要相同后,尝试打印您的随机种子并检查。 If its value is changing from a session to another and if you tried tensorflow's seed, it means you need to disable the PYTHONHASHSEED environment variable.如果它的值从一个会话更改为另一个会话,并且您尝试了 tensorflow 的种子,则意味着您需要禁用 PYTHONHASHSEED 环境变量。 You can read more about it here: https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED您可以在此处阅读更多相关信息: https : //docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED

To disable it, go to your system environment variables and add PYTHONHASHSEED as a new variable if it doesn't exist.要禁用它,请转到您的系统环境变量并添加 PYTHONHASHSEED 作为新变量(如果它不存在)。 Then, set its value to 0 to disable it.然后,将其值设置为 0 以禁用它。 Please note that it was done in this way because it has to be disabled before running the interpreter.请注意,它是通过这种方式完成的,因为它必须在运行解释器之前被禁用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM