我正在尝试实现一个简单的神经网络。我想打印初始图案,重量,激活。然后我想要它打印学习过程(即它学习时经历的每个模式)。我还是无法做到这一点 - 它返回了初始和最终模式(我将print p放在适当的位置),但没有别的。提示和提示表示赞赏 - 我是Python的新手!
#!/usr/bin/python
import random
p = [ [1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1] ] # pattern I want the net to learn
n = 5
alpha = 0.01
activation = [] # unit activations
weights = [] # weights
output = [] # output
def initWeights(n): # set weights to zero, n is the number of units
global weights
weights = [[[0]*n]*n] # initialised to zero
def initNetwork(p): # initialises units to activation
global activation
activation = p
def updateNetwork(k): # pick unit at random and update k times
for l in range(k):
unit = random.randint(0,n-1)
activation[unit] = 0
for i in range(n):
activation[unit] += output[i] * weights[unit][i]
output[unit] = 1 if activation[unit] > 0 else -1
def learn(p):
for i in range(n):
for j in range(n):
weights += alpha * p[i] * p[j]
答案 0 :(得分:7)
您遇到问题:
weights = [[[0]*n]*n]
使用*
时,可以将对象引用相乘。您每次都使用相同的n-len数组。这将导致:
>>> weights[0][1][0] = 8
>>> weights
[[[8, 0, 0], [8, 0, 0], [8, 0, 0]]]
所有子列表中的第一项是8,因为它们是同一个列表。您多次存储相同的引用,因此修改其中任何一个的第n个项都会改变它们。
答案 1 :(得分:0)
这条线就是你得到的地方: “IndexError:列表索引超出范围”
output[unit] = 1 if activation[unit] > 0 else -1
因为output = [],你应该做output.append()或...