我正在研究AdaDelta优化算法,所以我尝试在Python中实现它,但是我的代码出了点问题,因为出现以下错误:
AttributeError:“ numpy.ndarray”对象没有属性“ sqrt”
我没有找到引起该错误的原因。根据消息,这是因为以下代码行:
rms_grad = np.sqrt(self.e_grad + epsilon)
此行类似于以下等式:
RMS[g]t=√E[g^2]t+ϵ
我在本文中获得了该算法的核心方程:http://ruder.io/optimizing-gradient-descent/index.html#adadelta
再详细一点:我正在像这样初始化E[g^2]t
矩阵:
self.e_grad = (1 - mu)*np.square(nabla)
其中nabla是渐变。类似于以下等式:
E[g2]t = γE[g2]t−1 + (1−γ)g2t
(第一项在第一次迭代中等于零,就像上面的代码行一样)
所以我想知道我是用错误的方式初始化E矩阵还是不适当地进行平方根运算。我尝试使用pow()
函数,但是它不起作用。如果有人可以帮助我,我将非常感激,我已经尝试了好几个星期。
andersource要求的其他详细信息:
以下是github上的完整源代码:https://github.com/pedrovbeltran/neural-networks-and-deep-learning/blob/experimental/modified-networks/network2_with_adadelta.py。
答案 0 :(得分:0)
我认为问题在于self.e_grad_w
是形状为ndarray
的{{1}},它还包含两个附加的具有二维形状的(2,)
,而不是直接包含数据。这似乎是在ndarray
中初始化的,其中e_grad_initializer
具有相同的结构。我没有一直追溯到哪里,但是我相信一旦您解决了这个问题,问题就可以解决。