请帮助我。我正在使用Tensorflow 2.0 GPU。 我训练模型并保存为.h5格式
model = keras.Sequential()
model.add(layers.Bidirectional(layers.CuDNNLSTM(self._window_size, return_sequences=True),
input_shape=(self._window_size, x_train.shape[-1])))
model.add(layers.Dropout(rate=self._dropout, seed=self._seed))
model.add(layers.Bidirectional(layers.CuDNNLSTM((self._window_size * 2), return_sequences=True)))
model.add(layers.Dropout(rate=self._dropout, seed=self._seed))
model.add(layers.Bidirectional(layers.CuDNNLSTM(self._window_size, return_sequences=False)))
model.add(layers.Dense(units=1))
model.add(layers.Activation('linear'))
model.summary()
model.compile(
loss='mean_squared_error',
optimizer='adam'
)
# обучаем модель
history = model.fit(
x_train,
y_train,
epochs=self._epochs,
batch_size=self._batch_size,
shuffle=False,
validation_split=0.1
)
model.save('rts.h5')
然后我加载此模型并将其用于预测,一切正常。
model = keras.models.load_model('rts.h5')
y_hat = model.predict(x_test)
但是出现了在Tensorflow Serving中使用经过训练的模型的问题。并且不接受.h5格式的模型。 我跑:
sudo docker run --gpus 1 -p 8501:8501 --mount type=bind,source=/home/alex/PycharmProjects/TensorflowServingTestData/RtsModel,target=/models/rts_model -e MODEL_NAME=rts_model -t tensorflow/serving:latest-gpu
但是出现了在Tensorflow Serving中使用经过训练的模型的问题。并且不接受.h5格式的模型。 我跑: 而我得到了错误:
tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc:267] No versions of servable rts_model found under base path /models/rts_model
我尝试按照此处https://www.tensorflow.org/guide/saved_model#using_savedmodel_with_estimators的描述保存经过训练的模型:
我得到了错误:
ValueError: Layer has 2 states but was passed 0 initial states.
我尝试如下保存模型,https://www.tensorflow.org/api_docs/python/tf/keras/models/save_model:
并且有相同的错误:
ValueError: Layer has 2 states but was passed 0 initial states.
将模型保存为Tensorflow Serving格式的唯一方法是:
keras.experimental.export_saved_model(model, 'saved_model/1/')
“服务”中保存的模型工作。但我收到警告,该方法已过时,将在以后的版本中删除。
Instructions for updating:
Please use `model.save(..., save_format="tf")` or `tf.keras.models.save_model(..., save_format="tf")`.
它关闭了我。 当我尝试使用这些方法时,会出现错误。 当我使用有效的方法时,写道它已被弃用。
请帮忙。 如何在Tensorflow 2.0中保存经过训练的模型以便可以用于Tensorflow服务。
答案 0 :(得分:1)
我也在尝试解决此问题!
根据答案here,正常的LSTM(即tf.keras.layers.LSTM
)将使用GPU,并且通常应在cuDNNLSTM类上使用,除非您特别需要原始实现(不确定为什么会这样做)。 )。
根据docs,如果满足某些要求(参见下文),则普通LSTM将使用cuDNN实现。
使用此LSTM层时,仅使用model.save_model('output_path', save_format='tf')
使用cuDNN进行LSTM的要求如下(请注意,所有要求均符合默认设置):
如果有GPU可用,并且该层的所有参数都满足CuDNN内核的要求(有关详细信息,请参见下文),则该层将使用快速cuDNN实现。
使用cuDNN实现的要求是:
activation == tanh
recurrent_activation == sigmoid
recurrent_dropout == 0
- 解开是错误的
- use_bias为True 输入不会被屏蔽或严格右填充。