TensorFlow:如何为 TensorBoard 总结两个对象网络?
TensorFlow: How can I summary two objects networks for TensorBoard?
我有一个 class 有创建网络的方法。
class DQN:
def __init__(self, session, input_size, output_size, name):
.
.
.
self._build_network()
def _build_network(self, h_size=16, l_rate=0.01):
with tf.variable_scope(self.net_name):
self._X = tf.placeholder(tf.float32, [None, self.input_size], name="input_x")
net = self._X
net = tf.layers.dense(net, h_size, activation=lambda x: tf.maximum(0.3*x,x))
net = tf.layers.dense(net, self.output_size)
self._Qpred = net
self._Y = tf.placeholder(shape=[None, self.output_size], dtype=tf.float32)
# Loss function
with tf.name_scope("loss") as scope:
self._loss = tf.reduce_mean(tf.square(self._Y - self._Qpred))
self._loss_summary = tf.summary.scalar("loss", self._loss)
# Learning
self._train = tf.train.AdamOptimizer(learning_rate=l_rate).minimize(self._loss)
def update(self, x_stack, y_stack, merged_summary):
return self.session.run(
[self._loss, self._train, merged_summary],
feed_dict={
self._X: x_stack,
self._Y: y_stack,
}
)
并且必须创建两个 DQN
实例(单独的网络)。
def main():
with tf.Session() as sess:
mainDQN = dqn.DQN(sess, input_size, output_size, name="main")
targetDQN = dqn.DQN(sess, input_size, output_size, name="target")
merged_summary = tf.summary.merge_all()
writer = tf.summary.FileWriter("./logs/dqn_log")
writer.add_graph(sess.graph)
.
.
.
loss, _, summary = mainDQN.update(x_stack, y_stack, merged_summary)
writer.add_summary(summary, global_step=episode)
我想做的是跟踪 mainDQN
的 loss
功能。但是使用上面的代码,调用 update()
时会发生错误。
:
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'target/input_x' with dtype float
[[Node: target/input_x = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
我认为这个错误与 targetDQN
...
有关
但是不知道怎么处理。
需要你的建议,谢谢。
没错,问题与 targetDQN
对象有关。基本上发生的事情是你的 merged_summary
是一个同时依赖于你的主 loss
和你的目标 loss
的操作。因此,当您询问其评估时,它将需要输入 DQN
.
我建议以这种方式重构您的 update
函数:
def update(self, x_stack, y_stack):
return self.session.run(
[self._loss, self._train, self._loss_summary],
feed_dict={
self._X: x_stack,
self._Y: y_stack,
}
)
所以你只要求评价正确的摘要。
编辑:如果您想要更多与您的 DQN
对象之一关联的摘要,您可以使用 tf.summary.merge
方法合并它们(请参阅 API documentation)并要求对其进行评估.
我有一个 class 有创建网络的方法。
class DQN:
def __init__(self, session, input_size, output_size, name):
.
.
.
self._build_network()
def _build_network(self, h_size=16, l_rate=0.01):
with tf.variable_scope(self.net_name):
self._X = tf.placeholder(tf.float32, [None, self.input_size], name="input_x")
net = self._X
net = tf.layers.dense(net, h_size, activation=lambda x: tf.maximum(0.3*x,x))
net = tf.layers.dense(net, self.output_size)
self._Qpred = net
self._Y = tf.placeholder(shape=[None, self.output_size], dtype=tf.float32)
# Loss function
with tf.name_scope("loss") as scope:
self._loss = tf.reduce_mean(tf.square(self._Y - self._Qpred))
self._loss_summary = tf.summary.scalar("loss", self._loss)
# Learning
self._train = tf.train.AdamOptimizer(learning_rate=l_rate).minimize(self._loss)
def update(self, x_stack, y_stack, merged_summary):
return self.session.run(
[self._loss, self._train, merged_summary],
feed_dict={
self._X: x_stack,
self._Y: y_stack,
}
)
并且必须创建两个 DQN
实例(单独的网络)。
def main():
with tf.Session() as sess:
mainDQN = dqn.DQN(sess, input_size, output_size, name="main")
targetDQN = dqn.DQN(sess, input_size, output_size, name="target")
merged_summary = tf.summary.merge_all()
writer = tf.summary.FileWriter("./logs/dqn_log")
writer.add_graph(sess.graph)
.
.
.
loss, _, summary = mainDQN.update(x_stack, y_stack, merged_summary)
writer.add_summary(summary, global_step=episode)
我想做的是跟踪 mainDQN
的 loss
功能。但是使用上面的代码,调用 update()
时会发生错误。
:
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'target/input_x' with dtype float
[[Node: target/input_x = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
我认为这个错误与 targetDQN
...
但是不知道怎么处理。
需要你的建议,谢谢。
没错,问题与 targetDQN
对象有关。基本上发生的事情是你的 merged_summary
是一个同时依赖于你的主 loss
和你的目标 loss
的操作。因此,当您询问其评估时,它将需要输入 DQN
.
我建议以这种方式重构您的 update
函数:
def update(self, x_stack, y_stack):
return self.session.run(
[self._loss, self._train, self._loss_summary],
feed_dict={
self._X: x_stack,
self._Y: y_stack,
}
)
所以你只要求评价正确的摘要。
编辑:如果您想要更多与您的 DQN
对象之一关联的摘要,您可以使用 tf.summary.merge
方法合并它们(请参阅 API documentation)并要求对其进行评估.