如何使用类方法作为可调用函数

时间:2014-08-08 17:20:40

标签: python

我在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)

如何解决此错误?

2 个答案:

答案 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位置,离开Xlabel填充*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))

这就是为什么它一直缺少论据。