我已经训练了一个模型,并将其部署到张量流服务以进行推断。
发出请求时出现此错误:
<Response [400]>
{'error': 'transpose expects a vector of size 5. But input(1) is a vector of size 3\n\t [[{{node bidirectional_1/transpose}} = Transpose[T=DT_FLOAT, Tperm=DT_INT32, _class=["loc:@bidirectional_1/TensorArrayUnstack/TensorArrayScatter/TensorArrayScatterV3"], _output_shapes=[[50,?,512]], _device="/job:localhost/replica:0/task:0/device:CPU:0"](embedding_1/embedding_lookup, Attention/transpose/perm)]]'}
此模型与我部署的第一个没有问题的模型之间的显着区别是,它包含Keras自定义图层,而我的成功尝试仅包含标准Keras图层。
这是我测试对tf服务模型的POST请求的方式:
with open("CNN_last_test_set.pkl", "rb") as fp:
x_arr_test, y_test = pickle.load(fp)
out = x_arr_test[:1, :]
out = out.tolist()
payload = {
"instances": [{'input': [out]}]
}
r = requests.post('http://localhost:9000/v1/models/prod_mod:predict', json=payload)
pred = json.loads(r.content.decode('utf-8'))
要创建用于tf服务的tensorflow模型对象,我正在使用此函数:
def export_model_custom_layer(filename, export_path_base):
# set the mode to test time.
K.set_learning_phase(0)
model = keras.models.load_model(filename, custom_objects={"Attention": Attention})
sess = K.get_session()
# set the path to save the model and model version
export_version = 1
export_path = os.path.join(
tf.compat.as_bytes(export_path_base),
tf.compat.as_bytes(str(export_version)))
tf.saved_model.simple_save(
sess,
export_path,
inputs={'input': model.input},
outputs={t.name.split(':')[0]: t for t in model.outputs},
legacy_init_op=tf.tables_initializer())
在将客户层定义为自定义对象的位置,为了使其正常工作,我将此功能添加到了客户层:
def get_config(self):
config = {
'name': "Attention"
}
base_config = super(Attention, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
当我使用标准keras model.predict()接收与tf-serving模型使用相同数据格式的模型进行预测时,它会按预期工作:
class Attention(Layer):...
with open("CNN_last_test_set.pkl", "rb") as fp:
x_arr_test, y_test = pickle.load(fp)
model = keras.models.load_model(r"Data/modelCNN.model", custom_objects={"Attention": Attention})
out = x_arr_test[:1, :]
test1 = out.shape
out = out.tolist()
test = model.predict([out])
>> print(test)
>> [[0.21351092]]
这使我相信,当我将模型从keras导出到.pb文件时,或者以某种方式在docker容器中运行模型时,都会发生此问题。
我不确定导致此错误的原因,但我认为这与我的自定义图层对象有关,因为它可以与仅包含标准Keras图层的先前模型一起使用。
非常感谢您的帮助!
编辑:我解决了这个问题,问题是我的输入数据有两个多余的维度。我意识到,当我从变量“ out”周围删除括号时,我的错误从“转置期望大小为5的向量”变为“转置期望大小为4的向量”。因此,我将“输出”变量从(1,50)更改为(50,),并删除了括号,问题得以解决。