Python Hopfield Network: Training the network but spitting same values
-
21-12-2019 - |
Question
this is my first time coding so I'm having some simple queries. So I'm having this issue with the hopfield network where I'm trying to "train" my network on the 4 patterns that I have at the at the end of the code. Then I need to run 10 iterations of it to see what would happen.
But when I tried running this, the output values I got were all the same as the initial. So I'm not sure what I did wrong. Or does this mean the network is settled into a stable state?
#
# Preparations
#
nodes=[]
NUMNODES=16
training=[]
#
# Defining Node Class
#
class Node(object):
def __init__(self,name=None):
self.name=name
self.activation_threshold=0.0
self.net_input=0.0
self.outgoing_connections=[]
self.incoming_connections=[]
self.connections=[]
self.activation=None
def __str__(self):
return self.name
def addconnection(self,sender,weight=1.0):
self.connections.append(Connection(self,sender,weight))
def update_input(self):
self.net_input=0.0
for conn in self.connections:
self.net_input = (conn.weight * conn.sender.activation)
print 'Updated Input for node', str(self), 'is', self.net_input
def update_activation(self):
if self.net_input > self.activation_threshold:
self.activation = 1.0
elif self.net_input <= self.activation_threshold:
self.activation = 0.0
print 'Updated Activation for node', str(self), 'is', self.activation
def update_training(self):
Node = random.choice(nodes)
#
# Defining Connection Class
#
class Connection(object):
def __init__(self, sender, reciever, weight):
self.weight=weight
self.sender=sender
self.reciever=reciever
sender.outgoing_connections.append(self)
reciever.incoming_connections.append(self)
#
# Other Programs
#
def set_activations(act_vector):
"""Activation vector must be same length as nodes list"""
for i in xrange(len(act_vector)):
nodes[i].activation = act_vector[i]
for i in xrange(NUMNODES):
nodes.append(Node(str(i)))
for i in xrange(NUMNODES):#go thru all the nodes calling them i
for j in xrange(NUMNODES):#go thru all the nodes calling them j
if i!=j:#as long as i and j are not the same
nodes[i].addconnection(nodes[j])#connects the nodes together
#
# Training Pattern
#
set_activations([1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0])
set_activations([1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0])
set_activations([1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0])
set_activations([1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0])
#
# Running 10 Iterations
#
for i in xrange(10):
print ' *********** Iteration', str(i+1), '***********'
for thing in nodes:
thing.update_training()
thing.update_input()
thing.update_activation()
Solution
Ah, nevermind. I realized my error and made a fix to my code.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow