Серализация модели keras с помощью слоя встраивания

Я обучил модель с предварительно обученными встраиваниями слов, например:

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 слой или что-то в этом роде?

Любая помощь будет принята с благодарностью!


person Steven    schedule 01.08.2018    source источник
comment
Кроме того, вы должны использовать контрольную точку модели для сохранения модели, поскольку model.save() не сохраняет лучшую итерацию модели, а просто сохраняет последнюю итерацию, которая не всегда может быть лучшей итерацией. Так что сохраните лучшие веса и используйте model.to_json(), чтобы сохранить архитектуру модели. Дополнительные сведения здесь и здесь   -  person Aditya    schedule 02.08.2018


Ответы (3)


Вы можете использовать аргумент weights в слое Embedding, чтобы указать начальные веса.

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
__________________________________________________________________________________________________
person Yu-Yang    schedule 02.08.2018

Надеюсь, вы сохраните модель после компиляции. Нравиться:

    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")
person Upasana Mittal    schedule 02.08.2018

Я пробовал несколько способов. Проблема в том, что когда мы работаем в слое внедрения, то 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 file, а затем преобразовать его в 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")
person Nikhil Jain    schedule 12.06.2020