在python中使用的def __call __(self,in_data)函数是什么,in_data在哪里获得其值

时间:2019-07-17 16:00:36

标签: python-2.7 neural-network perceptron

我实际上是一名学生,我的老师给了我这段代码以理解和使用该代码,以便我可以继续学习机器学习等。我得到这是一个AND函数,并且得到了它正在打印的东西,我def 调用(self,in_data):函数不能理解,“ in_data”从何处获取其值?因为从我的观点来看,我看到的是一个空白变量,以某种方式可以帮助我完成代码。另外,更改init部分中权重的值实际上并没有更改此代码中的任何内容,我想知道为什么。这是我要学习的全部代码。感谢您的帮助!

import numpy as np

class Perceptron:

    def __init__(self,input_length,weights=None):
        if weights is None:
            self.weights= np.ones(input_length)*0.5
        else:
            self.weights=weights
    @staticmethod
    def unit_step_function(x):
        if x>0.5:
            return 1
        return 0
    def __call__(self,in_data):
            weighted_input=self.weights*in_data
            weighted_sum=weighted_input.sum()
            return Perceptron.unit_step_function(weighted_sum)
p = Perceptron(2,np.array([0.5,0.5]))

for x in [np.array([0,0]),np.array([0,1]),np.array([1,0]),np.array([1,1])]:

    y=p(np.array(x))
    print(x,y)

1 个答案:

答案 0 :(得分:0)

尝试将对象当作函数时调用

__call__。您可以在底部看到完成的操作。 p是一个Perceptron对象,但在您编写时被视为函数

y = p(np.array(x))

那么数据从哪里来?就是传入的np.array(x)

您可以详细了解“ dunder” /“ magic”方法here


我实际上认为这是对__call__的滥用。我不会认为Perceptron具有内在的功能性。我认为使用常规方法会更清晰:

class Perceptron:
    . . .

    def give_input(self, in_data):  # Instead of __call__
            weighted_input = self.weights*in_data
            weighted_sum = weighted_input.sum()
            return Perceptron.unit_step_function(weighted_sum)

for x in [np.array([0,0]),np.array([0,1]),np.array([1,0]),np.array([1,1])]:
    y = p.give_input(np.array(x))  # Just a typical method call now