是否可以在张量图之外计算损失? 我正在编写一个演员评论算法,当我要应用渐变时,我必须调用渐变正向传递。
在每一步上,我都调用前向通行证以获取我的登录信息和值:
# collect data
for _ in range(NUM_STEPS):
sample = self.model.get_sample(s)
pong_actions = self.get_action(sample)
s_, r, d, i = self.envs.step(pong_actions)
states.append(s)
actions.append(np.expand_dims(sample, axis=1))
rewards.append(np.expand_dims(np.float32(r), axis=1))
masks.append(np.expand_dims(np.float32(1 - d), axis=1))
# do some stuff....
再次更新网络
def update_network(self, states, qvals, actions):
dict = {self.inputs: states, self.qvals: qvals, self.actions: actions}
loss, _ = self.sess.run([self.loss, self.train_op], feed_dict=dict)
return loss
如果要执行反向传播步骤,则必须使用收集的状态再次调用前向传递。
我已经拥有计算损失所需的所有值。第二个前向传递只是使网络参考权重。 如果我从图表中计算出损失并放入优化器中,则速度会更快。然后,我不必再次调用前向通行证。
更快:
# collect data
for _ in range(NUM_STEPS):
dist, v = self.model.forward(s)
pong_actions, a = self.get_action(dist)
s_, r, d, i = self.envs.step(pong_actions)
log_probs.append(dist.log_prob(a))
entropies.append(dist.entropy())
values.append(v)
rewards.append(np.expand_dims(np.float32(r), axis=1))
masks.append(np.expand_dims(np.float32(1 - d), axis=1))
# do some stuff....
# Calculate loss
loss = ...
def update_network(self, loss):
dict = {self.loss: loss}
self.sess.run(self.train_op, feed_dict=dict)
工作流程为: 提要状态>使用pred采取操作>收集状态和操作>提要计算损失的状态和操作>反向传播
更好的工作流程是: 提要状态>使用pred采取措施>使用pred>反向传播器来计算损失
第二个工作流程的问题是错误ValueError: No gradients provided for any variable
,因为缺少前向通行证