【问题标题】:Error with Concatenation layer when serving Keras-built Tensorflow model with Tensorflow Serving使用 Tensorflow Serving 服务 Keras 构建的 Tensorflow 模型时,连接层出错
【发布时间】:2018-09-29 21:51:17
【问题描述】:

尝试在 tensorflow-serving 中为特定模型调用 predict 时遇到一个奇怪的错误:

grpc.framework.interfaces.face.face.AbortionError: 
AbortionError(code=StatusCode.INVALID_ARGUMENT, details="ConcatOp : Expected 
concatenating dimensions in the range [-1, 1), but got 1
 [[Node: lys_conc/concat = ConcatV2[N=4, T=DT_FLOAT, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_lys_in_0_4, _arg_lyb_in_0_0, flatten_1/Reshape, batch_normalization_2/batchnorm_1/add_1, lyt_conc/concat/axis)]]")

背景:我设置了一个 tensorflow-serving 容器,并成功地将一些模型移入并检查了我可以获得客户端响应(我可以)。

根据in this post 的回答,我通过在 keras 中构建和训练模型,然后将它们导出并加载到 tf-serving 来制作模型。

它失败的节点旨在连接 4 个源(2 个输入,一个扁平嵌入和一个 dropout 的输出)。导出过程已经去除了 dropout - 这就是为什么我们在那里看到(之前的)batchnorm。

其他要点:

  • 我有另一个模型,它只有两个输入(一个嵌入 + 一个 dropout)的类似 concat,它在同一个 tf 服务实例上运行良好。
  • 在 Keras 中,我没有为 concat 指定轴,但我可以在图形 def(导出之前 - 见下文)中看到它默认(正确)为 1。
  • 我注意到错误中引用的轴变量不是属于此连续层的变量(lyt 而不是 lys)。但是被引用的也应该设置为 1。我想知道这是否与错误有关,或者只是在导出过程中发生了一些小优化。

相关图定义:

node {
  name: "lys_conc/concat/axis"
  op: "Const"
  attr {
    key: "dtype"
    value {
      type: DT_INT32
    }
  }
  attr {
    key: "value"
    value {
      tensor {
        dtype: DT_INT32
        tensor_shape {
        }
        int_val: 1
      }
    }
  }
}
node {
  name: "lys_conc/concat"
  op: "ConcatV2"
  input: "lys_in"
  input: "lyb_in"
  input: "flatten_1/Reshape"
  input: "dropout_2/Identity"
  input: "lys_conc/concat/axis"
  attr {
    key: "N"
    value {
      i: 4
    }
  }
  attr {
    key: "T"
    value {
      type: DT_FLOAT
    }
  }
  attr {
    key: "Tidx"
    value {
      type: DT_INT32
    }
  }
}

对调试的任何帮助或建议表示赞赏!

【问题讨论】:

    标签: python tensorflow keras tensorflow-serving


    【解决方案1】:

    首先,将 TensorFlow 服务中的潜在问题和数据输入格式与预测本身分开可能是个好主意 很可能存在输入维度问题,因此当连接嵌入时会引发错误。

    尝试从您导出的模型中创建一个 tensorflow 预测器对象,看看您是否可以从预测中获得有效的输出

    from tensorflow.contrib import predictor
    predictor_obj = predictor.from_saved_model(export_dir)
    y = predictor_obj(inputs_to_model)
    

    如果运行,那么您的输入应该具有正确的维度。确保您尝试批量输入和单一输入)

    如果失败,您可能需要重新调整输入

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2017-05-31
      • 1970-01-01
      • 2018-08-03
      • 2019-05-16
      相关资源
      最近更新 更多