我创建一个Class对象时出现类型错误

时间:2013-11-08 04:44:52

标签: python class typeerror

我正在研究神经网络。当我使用NNetworkNNetwork内的函数时,它会引发:

Traceback (most recent call last):
  File "C:\Python27\MyPython\MyNeuralNetwork.py", line 72, in <module>
    NeuralNet.train([[3,5,2],[10,8,1],[35,3,6],[345,3,32]])
  File "C:\Python27\MyPython\MyNeuralNetwork.py", line 67, in train
    self.train331()
  File "C:\Python27\MyPython\MyNeuralNetwork.py", line 44, in train331
    x1 = self.UseNN(N1,x)
TypeError: UseNN() takes exactly 1 argument (3 given)

我的代码是:

import math, time

class Neuron():
    def __init__(self,weight,thresh, alpha=.1):
        self.thresh = thresh
        self.weight = weight
        self.alpha = alpha
    def use(self,Input):
        x = Input[0]*self.weight
        y = Input[1]*self.weight;
        z = Input[2]*self.weight;
        return[(x+y+z)]

    def adjustWeight(subtract = False):
        if subtract == False: self.weight += alpha
        else: self.weight -= alpha

class NNetwork():
     def __init__(self,alpha = .1):
         self.alpha = alpha
     def UseNN((NN,InputList)):
         x = NN.use(InputList)
         if x[0] > x[1]: return x[0]
         else: return 0
     def train331(self):
         #Creates the Neurons, assigning the weights, threshholds, and alpha
         N1 = Neuron(3,7,.1)
         N2 = Neuron(7,3,.1)
         N3 = Neuron(3,9,.1)
         #NextLevel
         N4 = Neuron(-6,0,.1)
         N5 = Neuron(10,4,.1)
         N6 = Neuron(1,6,.1)
         #OutputLevel
         O1 = Neuron(0,0,.1)
        am = 1
        for amount in self.trainset:

            #It runs each neuron through an algorithm, 
            #then collects each result into a list
            x = self.trainset[am]
            print  "First layer: ",x
            x1 = self.UseNN(N1,x)
            x2 = self.UseNN(N2,x)
            x3 = self.UseNN(N3,x)

            y = [x1, x2, x3]
            print "Second layer: ",y
            y1 = self.UseNN(N4,y)
            y2 = self.UseNN(N5,y)
            y3 = self.UseNN(N6,y)

            z = [y1,y2,y3]

            z1 = self.UseNN(O1,z)
            am += 1
        print "Output layer: ",z1

    def train(self,trainingSet,epochs=100):

        self.epochs = epochs
        self.trainset = trainingSet
        self.train331()



NeuralNet = NNetwork()
NeuralNet.train([[3,5,2],[10,8,1],[35,3,6],[345,3,32]])

需要改变什么?

2 个答案:

答案 0 :(得分:3)

一个问题是您忘记在self中添加UseNN作为第一个参数。

这里的另一个问题是围绕(NN, InputList)的括号,它使函数期望一个参数,一个元组。

获得你想要的东西的正确方法是:

def UseNN(self, NN,InputList):

这将解决它。此外,您应该避免使用CamelCase来表示函数和变量。它通常用于类,以区分它们。

希望它有所帮助!

答案 1 :(得分:1)

除非使用@classmethod修饰类方法,否则第一个参数始终预先填充self(实例本身)。因此,通过更改UseNN的签名来自

def UseNN((NN,InputList)):  # accepts self (NN), and 1 more argument

def UseNN(self, NN, InputList):  # accepts self, and 2 more arguments

问题将会消失。