Reputation:
I'm working on a neural network. When I use a function from inside NNetwork
inside NNetwork
, it raises:
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)
My code is:
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]])
What needs to be changed?
Upvotes: 3
Views: 99
Reputation: 28322
One problem is that you forgot to add self
as a first argument in UseNN
.
Another problem here, is the parentheses around (NN, InputList)
, which make the function expect one argument, a tuple.
The right way to get what you want would be:
def UseNN(self, NN,InputList):
This will fix it. Also, you should avoid using CamelCase
for functions and variables. It's usually used for classes, to differentiate them.
Hope it helps!
Upvotes: 3
Reputation: 7654
Unless a class method is decorated with @classmethod
, the first argument is always pre-populated with self
(the instance itself). Therefore, by changing the signature of UseNN
from
def UseNN((NN,InputList)): # accepts self (NN), and 1 more argument
to
def UseNN(self, NN, InputList): # accepts self, and 2 more arguments
The problem will go away.
Upvotes: 1