Tesortflow:使用python进行模型训练并在Golang中运行模型,在导入模型时出现问题

时间:2020-09-18 06:44:04

标签: python tensorflow go tensorflow2.0

首先,我想对tensorflow和golang感到失望,实际上它来自同一家公司,但两者之间的互通并不是最佳选择。例如,我在python下安装了tensorflow 2.3的最新版本,它运行正常,但是在golang下我遇到了一个例外:import tensorflow as tf df = pd.read_csv(data_path, sep=';') X = df[df.columns[:8]] y = df[df.columns[8:-1]] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3) model = tf.keras.Sequential() model.add(tf.keras.layers.Dense(8, activation='relu', name="inputNode")) model.add(tf.keras.layers.Dense(150, activation='relu')) model.add(tf.keras.layers.Dense(3, name="inferNode")) model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) model.fit(X_train, y_train, epochs=500) tf.keras.models.save_model(model=model, filepath='./', save_format='tf')

所以,然后我将版本更改为1.15.0。我不明白为什么tensorflow和golang支持这么差。

所以,回到我的问题:

带有tensorflow 2.3的python代码

model, err := tf.LoadSavedModel("./", []string{"serve"}, nil)
if err != nil {
    fmt.Printf("Error loading saved model: %s\n", err.Error())
    return
}
defer model.Session.Close()
data := [][]float32{make([]float32, 8)}
data[0][0] = 1.0
data[0][1] = 1.0
data[0][2] = 1.0
data[0][3] = 1.0
data[0][4] = 1.0
data[0][5] = 1.0
data[0][6] = 1.0
data[0][7] = 1.0
tensor, _ := tf.NewTensor(data)

result, err := model.Session.Run(
map[tf.Output]*tf.Tensor{
    model.Graph.Operation("inputNode_input").Output(0): tensor, // Replace this with your input layer name
},
[]tf.Output{
    model.Graph.Operation("inferNode").Output(0), // Replace this with your output layer name
},
nil,
)

if err != nil {
fmt.Printf("Error running the session with input, err: %s\n", err.Error())
return
}

fmt.Printf("Result value: %v \n", result[0].Value())

带有tensorflow 1.15.0的Golang代码

-- FAIL: TestMlPredict (6.93s)
panic: nil-Operation. If the Output was created with a Scope object, see Scope.Err() for details. [recovered]
    panic: nil-Operation. If the Output was created with a Scope object, see Scope.Err() for details.

golang抛出此异常:

{{1}}

这是示例特征向量

标题:20 15 10 5 0 branch1 branch2 branch3 output1 output2 output3
数据:2.518878 3.778791 5.021497 5.559673 5.402780 0.0 0.109421 0.109253 0.0 0.0 1.0

我在做什么错?输入和输出名称应该正确。

2 个答案:

答案 0 :(得分:1)

我实际上在我维护的TensorFlow的一个分支中解决了第一个问题,该问题包含所有已编译的protobuf。 fork是程序包galeone/tfgo的依赖项,它会使用Set objFSO = CreateObject("Scripting.FileSystemObject") With objFSO If .folderexists(Environ("UserProfile") & "\OneDrive - company name\Pictures\Camera Roll") Then Set objFolder = objFSO.GetFolder(Environ("UserProfile") & "\OneDrive - company name\Pictures\Camera Roll") Else Set objFolder = objFSO.GetFolder(Environ("UserProfile") & "\picture\camera roll") End If End With 自动下载。

您尝试

go mod

您将能够使用tensorflow / go和tensorflow / op软件包以及tfgo的所有附加功能。

答案 1 :(得分:0)

操作名称错误。我是怎么找到这些名字的?我执行了cli命令: saved_model_cli show --dir ./ --all

那么golang和tensorflow 2.3呢?请检查问题:github issue 和 自述文件:readme