【问题标题】:Seralizing a keras model with an embedding layer使用嵌入层序列化 keras 模型
【发布时间】:2019-01-09 13:29:11
【问题描述】:

我已经用这样的预训练词嵌入训练了一个模型:

embedding_matrix = np.zeros((vocab_size, 100))
for word, i in text_tokenizer.word_index.items():
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        embedding_matrix[i] = embedding_vector

embedding_layer = Embedding(vocab_size,
                        100,
                        embeddings_initializer=Constant(embedding_matrix),
                        input_length=50,
                        trainable=False)

架构如下所示:

sequence_input = Input(shape=(50,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
text_cnn = Conv1D(filters=5, kernel_size=5, padding='same',     activation='relu')(embedded_sequences)
text_lstm = LSTM(500, return_sequences=True)(embedded_sequences)


char_in = Input(shape=(50, 18, ))
char_cnn = Conv1D(filters=5, kernel_size=5, padding='same', activation='relu')(char_in)
char_cnn = GaussianNoise(0.40)(char_cnn)
char_lstm = LSTM(500, return_sequences=True)(char_in)



merged = concatenate([char_lstm, text_lstm]) 

merged_d1 = Dense(800, activation='relu')(merged)
merged_d1 = Dropout(0.5)(merged_d1)

text_class = Dense(len(y_unique), activation='softmax')(merged_d1)
model = Model([sequence_input,char_in], text_class)

当我将模型转换为 json 时,我得到了这个错误:

ValueError: can only convert an array of size 1 to a Python scalar

同样,如果我使用model.save() 函数,它似乎可以正确保存,但是当我去加载它时,我得到Type Error: Expected Float32

我的问题是:尝试序列化此模型时是否缺少某些内容?我需要某种Lambda 层或类似的东西吗?

任何帮助将不胜感激!

【问题讨论】:

  • 此外,您应该使用模型检查点来保存模型,因为model.save() 不会保存最佳模型迭代,而是仅保存最后一次迭代,这可能并非总是最好的迭代。所以保存最佳权重并使用model.to_json() 来保存模型架构。查找更多详细信息 herehere

标签: tensorflow keras word-embedding


【解决方案1】:

我尝试了多种方法。问题是当我们在嵌入层工作时,pickle 不起作用,并且无法保存数据。 所以你可以做什么,当你有这样的一些层时:-

## Creating model
embedding_vector_features=100
model=Sequential()
model.add(Embedding(voc_size,embedding_vector_features,input_length=sent_length))
model.add(LSTM(100))
model.add(Dense(1,activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
print(model.summary())

那么,你可以使用 h5 扩展名到 d=save 文件,然后将其转换为 json,模型在这里转换为 model2

from tensorflow.keras.models import load_model
model.save('model.h5')
model = load_model('model.h5')
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)

这是加载数据:-

from tensorflow.keras.models import model_from_json
json_file = open('model.json', 'r')
model_json = json_file.read()
model2 = model_from_json(model_json)
model2.load_weights("model.h5")

【讨论】:

    【解决方案2】:

    希望您在编译后保存模型。喜欢:

        model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
    

    要保存模型,你可以这样做:

        from keras.models import load_model
    
        model.save('model.h5')
        model = load_model('model_detect1.h5')
        model_json = model.to_json()
        with open("model.json", "w") as json_file:
            json_file.write(model_json)
    

    加载模型,

        from keras.models import model_from_json
    
        json_file = open('model.json', 'r')
        model_json = json_file.read()
        model = model_from_json(model_json)
        model.load_weights("model.h5")
    

    【讨论】:

      【解决方案3】:

      您可以使用Embedding 层中的weights 参数来提供初始权重。

      embedding_layer = Embedding(vocab_size,
                                  100,
                                  weights=[embedding_matrix],
                                  input_length=50,
                                  trainable=False)
      

      在模型保存/加载后,权重应该保持不可训练:

      model.save('1.h5')
      m = load_model('1.h5')
      m.summary()
      
      __________________________________________________________________________________________________
      Layer (type)                    Output Shape         Param #     Connected to
      ==================================================================================================
      input_3 (InputLayer)            (None, 50)           0
      __________________________________________________________________________________________________
      input_4 (InputLayer)            (None, 50, 18)       0
      __________________________________________________________________________________________________
      embedding_1 (Embedding)         (None, 50, 100)      1000000     input_3[0][0]
      __________________________________________________________________________________________________
      lstm_4 (LSTM)                   (None, 50, 500)      1038000     input_4[0][0]
      __________________________________________________________________________________________________
      lstm_3 (LSTM)                   (None, 50, 500)      1202000     embedding_1[0][0]
      __________________________________________________________________________________________________
      concatenate_2 (Concatenate)     (None, 50, 1000)     0           lstm_4[0][0]
                                                                       lstm_3[0][0]
      __________________________________________________________________________________________________
      dense_2 (Dense)                 (None, 50, 800)      800800      concatenate_2[0][0]
      __________________________________________________________________________________________________
      dropout_2 (Dropout)             (None, 50, 800)      0           dense_2[0][0]
      __________________________________________________________________________________________________
      dense_3 (Dense)                 (None, 50, 15)       12015       dropout_2[0][0]
      ==================================================================================================
      Total params: 4,052,815
      Trainable params: 3,052,815
      Non-trainable params: 1,000,000
      __________________________________________________________________________________________________
      

      【讨论】:

        猜你喜欢
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 2020-09-03
        • 2020-01-23
        • 2020-10-27
        • 2018-12-21
        相关资源
        最近更新 更多