load_model и слой Lamda в Керасе - PullRequest
       32

load_model и слой Lamda в Керасе

0 голосов
/ 17 октября 2018

Как загрузить модель с лямбда-слоем?

Вот код для воспроизведения поведения:

MEAN_LANDMARKS = np.load('data/mean_shape_68.npy')

def add_mean_landmarks(x):
    mean_landmarks = np.array(MEAN_LANDMARKS, np.float32)
    mean_landmarks = mean_landmarks.flatten()
    mean_landmarks_tf = tf.convert_to_tensor(mean_landmarks)
    x = x + mean_landmarks_tf
    return x

def get_model():
    inputs = Input(shape=(8, 128, 128, 3))
    cnn = VGG16(include_top=False, weights='imagenet', input_shape=(128, 128, 3))
    x = TimeDistributed(cnn)(inputs)
    x = TimeDistributed(Flatten())(x)
    x = LSTM(256)(x)
    x = Dense(68 * 2, activation='linear')(x)

    x = Lambda(add_mean_landmarks)(x)

    model = Model(inputs=inputs, outputs=x)
    optimizer = Adadelta()
    model.compile(optimizer=optimizer, loss='mae')

    return model

Модель компилируется, и я могу сохранить ее, но когда я попытался загрузить еес функцией load_model я получаю ошибку:

in add_mean_landmarks
    mean_landmarks = np.array(MEAN_LANDMARKS, np.float32)
NameError: name 'MEAN_LANDMARKS' is not defined

Как я понимаю, MEAN_LANDMARKS не включен в граф как постоянный тензор.Также это связано с этим вопросом: Как добавить постоянный тензор в Керасе?

1 Ответ

0 голосов
/ 17 октября 2018

Вам необходимо передать аргумент custom_objects в load_model функцию:

model = load_model('model_file_name.h5', custom_objects={'MEAN_LANDMARKS': MEAN_LANDMARKS})

Более подробную информацию можно найти в документации Keras: Обработка пользовательских слоев (или других пользовательских объектов) в сохраненных моделях .

...