[英]Save/load a keras model with constants
我有一個Keras模型,想在其中添加一個常數。 經過一番谷歌搜索后,我得到了以下代碼,該代碼正是我想要的:
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模型時如何包含常數?
正如您提到的那樣,它始終是常數,因此沒有必要為其定義單獨的Input層。 特別考慮到它不是模型的輸入。 我建議您改用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.