Сохранение и загрузка модели keras

#python #keras #deep-learning

#python #keras #глубокое обучение

Вопрос:

Я работаю над моделью Keras, которая использует универсальное встраивание предложений для кодирования предоставленных предложений. Однако, когда я сохраняю модель для будущего использования, выдается упомянутая ошибка. NameError: name 'embed' is not defined

Предложения преобразуются для встраивания с помощью UniversalEmbedding(x) функции. Код всей модели взят из этой ссылки.

 !wget https://raw.githubusercontent.com/Tony607/Keras-Text-Transfer-Learning/master/train_5500.txt
!wget https://raw.githubusercontent.com/Tony607/Keras-Text-Transfer-Learning/master/test_data.txt

import tensorflow as tf
import tensorflow_hub as hub
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import re
import seaborn as sns
import keras.layers as layers
from keras.models import Model
from keras import backend as K
np.random.seed(10)

def get_dataframe(filename):
    lines = open(filename, 'r').read().splitlines()
    data = []
    for i in range(0, len(lines)):
        label = lines[i].split(' ')[0]
        label = label.split(":")[0]
        text = ' '.join(lines[i].split(' ')[1:])
        text = re.sub('[^A-Za-z0-9 ,?'"-._ !/`@=;:] ', '', text)
        data.append([label, text])

    df = pd.DataFrame(data, columns=['label', 'text'])
    df.label = df.label.astype('category')
    return df

df_train = get_dataframe('train_5500.txt')
df_train = get_dataframe('test_data.txt')

category_counts = len(df_train.label.cat.categories)
module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/3" 
embed = hub.Module(module_url)
embed_size = embed.get_output_info_dict()['default'].get_shape()[1].value

def UniversalEmbedding(x):
    return embed(tf.squeeze(tf.cast(x, tf.string)), signature="default", as_dict=True)["default"]

input_text = layers.Input(shape=(1,), dtype='string')
embedding = layers.Lambda(UniversalEmbedding, output_shape=(embed_size,))(input_text)
dense = layers.Dense(256, activation='relu')(embedding)
pred = layers.Dense(category_counts, activation='softmax')(dense)
model = Model(inputs=[input_text], outputs=pred)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

train_text = df_train['text'].tolist()
train_text = np.array(train_text, dtype=object)[:, np.newaxis]

train_label = np.asarray(pd.get_dummies(df_train.label), dtype = np.int8)

df_test = get_dataframe('test_data.txt')
test_text = df_test['text'].tolist()
test_text = np.array(test_text, dtype=object)[:, np.newaxis]
test_label = np.asarray(pd.get_dummies(df_test.label), dtype = np.int8)


with tf.Session() as session:
  K.set_session(session)
  session.run(tf.global_variables_initializer())
  session.run(tf.tables_initializer())
  history = model.fit(train_text, 
            train_label,
            validation_data=(test_text, test_label),
            epochs=2,
            batch_size=32)
  model.save_weights('./model.h5')
  model.save('mod.h5')
  

Когда я пытаюсь загрузить модель, подобную

 from keras.models import load_model

load_model('mod.h5') 
  

Комментарии:

1. вы можете попробовать передать {'embed': hub.Module(module_url)} аргумент custom_objects ключевого слова. keras.io/getting-started/faq /…

2. @Jakub попробовал это. он выдает ошибку NameError: name 'tf' is not defined , хотя я импортировал tensorflow как tf

Ответ №1:

Когда вы пытаетесь загрузить модель с помощью load_model keras, метод выдает ошибку, потому что embed он не встроен в keras, и для решения этой проблемы вам, возможно, придется снова определить его в своем коде перед загрузкой модели с помощью load_model.

Пожалуйста, попробуйте написать embed = hub.Module(module_url) вместе с необходимыми библиотеками и URL-адресами, как указано в предоставленной вами ссылке ( https://www.dlology.com/blog/keras-meets-universal-sentence-encoder-transfer-learning-for-text-data/ ) перед попыткой загрузить модель.