【问题标题】:Neural Networks Python神经网络 Python
【发布时间】:2015-10-08 10:30:23
【问题描述】:

我正在尝试从具有 500 行数据的 xls 文件中构建一个简单的神经网络,该网络具有 8 个输入和 2 个输出,矩阵中包含 2 个隐藏权重 (8, 2)。目前,神经元还没有开始学习任何东西。它只是一个示例代码,使其运行随机权重。这是我的代码

def sigmoid(x,deriv=False):
    if(deriv==True):
        return sigmoid(x,False)*(1-sigmoid(x,False))
    return 1/(1+np.exp(-x))

def neuron(inputs, weights):                
    weighted_input = np.dot(inputs, weights)
    return sigmoid(weighted_input, False)

weights = 2 * np.random.random((8,2)) - 1
W = np.array([weights])

error1 = []
for i in range(500):
    for k in range (2):
        X = X_T[i] #list of 8 Inputs from xls 
        T = T_T[i] #list of 2 outputs from xls
        Y = neuron(X, W)[k]
        error1.append(np.sqrt((Y[k] - T) ** 2))    

print W
print np.average(error1)
pl.plot(error1)

我希望这段代码针对目前随机的两个隐藏权重运行。这就是为什么我将 k 的范围设置为 2。但是当我尝试运行它时,我收到以下错误。

IndexError                                Traceback (most recent call last)
<ipython-input-36-b300ce507da8> in <module>()
     20         X = X_T[i]
     21         T = T_T[i]
---> 22         Y = neuron(X, W)[k]
     23         error1.append(np.sqrt((Y[k] - T) ** 2))
     24 

IndexError: index 1 is out of bounds for axis 0 with size 1

我知道我搞砸了循环。但我不知道如何解决这个问题。

【问题讨论】:

  • 您的函数返回一个浮点数,并且您正试图通过索引访问该值。这显然会引发错误。
  • 你能帮我纠正一下吗?我对python有点陌生
  • Y = 神经元(X, W)[k] 我认为这应该是 Y = 神经元(X, k)?为什么要将输出作为权重发送?
  • 您可能希望在T_T 列表中使用k 而不是i,并在neuron(X, W) 之后删除[k]

标签: python numpy ipython neural-network


【解决方案1】:

循环执行是相当低效的。这段代码受益于优化的矩阵操作,如果我理解正确的话,应该可以做你想做的事情。

import numpy as np

def sigmoid(x,deriv=False):
    if(deriv==True):
        s = sigmoid(x,False)
        return s*(1-s)
    return 1/(1+np.exp(-x))

n_in = 8
n_out = 2
n_data = 500

X = np.random.randn( n_data, n_in )
T = np.random.randn( n_data, n_out )

W = np.random.randn( n_out, n_in )
b = np.random.randn( n_out, )

err = ( sigmoid( np.dot(X, W.T) + b ) - T ) ** 2

【讨论】:

    【解决方案2】:

    Y = neuron(X, W)[k]:

    neuron(X, W) 是返回一个浮点值。所以你得到错误。

    如果neuron(X, W) 返回list/tuple...so on,则可以通过索引获取值。

    例子:

    >>> L = [1,2][0]
    >>> L
    1
    >>> 
    

    【讨论】: