我在Eager模式下使用Tensorflow手动计算softmax的导数。基于the documentation provided by tensorflow,代码的设计很简单。但是,我无法正确使用渐变功能。出于某种原因,当我尝试运行它时,我得到错误“t不在列表中”,我用Google搜索但没有得到任何帮助。
这是我的代码:
FailsafeWebsocket
我尝试了一个玩具示例,X * X + Y * Y * Y,特别是标量输入,但效果很好,但不是上面的代码。
答案 0 :(得分:0)
您的样本有两件事情:
根据gradients_function的文档,params
应该是一系列参数索引或名称。在上面的代码段中,提供了一个字符串。由于Python字符串是一系列字符,因此它认为要区分的参数名称是'' h' h'' e',&# 39; t'和' a',它们不存在,因此也就是错误。相反,设置params=['theta']
将克服那个驼峰。
此外,您似乎要求gradients_function
通过numpy操作计算渐变,但它无法做到。它只能通过TensorFlow操作计算梯度。在您的函数中使用tf
操作而不是np
操作进行轻微调整即可解决此问题。
以下适用于我:
import tensorflow as tf
import numpy as np
tfe = tf.contrib.eager
tf.enable_eager_execution()
available_states = (64, 1)
some_index = 0
theta = np.random.standard_normal((64, 4))
xs = np.zeros(available_states)
xs[some_index] = 1
def pi(xs, theta):
H_s_a_Theta = tf.matmul(tf.transpose(theta), xs)
softmax = tf.exp(H_s_a_Theta)
sum = tf.reduce_sum(softmax)
return softmax / sum
first_derv_fn = tfe.gradients_function(pi, params=['theta']) #xs:0, theta:1
print(first_derv_fn(xs, theta))
(梯度计算的工作方式是它在前向传递中记录Tensor
个对象上的所有操作,然后通过运行与前向传递中每个操作相对应的后向函数向后播放它们。它不记录numpy操作)。
希望有所帮助。