使用def函数时无法在Python中打印变量

时间:2010-10-18 18:25:56

标签: python

我正在尝试实现一个简单的神经网络。我想打印初始图案,重量,激活。然后我想要它打印学习过程(即它学习时经历的每个模式)。我还是无法做到这一点 - 它返回了初始和最终模式(我将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]

2 个答案:

答案 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()或...