运行 为未初始化的变量导入 TensorFlow 图失败
Run importing TensorFlow graph fails for uninitialized variables
我正在尝试 运行 在 java 中使用 TensorFlow javacpp-presets
进行 TensorFlow 训练。我使用 tf.train.write_graph(sess.graph_def, '.', 'example.pb', as_text=False)
生成了一个 .pb 文件,如下所示。
import tensorflow as tf
import numpy as np
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0), name='Weights')
biases = tf.Variable(tf.zeros([1]), name='biases')
y = Weights * x_data + biases
loss = tf.reduce_mean(tf.square(y - y_data)) #compute the loss
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss, name='train')
init = tf.global_variables_initializer()
with tf.Session() as sess:
print(sess.run(Weights), sess.run(biases))
tf.train.write_graph(sess.graph_def, '.', 'example.pb', as_text=False)
我得到了:
Exception in thread "main" java.lang.Exception: Attempting to use uninitialized value Weights"
当我运行:
tensorflow.Status s = session.Run(new StringTensorPairVector(new String[] {}, new Tensor[] {}), new tensorflow.StringVector(), new tensorflow.StringVector("train"), outputs);
加载图表后,tensorflow.ReadBinaryProto(Env.Default(), "./example.pb", def);
有没有javacpp-presets
api做和init = tf.global_variables_initializer()
一样的工作?
或者我可以用来初始化所有变量的任何 C++ TensorFlow api?
在您的 Python 程序中,init
(tf.global_variables_initializer()
的结果)是一个 tf.Operation
,当传递给 sess.run()
时。如果您在构建 Python 图时捕获 init.name
的值,则可以在 运行 训练步骤之前将该名称传递给 Java 程序中的 session.Run()
。
我不是 100% 确定 javacpp-presets
的 API 是什么样子,但我认为您可以这样做:
tensorflow.Status s = session.Run(
new StringTensorPairVector(new String[] {}, new Tensor[] {}),
new tensorflow.StringVector(),
new tensorflow.StringVector(value_of_init_dot_name),
outputs);
...其中 value_of_init_dot_name
是您从 Python 程序获得的 init.name
的值。
我正在尝试 运行 在 java 中使用 TensorFlow javacpp-presets
进行 TensorFlow 训练。我使用 tf.train.write_graph(sess.graph_def, '.', 'example.pb', as_text=False)
生成了一个 .pb 文件,如下所示。
import tensorflow as tf
import numpy as np
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0), name='Weights')
biases = tf.Variable(tf.zeros([1]), name='biases')
y = Weights * x_data + biases
loss = tf.reduce_mean(tf.square(y - y_data)) #compute the loss
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss, name='train')
init = tf.global_variables_initializer()
with tf.Session() as sess:
print(sess.run(Weights), sess.run(biases))
tf.train.write_graph(sess.graph_def, '.', 'example.pb', as_text=False)
我得到了:
Exception in thread "main" java.lang.Exception: Attempting to use uninitialized value Weights"
当我运行:
tensorflow.Status s = session.Run(new StringTensorPairVector(new String[] {}, new Tensor[] {}), new tensorflow.StringVector(), new tensorflow.StringVector("train"), outputs);
加载图表后,tensorflow.ReadBinaryProto(Env.Default(), "./example.pb", def);
有没有javacpp-presets
api做和init = tf.global_variables_initializer()
一样的工作?
或者我可以用来初始化所有变量的任何 C++ TensorFlow api?
在您的 Python 程序中,init
(tf.global_variables_initializer()
的结果)是一个 tf.Operation
,当传递给 sess.run()
时。如果您在构建 Python 图时捕获 init.name
的值,则可以在 运行 训练步骤之前将该名称传递给 Java 程序中的 session.Run()
。
我不是 100% 确定 javacpp-presets
的 API 是什么样子,但我认为您可以这样做:
tensorflow.Status s = session.Run(
new StringTensorPairVector(new String[] {}, new Tensor[] {}),
new tensorflow.StringVector(),
new tensorflow.StringVector(value_of_init_dot_name),
outputs);
...其中 value_of_init_dot_name
是您从 Python 程序获得的 init.name
的值。