【问题标题】:typeError : __array_prepare__类型错误:__array_prepare__
【发布时间】:2016-03-02 22:27:54
【问题描述】:

我正在尝试通过使用带有逻辑激活函数的 delta 学习规则来实现单个神经元。我的代码如下。

import numpy as np
X = np.matrix('2; 4; 6; 8; 10; 15; 20; 25; 30; 40; 50; 60')
g = np.matrix('4.32323; 4.96276; 5.45565; 6.27151; 6.8552; 8.64987; 10.32581; 12.21393; 14.45659; 15.87602; 15.82488; 16.19419') 
norm_fac=16.19419
y =  [x / norm_fac for x in g]

class SingleNeuron (object):

    def __init__(self, eta=0.01, n_iter=10):
        self.eta=eta
        self.n_iter=n_iter

    def fit (self, X, y):
        self.w_ = np.zeros (X.shape[1]+1)
        self.cost_ = []

        for i in range (self.n_iter):
            output = self.net_input(X)
            errors = (y - output)
            self.w_[1:] += self.eta * X[0:].T.dot(errors)
            self.w_[0] += self.eta * errors.sum ()
            cost = (errors**2).sum() / 2.0
            self.cost_.append(cost)
        return self

      def net_input(self, X):
          return 1/(1+ np.exp (-(np.dot(X, self.w_[1]) + self.w_[0])))

      def predict(self, X):
          return self.net_input(X)

SN = SingleNeuron (eta = 0.1, n_iter = 10)
SN.fit (X, y)

但是,当我运行代码时,我遇到了错误: array_prepare 必须返回与其输入相同的 ndarray 或其子类。

我知道之前回答了一个问题 (Numpy __array_prepare__ error),但它对我没有多大帮助。我非常感谢任何帮助。谢谢

【问题讨论】:

  • 尝试在第 4 行之后打印y。这是您的预期吗?
  • 感谢您的评论。我期望的是使用 y 值来计算误差,然后修改 ws 直到 y 和输出之间的误差最小化。
  • 我的意思是y的格式。它不返回列表,而是返回矩阵列表,例如:[matrix([[ 0.26696179]]), matrix([[ 0.30645312]]), ...。这是你想让它做的吗?
  • ooohh..对不起,误会了。不,这不是我想做的,我通过更改第 4 行 y=g/norm_fac 来纠正这部分。但是,现在我在第 29 行遇到了一个新错误(ValueError:具有形状 (1,) 的不可广播输出操作数与广播形状 (1,1) 不匹配)。我不确定是否需要将此作为另一个问题发布。再次感谢您的帮助。
  • 我暂时尝试自己排查,打印中间输出,包括查看类型print y, type(y)等。显然需要@左右的类型987654327@ 应该是可战斗的。您可以编辑您的问题。本节中的 cmets 旨在细化一个问题,直到它被很好地定义并且问题和答案对其他人有用。

标签: python numpy neural-network


【解决方案1】:

我已经调试了你的代码,有几个错误:

1) 而不是使用:

y =  [x / norm_fac for x in g]  

可以直接计算y:

y_in = g_in / norm_fac    

这解决了你计算y - output时的错误

2) 现在,这行导致了一个问题:

self.w_[1:] += self.eta * X[0:].T.dot(errors)   

由于您要访问w_ 的第一个元素,您必须使用w_[1]。您使用的内容从第一个元素开始获取w_ 的所有元素。

同样X[0:] 是不必要的,因为它返回X 的所有元素。只需使用 X 代替:

self.w_[1] += self.eta * X.T.dot(errors)

3) 你不应该使用

(errors\*\*2).sum()  

计算误差平方和。 errors**2 尝试将错误与自身相乘并给出错误,因为错误是一个向量。相反,您必须使用 numpy.power 来获得元素明智的权力:

np.power(errors, 2)  

也为了更好的实践:
1)将主代码放在最后并重命名变量。您将 y 作为全局变量(在顶部定义)和输入变量,这会导致阴影。

2) 在初始化中定义所有类相关的变量。

3) 使用小写的变量名。

4) 你可以使用 x * y 代替 x.dot(y),因为你使用的是 numpy,所以它的操作是一样的。

5) 最后打印一些结果。

考虑到这些并遵循 Python PEP8 格式指南,我将您的代码更改如下:

import numpy as np

class SingleNeuron (object):

    def __init__(self, eta=0.01, n_iter=10):
        self.eta = eta
        self.n_iter = n_iter
        self.w_ = []
        self.cost_ = []

    def fit(self, x, y):
        self.w_ = np.zeros(x.shape[1]+1)
        self.cost_ = []

        for i in range(self.n_iter):
            output = self.net_input(x)
            errors = (y - output)
            self.w_[1] += self.eta * x.T * errors
            self.w_[0] += self.eta * errors.sum()
            cost = np.power(errors, 2).sum() / 2
            self.cost_.append(cost)
        return self

    def net_input(self, x):
        return 1 / (1 + np.exp(-((x * self.w_[1]) + self.w_[0])))

    def predict(self, x):
        return self.net_input(x)


norm_fac = 16.19419
x_in = np.matrix('2; 4; 6; 8; 10; 15; 20; 25; 30; 40; 50; 60')
g_in = np.matrix('4.32323; 4.96276; 5.45565; 6.27151; 6.8552; 8.64987;     10.32581; 12.21393; 14.45659; 15.87602; '
             '15.82488; 16.19419')
y_in = g_in / norm_fac

SN = SingleNeuron(eta=0.1, n_iter=10)
SN = SN.fit(x_in, y_in)
print SN.w_
print SN.cost_

我不确定这段代码是否符合您的要求。您必须逐步控制逻辑。

P.S.:我推荐使用 PyCharm 进行 Python 开发。

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2016-07-02
    • 2020-08-07
    • 2014-03-26
    • 2021-05-12
    • 2018-07-16
    相关资源
    最近更新 更多