Сохранить / загрузить модель keras с константами - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть модель Keras, где я хотел бы добавить константу к прогнозам.После некоторого поиска в Google я получил следующий код, который делает именно то, что я хочу:

import numpy as np
from keras.layers import Input, Add
from keras.backend import variable
from keras.models import Model, load_model

inputs = Input(shape=(1,))
add_in = Input(tensor=variable([[5]]), name='add')
output = Add()([inputs, add_in])

model = Model([inputs, add_in], output)
model.compile(loss='mse', optimizer='adam')

X = np.array([1,2,3,4,5,6,7,8,9,10])
model.predict(X)

Однако, если я сохраню и загрузлю эту модель, Keras, похоже, потеряет отслеживание константы:

p = 'k_model.hdf5'
model.save(p)
del model
model2 = load_model(p)
model2.predict(X)

Что возвращает:

Ошибка при проверке модели: список массивов Numpy, передаваемых вашей модели, не соответствует размеру, ожидаемому моделью.Ожидается увидеть 2 массива (ов), но вместо этого получен следующий список из 1 массива:

Как включить константы при сохранении / загрузке модели Keras?

1 Ответ

0 голосов
/ 20 сентября 2018

Поскольку, как вы упомянули, это всегда константа, не имеет смысла определять для нее отдельный входной слой;особенно учитывая, что это не вход вашей модели.Я предлагаю вам использовать слой Lambda вместо:

import numpy as np
from keras.layers import Input, Lambda
from keras.models import Model, load_model

def add_five(a):
    return a + 5

inputs = Input(shape=(1,))
output = Lambda(add_five)(inputs)

model = Model(inputs, output)
model.compile(loss='mse', optimizer='adam')

X = np.array([1,2,3,4,5,6,7,8,9,10])
model.predict(X)

Вывод:

array([[ 6.],
       [ 7.],
       [ 8.],
       [ 9.],
       [10.],
       [11.],
       [12.],
       [13.],
       [14.],
       [15.]], dtype=float32)

И при сохранении и перезагрузке проблем не возникнетмодель, так как функция add_five была сохранена в файле модели.

Обновление: Вы можете расширить это в случае, когда каждая входная выборка состоит из более чем одного элемента.Например, если входная форма равна (2,) и вы хотите добавить 5 к первому элементу и 10 ко второму элементу каждого образца, вы можете легко изменить функцию add_five и переопределить ее следующим образом:

def add_constants(a):
    return a + [5, 10]  

# ... the same as above (just change the function name and input shape)

X = np.array([1,2,3,4,5,6,7,8,9,10]).reshape(5, 2)
model.predict(X)

Выход:

# X
array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10]])

# predictions
array([[ 6., 12.],
       [ 8., 14.],
       [10., 16.],
       [12., 18.],
       [14., 20.]], dtype=float32)
...