我有一堆模型,这些模型是我训练并保存在带有GPU的计算机上的。 我使用了经过训练并在GPU上运行的以下模型
model = Sequential()
model.add(CuDNNLSTM(units=30,input_shape=(None, 11), return_sequences=True, name='LAYER1'))
model.add(Dropout(.9, name='LAYER2'))
model.add(Dense(units=10, activation="relu",name='LAYER3'))
model.add(Dropout(.1, name='LAYER4'))
model.add(CuDNNLSTM(units=20,return_sequences=False,name='LAYER5'))
model.add(Dropout(.1, name='LAYER6'))
model.add(Dense(units=3,activation="linear",name='LEVEL7'))
rmsprop_opt = RMSprop(lr=learning_rate)
model.compile(loss="mse", optimizer=rmsprop_opt)
我使用以下命令保存模型图:
model_json_dict = json.loads(model.to_json())
json.dump(model_json_dict, open("my_model_graph.json", "w"))
然后我使用检查点方法保存权重:
callback_checkpoint = ModelCheckpoint(filepath="model_checkpoint.h5",
monitor='val_loss',
verbose=1,
save_weights_only=True,
save_best_only=True)
callbacks = [callback_checkpoint]
我使用以下方法拟合模型:
history = model.fit(feature_train,
label_train,
batch_size=batch_size,
epochs=epochs,
validation_split=validation_split,
callbacks=callbacks)
我想将模型读回到只有CPU的机器中进行预测。我已经在第二台机器上按如下方式加载了模型并加载了权重,而TF抱怨CPU / GPU问题。
model = model_from_json(json.dumps(json.load(open("my_model_graph.json","r"))))
model.load_weights("model_checkpoint.h5")
所以问题是如何将这些保存的模型及其权重转换为仅需CPU即可重新加载到第二台计算机中的形式?
这样做的正确方法令人困惑。有一个使用Saver()类显示的SO。 Tensorflow: how to save/restore a model?。另一个帖子说它不能完成,另一个帖子说它是透明的。转换这些现有模型的推荐方法是什么? (对他们进行培训不是一种选择!)
答案 0 :(得分:0)
这就是我解决的方法。我的模型如下所示:
def build_model(layers, machine, learning_rate, dropout_rate):
model = Sequential() # tf.keras.models.Sequential()
if machine == "GPU":
model.add(
CuDNNLSTM(
units=layers[1],
input_shape=(None, layers[0]),
return_sequences=True,
name='FIRST_LAYER')
)
else:
model.add(
LSTM(
units=layers[1],
input_shape=(None, layers[0]),
return_sequences=True,
name='FIRST_LAYER')
)
...
我这样创建初始模型:
my_model = build_model(layers=layer_sizes, machine='GPU', learning_rate=0.003,dropout_rate=0.05)
...然后训练模型并使用以下方法保存权重:
my_model.save_weights("my_model_weights.h5")
现在,我按如下所示切换到CPU实例:
my_model = build_model(layers=layer_sizes, machine='CPU', learning_rate=0.003,dropout_rate=0.05)
...然后我可以按以下方式加载保存的权重:
my_model.load_weights("my_model_weights.h5")
可惜的是,model_from_json api无法在所有机器上运行!