c++ - 用 C++ 训练 Keras 模块
问题描述
我正在尝试tf.keras.Sequential
用 C++ 训练模型。使用 python 创建模型。我可以使用 tf c api 在 C++ 中加载。前向处理有效,但我无法训练模型。我看了这个:可以使用 TensorFlow C API 训练 Keras 模型吗?但我还是不明白。这是我的python文件
import tensorflow as tf
model = tf.keras.Sequential(
[
tf.keras.layers.InputLayer(1),
tf.keras.layers.Dense(1),
])
model.compile(optimizer="adam", loss="mse")
model.save("x64/Debug/model_saved.tf", save_format="tf")
这是 C++ 文件
// CPP Keras.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <tensorflow/c/c_api.h>
void NoOpDeallocator(void* data, size_t a, void* b) {}
int main()
{
//********* Read model
TF_Graph* Graph = TF_NewGraph();
TF_Status* Status = TF_NewStatus();
TF_SessionOptions* SessionOpts = TF_NewSessionOptions();
TF_Buffer* RunOpts = NULL;
const char* saved_model_dir = "D:/MyCode/AGreatYear2021/reposetories/AlphaZero/test/CPP Keras/x64/Debug/model_saved.tf";
const char* tags = "serve"; // default model serving tag; can change in future
int ntags = 1;
TF_Session* Session = TF_LoadSessionFromSavedModel(SessionOpts, RunOpts, saved_model_dir, &tags, ntags, Graph, NULL, Status);
if(TF_GetCode(Status) == TF_OK)
{
printf("TF_LoadSessionFromSavedModel OK\n");
}
else
{
printf("%s",TF_Message(Status));
}
//****** Get input tensor
//TODO : need to use saved_model_cli to read saved_model arch
int NumInputs = 1;
TF_Output* Input = (TF_Output*)malloc(sizeof(TF_Output) * NumInputs);
TF_Output t2 = { TF_GraphOperationByName(Graph, "StatefulPartitionedCall"), 0 };
TF_Output t1 = { TF_GraphOperationByName(Graph, "serving_default_input_1"), 0 };
if(t1.oper == NULL)
printf("ERROR: Failed TF_GraphOperationByName serving_default_input_1\n");
else
printf("TF_GraphOperationByName serving_default_input_1 is OK\n");
Input[0] = t1;
int NumOutputs = 1;
TF_Output* Output = (TF_Output*)malloc(sizeof(TF_Output) * NumOutputs);
if (t2.oper == NULL)
printf("ERROR: Failed TF_GraphOperationByName StatefulPartitionedCall\n");
else
printf("TF_GraphOperationByName StatefulPartitionedCall is OK\n");
Output[0] = t2;
//********* Allocate data for inputs & outputs
TF_Tensor** InputValues = (TF_Tensor**)malloc(sizeof(TF_Tensor*) * NumInputs);
TF_Tensor** OutputValues =(TF_Tensor**)malloc(sizeof(TF_Tensor*) * NumOutputs);
int ndims = 2;
int64_t dims[] = { 1,1 };
float data[] = { 1 };
int ndata = sizeof(float); // This is tricky, it number of bytes not number of element
TF_Tensor* int_tensor = TF_NewTensor(TF_FLOAT, dims, ndims, data, ndata, &NoOpDeallocator, 0);
if (int_tensor != NULL)
{
printf("TF_NewTensor is OK\n");
}
else
printf("ERROR: Failed TF_NewTensor\n");
TF_Tensor* out_tensor = TF_NewTensor(TF_FLOAT, dims, ndims, data, ndata, &NoOpDeallocator, 0);
if (int_tensor != NULL)
{
printf("TF_NewTensor is OK\n");
}
else
printf("ERROR: Failed TF_NewTensor\n");
InputValues[0] = int_tensor;
// //Run the Session
TF_SessionRun(Session, NULL, Input, InputValues, NumInputs, Output, OutputValues, NumOutputs, NULL, 0, NULL, Status);
if (TF_GetCode(Status) == TF_OK)
{
printf("Session is OK\n");
}
else
{
printf("%s", TF_Message(Status));
}
// //Free memory
TF_DeleteGraph(Graph);
TF_DeleteSession(Session, Status);
TF_DeleteSessionOptions(SessionOpts);
TF_DeleteStatus(Status);
void* buff = TF_TensorData(OutputValues[0]);
float* offsets = (float*)buff;
printf("Result Tensor :\n");
printf("%f\n", offsets[0]);
return 0;
}
解决方案
推荐阅读
- android - 如何使用 http 向所有设备发送 fcm 通知?
- algorithm - 总和大于或等于 k 的最小子集
- python - Ebay OAuth API 错误:invalid_grant - 提供的授权授权代码无效或已颁发给另一个客户端
- python - 有没有办法将 URL 模板标签从数据库传递到 Django 中的模板?
- google-apps-script - Google Apps 脚本 - TypeError:data.forEach 不是函数
- javascript - 速度测试对象和地图
- php - 如何从 jeffochoa 教程将请求重定向到 laravel 中的特定路由
- python - Flask ldap3 登录问题
- c - 为什么 char* s 在这里会导致总线错误,但 char s[] 工作正常?
- javascript - 当我从 ng-options 中选择一项时,ng-model 的问题返回 undefined