无法将Tensorflow中保存在ModelCheckpoint中的Keras模型加载到另一台机器上

时间:2018-09-18 18:26:00

标签: python tensorflow machine-learning keras

我有2台Windows机器(A和B)都安装了tensorflow-gpu 1.10。

我有一个training.py,可以训练并保存最佳的完整模型

checkpoint = tf.keras.callbacks.ModelCheckpoint(params['filepath_best'], monitor='val_loss', verbose=0, save_best_only=True, save_weights_only=False, mode='auto', period=1)
callbacks_list = [checkpoint, tf.keras.callbacks.TensorBoard(log_dir=params['log_dir'])]
model.compile(optimizer='adam', loss='MSE', metrics=['MSE'])
history = model.fit(keras_input_fn(filenames=training_files, mode=tf.estimator.ModeKeys.TRAIN).batch(16).repeat(1000), 
                    epochs=1000, steps_per_epoch=625, 
                    validation_data=keras_input_fn(filenames=training_files, mode=tf.estimator.ModeKeys.EVAL).batch(16).repeat(1000), 
                    validation_steps=625, callbacks=callbacks_list)

我还有一个detect.py,它可以加载经过训练的模型并进行预测

model = load_model(params['filepath_best'])

training.py和detect.py分别运行。训练进行得很好,并且机器A中的detect.py可以在机器A上加载training.py生成的模型。但是,机器A中的detect.py无法在机器B上加载training.py生成的复制模型。同样,机器B中的detect.py只能加载由机器B生成的模型,而不能加载从机器A生成的复制模型。两台机器中的training.py和detect.py相同,但目录为不同。似乎已保存的模型包含生成该模型的特定计算机的本地目录的信息,因此无法在另一台计算机上使用。复制的模型位于正确的加载目录中。

在training.py中,我有一个函数relu_advanced(x),该函数基本上将最大值截断为255,并且在构造keras模型时会调用它。

def relu_advanced(x):
    return K.relu(x, max_value=255) 

# in model construction part
net = tf.keras.layers.Lambda(function = relu_advanced)(net)

当我使用机器A上的复制模型在机器B上运行detec.py时,它在机器A上使用training.py的目录抱怨relu_advanced函数。

File "C:\Anaconda2\envs\tensorflow\lib\site-packages\tensorflow\python\keras\layers\core.py", line 712, in call
return self.function(inputs, **arguments)
File "D:/dir_on_machine_A/training.py", line 391, in relu_advanced
TypeError: bad argument type for built-in operation

如果将training.py放在与机器A相同的机器B上的同一目录上,则detect.py在load_model()之后终止,而没有给出任何错误消息。

我的问题是如何将由ModelCheckpoint生成的经过训练的模型在一台机器上复制到另一台机器上,并使用tensorflow和keras从另一台机器上加载它?谢谢!

0 个答案:

没有答案