tensorflow eager gradients_function()返回错误“t不在列表中”

时间:2018-03-29 15:59:38

标签: python tensorflow

我在Eager模式下使用Tensorflow手动计算softmax的导数。基于the documentation provided by tensorflow,代码的设计很简单。但是,我无法正确使用渐变功能。出于某种原因,当我尝试运行它时,我得到错误“t不在列表中”,我用Google搜索但没有得到任何帮助。

这是我的代码:

FailsafeWebsocket

我尝试了一个玩具示例,X * X + Y * Y * Y,特别是标量输入,但效果很好,但不是上面的代码。

1 个答案:

答案 0 :(得分:0)

您的样本有两件事情:

  1. 根据gradients_function的文档,params应该是一系列参数索引或名称。在上面的代码段中,提供了一个字符串。由于Python字符串是一系列字符,因此它认为要区分的参数名称是'' h' h'' e',&# 39; t'和' a',它们不存在,因此也就是错误。相反,设置params=['theta']将克服那个驼峰。

  2. 此外,您似乎要求gradients_function通过numpy操作计算渐变,但它无法做到。它只能通过TensorFlow操作计算梯度。在您的函数中使用tf操作而不是np操作进行轻微调整即可解决此问题。

  3. 以下适用于我:

    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操作)。

    希望有所帮助。