未在load_model()上定义'tf'-使用Lambda

Hel*_*Out 4 python lambda keras tensorflow

我有一个Keras要导出并在其他python代码中使用的模型。

这是我的代码:

from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM, GRU, Flatten, Dropout, Lambda
from keras.layers.embeddings import Embedding
import tensorflow as tf


EMBEDDING_DIM = 100

model = Sequential()
model.add(Embedding(vocab_size, 300, weights=[embedding_matrix], input_length=max_length, trainable=False))
model.add(Lambda(lambda x: tf.reduce_mean(x, axis=1)))
model.add(Dense(8, input_dim=4, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train_pad, y_train, batch_size=128, epochs=25, validation_data=(X_val_pad, y_val), verbose=2)
model.save('my_model.h5') 
Run Code Online (Sandbox Code Playgroud)

另一个文件中,当我导入时my_model.h5

from keras.models import load_model
from keras.layers import Lambda
import tensorflow as tf


def learning(test_samples):
    model = load_model('my_model.h5')
    #ERROR HERE
    #rest of the code
Run Code Online (Sandbox Code Playgroud)

错误如下:

  in <lambda>
    model.add(Lambda(lambda x: tf.reduce_mean(x, axis=1)))
NameError: name 'tf' is not defined
Run Code Online (Sandbox Code Playgroud)

经过研究,我发现lambda在模型中使用的事实是导致此问题的原因,但是我添加了这些参考资料,但没有帮助:

from keras.models import load_model
from keras.layers import Lambda
import tensorflow as tf
Run Code Online (Sandbox Code Playgroud)

可能是什么问题呢?

谢谢

sdc*_*cbr 8

加载模型时,您需要显式处理自定义对象或自定义图层

import tensorflow as tf
import keras
model = keras.models.load_model('my_model.h5', custom_objects={'tf': tf})
Run Code Online (Sandbox Code Playgroud)

  • 为什么“tf”被视为自定义对象?这只是图书馆的别名? (4认同)
  • 这对我有用。有趣的是,当在与相应的保存函数相同的文件夹中调用加载函数时,我不必将“tf”指定为自定义对象。一旦我将加载调用移动到另一个文件夹,我就必须指定它。这对我来说确实看起来像一个错误。 (2认同)