我尝试通过扫描操作手动计算朝向重量矢量的标量成本的梯度。然而,这不起作用,并且总是返回一个SubTensor不可区分的错误
确保可以计算渐变:
T.grad(cost, p2)
完美无缺。这意味着p2没有与成本断开连接。但是,当我尝试以下内容时:
def differentiate_element(i,p2,c):
p2element=p2[i]
return T.grad(c,p2element)
h2, h2_updates = theano.scan(differentiate_element,
sequences=T.arange(p2.shape[0]), non_sequences=[p2, cost])
我收到错误'theano.gradient.DisconnectedInputError:要求grad方法计算相对于不是成本计算图的一部分的变量的梯度,或者仅由不可微运算符使用:子张量{int64类型} 0.0'
之前已经问过这个问题:Defining a gradient with respect to a subtensor in Theano但是没有得到满意的回答。也就是说,如图所示将p2 [i]分配给它自己的变量并不起作用。
将选项disconnected_inputs ='ignore'添加到内部循环实际上将删除错误但不再生成正确的输出,如以下简短示例所示:
import numpy
import theano
import theano.tensor as T
p2=theano.shared(name="P2",value=numpy.zeros(100,dtype=theano.config.floatX),borrow=True)
x=T.scalar('x')
cost=T.sum(x*p2)
gradient=T.grad(cost,p2)
def differentiate_element(i, p2, c):
p2element = p2[i]
return T.grad(c, p2element, disconnected_inputs='ignore')
gradient2, grad2_updates = theano.scan(differentiate_element,
sequences=T.arange(p2.shape[0]),
non_sequences=[p2, cost])
f=theano.function([x],gradient)
g=theano.function([x],gradient2,updates=grad2_updates)
print(f(20))
print(g(20))
第一个,打印一个包含20个的数组。第二个打印出一个包含0的数组。
答案 0 :(得分:1)
不是试图为每个子传感器计算扫描函数内的渐变,而是应该事先计算渐变,然后遍历所需的渐变
p2_grad = T.grad(cost,p2)
def differentiate_element(i,p2):
p2element=p2[i]
return p2element
p2elements_grads, h2_updates = theano.scan(differentiate_element,
sequences=T.arange(p2_grad.shape[0]), non_sequences=[p2_grad])
<强> 修改 强>
由于计算Hessian对角线的主要问题是你不想在任何情况下计算整个Hessian和浪费计算资源,你可以做些什么来避免Disconnected input错误添加{{1} }关键字争论到T.grad
disconnected_inputs='ignore'