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

时间:2019-01-24 13:38:19

标签: python tensorflow lambda keras

我有一个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') 

另一个文件中,当我导入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

错误如下:

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

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

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

可能是什么问题?

谢谢

5 个答案:

答案 0 :(得分:4)

加载模型时,您需要explicitly handle custom objects or custom layers

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

答案 1 :(得分:0)

这件事也发生在我身上。您需要在lambda函数中导入tensorflow。因此,您可能希望将代码放在单独的函数中:

def reduce_mean(x):
    import tensorflow as tf
    return tf.reduce_mean(x, axis=1)

model = Sequential()
model.add(Embedding(vocab_size, 300, weights=[embedding_matrix], input_length=max_length, trainable=False))
model.add(Lambda(reduce_mean))
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') 

答案 2 :(得分:0)

此外,当您尝试从json文件加载模型结构时,传递自定义对象可以解决此问题。

pudl

答案 3 :(得分:0)

一个对我有用的怪异解决方案是导入用于创建模型的模块。因此,假设您拥有用于创建模型并保存的文件。

make_model.py

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.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') 

如果将模型加载到另一个文件 load_model.py 中,则可以通过第一个模块的导入来解决该错误。

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

import make_model

def learning(test_samples):
    model = load_model('my_model.h5')

自从读取错误

以来,这对我有用
UserWarning: make_model is not loaded, but a Lambda layer uses it. It may cause errors.
...
NameError: name 'tf' is not defined

答案 4 :(得分:0)

我也遇到了-但是问题是代码被重构,Lambda层被其他东西替换了。在这种情况下,您总是可以回滚到它起作用的地方。

在您无法恢复以前的解决方案的情况下,一种简单的解决方法是在custom_objects={'tf': tf}restore_model通话中添加