在tensorflow java中永久更新变量(在推理过程中)

在tensorflow java中永久更新变量(在推理过程中),java,python,variables,tensorflow,Java,Python,Variables,Tensorflow,我已经使用python tensorflow训练了一个模型,我想用java tensorflow进行推理。我已将经过培训的模型/图形加载到Java中。在此之后,我想永久地更新图中的一个变量。我知道python中的tf.variable.load(value,session)函数可以用来更新变量的值。我想知道Java中是否有类似的方法 到目前为止,我已经尝试了以下几点 // g and s are loaded graphs and sessions respectively s.runner()

我已经使用python tensorflow训练了一个模型,我想用java tensorflow进行推理。我已将经过培训的模型/图形加载到Java中。在此之后,我想永久地更新图中的一个变量。我知道python中的
tf.variable.load(value,session)
函数可以用来更新变量的值。我想知道Java中是否有类似的方法

到目前为止,我已经尝试了以下几点

// g and s are loaded graphs and sessions respectively
s.runner().feed(variableName,updatedTensorValue)
但是在同一行中执行的
fetch
调用期间,上面的行仅对
variableName
使用
updatedensorvalue

g.opBuilder("Assign",variableName).setAttr("value",updatedTensorValue).build();
上面的一行不是更新值,而是尝试向图中添加相同的变量,因此引发异常

除了永久更新图形中的变量之外,在所有
fetch
调用期间,我将始终调用
feed(variableName,updatedensorvalue)
方法。我将在几个实例上运行推断代码,因此我想知道这个额外的
feed
调用需要多长时间


谢谢

在TensorFlow中执行大多数操作的方法是执行一个操作。您尝试运行
Assign
操作的方法是正确的,但调用它时出错,因为要分配的
不是
Assign
操作的“属性”,而是输入张量。(请参阅原始文档,不过必须承认,除非您熟悉TensorFlow的内部结构,否则定义可能不容易理解)

但是,您不需要在Java中向图形添加操作即可完成此操作。相反,您可以完全按照Python中的操作执行操作,输入输入值

例如,考虑以下在Python中构建的图:

import tensorflow as tf

var = tf.Variable(1.0, name='myvar')
init = tf.global_variables_initializer()

# Save the graph and write out the names of the operations of interest
tf.train.write_graph(tf.get_default_graph(), '/tmp', 'graph.pb', as_text=False)
print('Init all variables:         ', init.name)
print('myvar.initializer:          ', var.initializer.name)
print('myvar.initializer.inputs[1]:', var.initializer.inputs[1].name)
现在,我们复制Java中Python
var.load()
的行为,使用如下方式为变量赋值3.0:

try (Tensor<Float> newValue = Tensors.create(3.0f)) {
  s.runner()
    .feed("myvar/initial_value", newVal) // myvar.initializer.inputs[1].name
    .addTarget("myvar/Assign")           // myvar.initializer.name
    .run();
}
try(Tensor newValue=Tensors.create(3.0f)){
s、 跑步者()
.feed(“myvar/initial_value”,newVal)//myvar.initializer.inputs[1]。名称
.addTarget(“myvar/Assign”)//myvar.initializer.name
.run();
}

希望对您有所帮助。

在线程“main”java.lang.IllegalArgumentException中使用上述命令获得以下异常
异常:在org.tensorflow.Session$Runner.operationByName(Session.java:356)的org.tensorflow.Session$Runner.parseOutput(Session.java:365)的图中没有名为[**myvariable**/initial_value]的操作在org.tensorflow.Session$Runner.feed(Session.java:131)
My graph只有2个包含myvariable的操作;这两个操作是myvariable和myvariable/read。根据模型的创建方式,初始化操作的名称可能是图形中的其他内容。要获取op的名称,请使用上面建议的
print(var.initializer.name)
,其中
var
tf.Variable
对象。你能那样做吗?