【问题标题】:Unable to predict when loading a Tensorflow model in Go在 Go 中加载 TensorFlow 模型时无法预测
【发布时间】:2017-10-01 12:21:46
【问题描述】:

我在 Go 中加载了一个 Tensorflow 模型,但无法获得预测 - 它一直在抱怨形状不匹配 - 一个简单的二维数组。在此不胜感激,非常感谢您。

Error running the session with input, err: You must feed a value for placeholder tensor 'theoutput_target' with dtype float
 [[Node: theoutput_target = Placeholder[_output_shapes=[[?,?]], dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

被发送的输入张量是 [][]float32{ {1.0}, }

a := [][]float32{ {1.0}, }
tensor, terr :=  tf.NewTensor(a)
if terr != nil {
    fmt.Printf("Error creating input tensor: %s\n", terr.Error())
    return
}
result, runErr := model.Session.Run(
    map[tf.Output]*tf.Tensor{
        model.Graph.Operation("theinput").Output(0): tensor,
    },
    []tf.Output{
        model.Graph.Operation("theoutput_target").Output(0),
    },
    nil,
)

模型通过 Keras 生成,并在之后使用 SavedModelBuilder 导出到 TF:

layer_name_input = "theinput"
layer_name_output = "theoutput"

def get_encoder():
    model = Sequential()
    model.add(Dense(5, input_dim=1))
    model.add(Activation("relu"))
    model.add(Dense(5, input_dim=1))
    return model

inputs = Input(shape=(1, ), name=layer_name_input)
encoder = get_encoder()
model = encoder(inputs)
model = Activation("relu")(model)
objective = Dense(1, name=layer_name_output)(model)
model = Model(inputs=[inputs], outputs=objective)
model.compile(loss='mean_squared_error', optimizer='sgd')

编辑 - 已修复,从 Keras 导出到 TF(图层名称)时出现问题。在此处粘贴导出,希望对其他人有所帮助:

def export_to_tf(keras_model_path, export_path, export_version, is_functional=False):

    sess = tf.Session()
    K.set_session(sess)
    K.set_learning_phase(0)

    export_path = os.path.join(export_path, str(export_version))

    model = load_model(keras_model_path)
    config = model.get_config()
    weights = model.get_weights()
    if is_functional == True:
        model = Model.from_config(config)
    else:
        model = Sequential.from_config(config)
    model.set_weights(weights)

    with K.get_session() as sess:
        inputs = [ (model_input.name.split(":")[0], model_input) for model_input in model.inputs]
        outputs = [ (model_output.name.split(":")[0], model_output) for model_output in model.outputs]
        signature = predict_signature_def(inputs=dict(inputs),
                                      outputs=dict(outputs))
        input_descriptor = [ { 'name': item[0], 'shape': item[1].shape.as_list() } for item in inputs]
        output_descriptor = [ { 'name': item[0], 'shape': item[1].shape.as_list() } for item in outputs]
        builder = saved_model_builder.SavedModelBuilder(export_path)
        builder.add_meta_graph_and_variables(
            sess=sess,
            tags=[tag_constants.SERVING],
            signature_def_map={signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature})
        builder.save()

        descriptor = dict()
        descriptor["inputs"] = input_descriptor
        descriptor["outputs"] = output_descriptor
        pprint.pprint(descriptor)               

【问题讨论】:

  • 这在您的代码和错误中有些奇怪。 Tensorflow 抱怨名称为“theoutput_target”的占位符缺少值,而该占位符从未在您发布的代码中定义。相反,您的代码定义了一个名称为“theinput”的占位符。
  • 非常感谢,这确实是一个层命名问题(即使层在 Keras 中正确命名,它们最终在 TF 中具有不同的名称 - 粘贴了上面的新导出代码(基本上只是读取图表并输出图层名称,之后我将使用 Go 中的这些名称)
  • 不客气!既然我解决了你的问题,我将复制评论并将其发布为答案,请随时接受它

标签: go tensorflow keras


【解决方案1】:

这在您的代码和错误中有些奇怪。 Tensorflow 抱怨名称为“theoutput_target”的占位符缺少值,而该占位符从未在您发布的代码中定义。相反,您的代码定义了一个名称为“theinput”的占位符。

另外,我建议你使用更完整、更易于使用的 tensorflow API 包装器:tfgo

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 2018-03-04
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2020-03-16
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多