gpt4 book ai didi

可以使用 TensorFlow C API 训练 Keras 模型吗?

转载 作者:行者123 更新时间:2023-12-03 11:30:57 38 4
gpt4 key购买 nike

我在 Keras 中定义了一个模型,我想使用 TensorFlow C API 为强化学习应用程序训练该模型。 (实际上是通过 Rust 编程语言,但它直接使用 C API。)我一直在努力寻找某种方法来做到这一点,但到目前为止还没有运气。我曾期望使用 SavedModel 序列化操作或函数,这将允许训练,但我没有看到它们。甚至可以从 C 中训练 Keras 模型吗?还是一般的 TF 模型?

最佳答案

您可以创建一个 Custom Keras Model一个 tf.function 用于训练,另一个用于预测。

class MyModel(tf.keras.Model):
def __init__(self, name=None, **kwargs):
super().__init__(**kwargs)

#### define your layers here ####
self.vec_layer = vectorizer
self.preds = model

#### override call function (used for prediction) ####
@tf.function
def call(self, inputs, training=False):
#### define model structure ####
x = self.vec_layer(inputs)
return self.preds(x)
#return {'output': self.preds(x)} #return labeled result

#### this function only calls the train_step. ####
#It can return whatever the user wants. Examples returning wither loss or nothing
@tf.function
def training(self, data):
loss = self.train_step(data)['loss']
return {'loss': loss}
return {}

model = MyModel(name="end_model")
然后,您必须编译和构建模型。
model.compile(loss="sparse_categorical_crossentropy", optimizer="SGD", metrics=["acc"])
model.fit([["Ok."]], [1], batch_size=1, epochs=1)
在保存模型之前,您需要将 tf.functions 定义为具体函数并将它们作为签名函数传递。
call_output = model.call.get_concrete_function(tf.TensorSpec([None,1], tf.string, name='input'))
train_output = model.training.get_concrete_function((tf.TensorSpec([None,1], tf.string, name='inputs'),tf.TensorSpec([None,1], tf.float32, name='target')))
model.save("model_saved.tf", save_format="tf", signatures={'train': train_output, 'predict': call_output})
现在,您可以使用 C API 在模型中训练/预测
TF_Graph* graph = TF_NewGraph();
TF_Status* status = TF_NewStatus();
TF_SessionOptions* SessionOpts = TF_NewSessionOptions();
TF_Buffer* RunOpts = NULL;

const char* saved_model_dir = "MODEL_DIRECTORY";
const char* tags = "serve"; //saved_model_cli

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));
}
然后,将您的输入和输出张量创建为 here .现在,只需调用 TF_SessionRun。
#### predicting ####
TF_SessionRun(session, nullptr,
input_operator, input_values, 1,
output_operator, output_values, 1,
nullptr, 0, nullptr, status);

#### training ####
TF_SessionRun(session, nullptr, input_target_operators, input_target_values, 2, loss_operator, loss_values, 1, nullptr, 0, nullptr, status);
需要注意的重要事项:
  • 为了获得变量名称(输入、目标、输出等),您可以使用“saved_model_cli”命令,解释 here .
  • 理论上,您必须通过“TF_SessionRun”方法传递要执行的函数的 signature_def 名称。但是,我无法完成这项工作。但是,不知何故,为“TF_SessionRun”传递正确的输入和输出值使其自动选择要使用的正确方法。
  • 上面的代码是我项目的一部分,所以它不会自己编译。但是,我希望它对您有所帮助,因为我没有足够的时间来制作一个完整的功能示例。
  • 除了已经提到的链接,this解释了如何使用 TF v1 和 this 训练模型是一个更完整的示例,说明如何在 python 中构建和保存模型。
  • 关于可以使用 TensorFlow C API 训练 Keras 模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61907288/

    38 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com