我在Python中运行渐变检查如下:
class NeuralNetwork:
def gradient_checking(self):
m = 5
theta1 = debuginitializeweights(self.size[1], self.size[0])
theta2 = debuginitializeweights(self.size[2], self.size[1])
thetas = vectorize([theta1, theta2], self.size)
X = debuginitializeweights(m, self.size[0] - 1)
y = 1 + np.mod(np.array(range(m)), 3)
return scipy.optimize.check_grad(self.cost, self.grad, thetas, [X, y])
其中类方法的签名是:
def cost(self, thetas, X, label):
def grad(self, thetas, X, label):
然而,当运行渐变检查时,它说
File "/home/andrey/Data/Hacking/ML/Coursera_Andrew/neuralnetwork.py", line 142, in gradient_checking
return check_grad(self.cost, self.grad, thetas, [X, y])
File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 656, in check_grad
return sqrt(sum((grad(x0, *args) -
TypeError: grad() takes exactly 4 arguments (3 given)
如何解决此错误?
答案 0 :(得分:1)
堆栈跟踪告诉您确切需要知道的内容:
TypeError:grad()只需要4个参数(给定3个)
您的grad
签名反映了4参数要求:
def grad(self, thetas, X, label):
我看到你在grad()
的电话中尝试使用元组解包:
return sqrt(sum((grad(x0, *args))))
调用self
时传递的隐式grad()
将在参数列表中占据self
位置,x0
将占据thetas
位置,离开X
和label
填充*args
。尝试打印args
或使用PDB进行检查,确认其中包含两项内容。由于您未尝试解包非可迭代的ValueError
,因此它可能是正确的类型。听起来它可能没有你想要的两个项目。
答案 1 :(得分:0)
原来这只是可选参数问题。这是一个简单的例子:
from scipy.optimize import check_grad
class NeuralNetwork:
def cost(self, x, A, b):
return x[0] ** 2 - 0.5 * x[1] ** 3 + A * b
def grad(self, x, A, b):
return [2 * x[0] + A, -1.5 * x[1]**2 +b]
a = NeuralNetwork()
print a.cost([1.5, -1.5], 10, 1)
print check_grad(a.cost, a.grad, [1.5, -1.5], 10, 1)
以前我做过:
check_grad(a.cost, a.grad, [1.5, -1.5], (10, 1))
这就是为什么它一直缺少论据。