0

我是新来的编程,目前有一些简单的问题,试图训练我的hopfield网络,但我试图计算连接的权重时,不断收到此错误。也许我不懂如何“训练”网络,或者我错过了某个地方或某个步骤。但我所定义的节点类下面的功能:蟒蛇Hopfield网络:培训网络 - 权重错误

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

这应该是正确的,但是当我更新的权重,然后输入,然后激活(位于末尾)。我收到一个错误,说我的更新权重函数“不受支持的操作数类型”,我不明白。有人能帮我看看我的问题似乎是什么吗?

# 
#        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() 

回答

0

也许这些activation属性之一是None

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

这是一件好事(而不是默默不及格),因为它表明一个节点尚未建立正确的地方的错误。

如果您发布实际的回溯,即使它对您没有意义,它也会有所帮助。

编辑

看起来这是一个错误

set_activations=(train1) 

,你应该可以调用set_activations(train1)呢?

+0

哦,我看起来就是这个问题所在。我做了改变,你建议等号不应该在那里,错误是固定的!非常感谢!现在尝试“训练”网络。 – Averruncus