- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正尝试在 Linux 上通过 1.4 Java API 构建和评估 TensorFlow Graphs。我注意到每次调用 Session.run() 时,Java API 似乎都会重置操作输出张量的值。这种行为似乎与 Python 中发生的情况不符。我最终的问题(详见下文)是如何避免这种明显的行为?
这里的示例是 Python 代码(也使用 1.4 API),它增加标量张量中的值。
>>> import tensorflow as tf
>>> x = tf.get_variable("x", [], dtype=tf.float32, initializer=tf.zeros_initializer)
>>> step = tf.constant(1.0)
>>> xUpdateOp = x.assign_add(step)
>>> s = tf.Session()
>>> s.run(x.initializer)
>>> x.eval(s)
0.0
>>> s.run(xUpdateOp)
1.0
>>> x.eval(s)
1.0
>>> s.run(xUpdateOp)
2.0
>>> x.eval(s)
2.0
>>>
请注意,正如预期的那样,评估 x 会给出其当前值,并且使用 session 运行 xUpdateOp 会使 x 变大 1。
这是我尝试使用 Java 构建一个递增标量张量的 Tensorflow 图。 Java API 中的初始化有所不同,因为它缺少一些 Python 的便捷方法。
public static void doCounting(){
try(Graph g = new Graph()){
try(Tensor<Float> zeroT = Tensors.create(0.0f);
Tensor<Float> stepT = Tensors.create(1.0f)){
Output<Float> zero = g.opBuilder("Const", "start")
.setAttr("dtype", zeroT.dataType())
.setAttr("value", zeroT)
.build().output(0);
Output<Float> step = g.opBuilder("Const", "step")
.setAttr("dtype", stepT.dataType())
.setAttr("value", stepT)
.build().output(0);
Output<Float> xVar = g.opBuilder("Variable", "x")
.setAttr("dtype", zero.dataType())
.setAttr("shape", zero.shape())
.build().output(0);
Output<Float> x = g.opBuilder("Assign", "init_x")
.addInput(xVar)
.addInput(zero)
.build().output(0);
Operation xUpdateOp = g.opBuilder("AssignAdd", "x_get_x_plus_step")
.addInput(x)
.addInput(step)
.build();
try(Session s = new Session(g)) {
s.runner().addTarget(xUpdateOp).run();
s.runner().addTarget(xUpdateOp).run();
s.runner().addTarget(xUpdateOp).run();
try(Tensor<Float> result = s.runner().fetch(xUpdateOp.name(), 0).run().get(0).expect(Float.class)){
System.out.println(result.floatValue());
}
}
}
}
}
以上代码片段的输出
1.0
但我预计它是 4.0,因为我在 xUpdateOp 上调用了 run() 4 次。即使我差一个 1.0 也不是我所期望的。
我需要如何处理此 Java 示例才能获得与 Python 示例相同的行为?如何让 xUpdateOp 使用在之前调用 run() 时计算的 x 值?
我已经尝试过使用 feed() 函数来输入 x 值
try(Session s = new Session(g)) {
try(Tensor<Float> x1 = s.runner().fetch(xUpdateOp.name()).run().get(0).expect(Float.class)) {
s.runner().feed(xUpdateOp.name(), 0, x1);
try (Tensor<Float> result = s.runner().fetch(xUpdateOp.name(), 0).run().get(0).expect(Float.class)) {
System.out.println(result.floatValue());
}
}
}
结果
1.0
我还尝试在没有 addTarget 或 fetch() 的情况下调用 run(),认为 addTarget 或 fetch() 是导致状态重置的原因。也许一旦 session 了解要运行的内容,它就可以运行多次。
try(Session s = new Session(g)) {
s.runner().addTarget(xUpdateOp).run();
s.runner().run();
s.runner().run();
try(Tensor<Float> result = s.runner().fetch(xUpdateOp.name(), 0).run().get(0).expect(Float.class)){
System.out.println(result.floatValue());
}
}
结果
Exception in thread "main" java.lang.IllegalArgumentException: Must specify at least one target to fetch or execute.
at org.tensorflow.Session.run(Native Method)
at org.tensorflow.Session.access$100(Session.java:48)
at org.tensorflow.Session$Runner.runHelper(Session.java:298)
at org.tensorflow.Session$Runner.run(Session.java:248)
at org.tensorflow.examples.Example.doCounting(MandelbrotExample.java:80)
at org.tensorflow.examples.Example.main(MandelbrotExample.java:50)
ERROR: Non-zero return code '1' from command: Process exited with status 1.
How to create/initialize a Variable with Tensorflow 1.0 Java API
java tensorflow reset_default_graph
Java - train loaded tensorflow model
提前感谢您的宝贵时间!
最佳答案
在您的示例中,xUpdateOp
将x
作为输入,x
是分配零< 的操作的输出
到变量。因此,每次运行 xUpdateOp
时,它都会首先将零分配给变量。
对您的代码稍作调整即可生成 4.0:
# Changed addInput(x) to addInput(xVar)
Operation xUpdateOp =
g.opBuilder("AssignAdd", "x_get_x_plus_step").addInput(xVar).addInput(step).build();
try (Session s = new Session(g)) {
# Initialize the variable once
s.runner().addTarget(x.op()).run();
s.runner().addTarget(xUpdateOp).run();
s.runner().addTarget(xUpdateOp).run();
s.runner().addTarget(xUpdateOp).run();
try (Tensor<Float> result =
s.runner().fetch(xUpdateOp.name(), 0).run().get(0).expect(Float.class)) {
System.out.println(result.floatValue());
}
}
与 Python 代码类比:上面的 Java 代码片段更像是问题中的 Python 代码。虽然问题中的 Java 代码更像是 Python 中的以下代码:
import tensorflow as tf
zero = tf.constant(0.0)
step = tf.constant(1.0)
xVar = tf.Variable(initial_value=zero, name="x")
x = tf.assign(xVar, zero)
xUpdateOp = tf.assign_add(x, step)
所以 tf.assign_add(x, step)
与 tf.assign_add(xVar, step)
会产生很大的不同。在前者中,AssignAdd
操作应用于 Assign
操作的输出。
希望对您有所帮助。
关于java - 为什么 Java Tensorflow session 似乎重置了状态,而 Python Tensorflow session 却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48118747/
我正在通读 Windows Phone 7.5 Unleashed,有很多代码看起来像这样(在页面的代码隐藏中): bool loaded; protected override void OnNav
在cgi服务器中,我这样返回 print ('Status: 201 Created') print ('Content-Type: text/html') print ('Location: htt
我正在查看 esh(easy shell)的实现,无法理解在这种情况下什么是 22 和 9 信号。理想情况下,有一个更具描述性的常量,但我找不到列表。 最佳答案 信号列表及其编号(包括您看到的这两个)
我的Oozie Hive Action 永远处于运行模式。 oozie.log文件中没有显示错误。
我正在编写一个使用 RFCOMM 通过蓝牙连接到设备的 Android 应用程序。我使用 BluetoothChat 示例作为建立连接的基础,大部分时间一切正常。 但是,有时由于出现套接字已打开的消息
我有一个云调度程序作业,它应该每小时访问我的 API 以更新一些价格。这些作业大约需要 80 秒才能运行。 这是它的作用: POST https://www.example.com/api/jobs/
我正在 Tomcat 上访问一个简单的 JSP 页面: 但是当我使用 curl 测试此页面时,我得到了 200 响应代码而不是预期的 202: $ curl -i "http://localhos
有时 JAR-RS 客户端会发送错误的语法请求正文。服务器应响应 HTTP status 400 (Bad Request) , 但它以 HTTP status 500 (Internal Serve
我正在尝试通过 response.send() 发送一个整数,但我不断收到此错误 express deprecated res.send(status): Use res.sendStatus(sta
我已经用 Excel 和 Java 做过很多次了……这次我需要用 Stata 来做,因为保存变量更方便'labels .如何将 dataset_1 重组为下面的 dataset_2? 我需要转换以下
我正在创建一个应用程序,其中的对象具有状态查找功能。为了提供一些上下文,让我们使用以下示例。 帮助台应用程序,其中创建作业并通过以下工作流程移动: 新 - 工作已创建但未分配 进行中 - 分配给工作人
我想在 Keras 中运行 LSTM 并获得输出和状态。在 TF 中有这样的事情 with tf.variable_scope("RNN"): for time_step in range
有谁知道 Scala-GWT 的当前状态 项目? 那里的主要作者 Grzegorz Kossakowski 似乎退出了这个项目,在 Spring 中从事 scalac 的工作。 但是,在 interv
我正在尝试编写一个 super 简单的 applescript 来启动 OneDrive App , 或确保打开,当机器的电源设置为插入时,将退出,或确保关闭,当电源设置为电池时。 我无法找到如何访问
目前我正在做这样的事情 link.on('click', function () { if (link.attr('href') !== $route.current.originalPath
是否可以仅通过查看用户代理来检测浏览器上是否启用/禁用 Javascript。 如果是,我应该寻找什么。如果否,检测用户浏览器是否启用/禁用 JavaScript 的最佳方法是什么 最佳答案 不,没有
Spring 和 OSGi 目前的开发状况如何? 最近好像有点安静了。 文档的最新版本 ( http://docs.spring.io/osgi/ ) 来自 2009 年。 我看到一些声明 Sprin
我正在从主函数为此类创建一个线程,但即使使用 Thread.currentThread().interrupt() 中断它,输出仍然包含“Still Here”行。 public class Writ
为了满足并发要求,我想知道如何在 Godog 中的多个步骤之间传递参数或状态。 func FeatureContext(s *godog.Suite) { // This step is ca
我有一个UIButton子类,它不使用UIImage背景,仅使用背景色。我注意到的一件事是,当您设置按钮的背景图像时,有一个默认的突出显示状态,当按下按钮时,该按钮会稍微变暗。 这是我当前的代码。
我是一名优秀的程序员,十分优秀!