Question

I'm new to programming and am currently having some simple issues trying to train my hopfield network but I keep getting this error when trying to calculate the weight of the connections. Perhaps I am not understanding how to "train" the network or maybe I've missed a step somewhere or something. But I've defined the function under the node class:

    def update_weight(self):
    for i in self.incoming_connections:
        i.weight += (2*self.activation - 1)*(2*i.sender.activation-1)

Which should be correct, but when i update the weight, then input, then activation (located at the end). I get an error saying "unsupported operand type" for my update weight function which I don't understand. Can someone please help me take a look at what my problem seems to be?

# 
#                               Preparations 
# 

import random
import math
import pygame
nodes=[]
training=[]
NUMNODES=16

# 
#                                   Node Class
# 

class Node(object): 

    def __init__(self,name=None): 
        self.name=name 
        self.activation_threshold=1.0
        self.net_input=0.0
        self.outgoing_connections=[] 
        self.incoming_connections=[]
        self.activation=None

    def __str__(self):
        return self.name

    def addconnection(self,sender,weight=0.0):
        self.incoming_connections.append(Connection(sender,self,weight)) 

    def update_input(self): 
        self.net_input=0.0
        for conn in self.incoming_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
            print 'Node', str(self), 'is activated : ', self.activation
        elif self.net_input <= self.activation_threshold:
            self.activation = 0.0
            print 'Node', str(self), 'is not activated : ', self.activation

    def update_training(self):
        Node = random.choice(nodes)

    def update_weight(self):
        for i in self.incoming_connections:
            i.weight += (2*self.activation - 1)*(2*i.sender.activation-1)
            print 'Weight is now set'

# 
#                                   Connection Class
# 

class Connection(object): 
    def __init__(self, sender, reciever, weight): 
        self.weight=weight 
        self.sender=sender 
        self.reciever=reciever

    def __str__(self):
        string = "Connection from " + str(self.sender) + " to " + str(self.reciever) + ", weight = " + str(self.weight)
        return string

# 
#                                 Other Programs 
# 

def set_activations(act_vector): 
    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 Patterns
#

train1=(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)
training.append(train1)
train2=(1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0)
training.append(train2)
train3=(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)
training.append(train3)
train4=(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)
training.append(train4)

set_activations=(train1)

#
#                                        Running 10 Iterations
#

for i in xrange(10):
    print '                     *********** Iteration', str(i+1), '***********'
    for thing in nodes:
        thing.update_weight()
    for thing in nodes:
        thing.update_input()
    for thing in nodes:
        thing.update_activation()

out_file=open('output.txt','w')
out_file.close()
Was it helpful?

Solution

Possibly one of these activation attributes is None

    i.weight += (2*self.activation - 1)*(2*i.sender.activation-1)

This is a good thing (as opposed to failing silently) because it's indicating a bug that a Node hasn't been set up properly somewhere.

It would be helpful if you post the actual traceback even if it's not meaningful to you yet.

EDIT

It looks like this is a mistake

set_activations=(train1)

should you be calling set_activations(train1) instead?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top