'转置期望的大小为5的向量。但是在对tensorflow服务模型进行POST请求时,input(1)的大小为3 \ n \ t“

时间:2019-02-07 21:53:11

标签: docker tensorflow keras tensorflow-serving

我已经训练了一个模型,并将其部署到张量流服务以进行推断。

发出请求时出现此错误:

<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,),并删除了括号,问题得以解决。

0 个答案:

没有答案