【问题标题】:TypeError: 'numpy.ndarray' object is not callable what do i do?TypeError:“numpy.ndarray”对象不可调用我该怎么办?
【发布时间】:2019-05-09 11:40:42
【问题描述】:

我正在制作前馈神经网络,但我不确定它为什么不起作用: 代码如下:

import numpy as np
import random 


#Hyperparameters
num_iterations = 100000
errors_shown = 1
num_iterations_per_error = num_iterations // errors_shown
learning_rate = 0.01

def nonlin(x, deriv=False):
    if deriv == True:
        return x * (1 - x)
    else:
        return 1 / (1 + np.exp(-x))
   #Input Data
x = np.array([[9, 2],
        [7, 0],
        [3, 1],
        [5, 0.5],
        [5, 0],
        [5.6, 0.7],
        [10, 0.5],
        [9, 0.5],
        [8, 3.7],
        [3, 0.5],
        [4, 2],
        [4, 2.5],
        [9, 2.5],
        [10, 0],
        [5, 1],
        [8, 3],
        [7, 1.7],
        [9, 0],
        [3, 3]])

#Output Data
y = np.array([[0.87],
            [0.12],
            [0.09],
            [0.12],
            [0.13],
            [0.47],
            [0.39],
            [0.36],
            [0.97],
            [0.19],
            [0.23],
            [0.67],
            [0.94],
            [0.33],
            [0.57],
            [0.91],
            [0.73],
            [0.63],
            [0.32]])

np.random.seed(1)

#Random synapses 
syn0 = np.random.random((2, 3))
syn1 = np.random.random((3, 4))
syn2 = np.random.random((4, 3))
syn3 = np.random.random((3, 2))
syn4 = np.random.random((2, 1))
syns = [syn0, syn1, syn2, syn3, syn4]

#Random bias'
b0 = np.random.random((1, 3))
b1 = np.random.random((1, 4))
b2 = np.random.random((1, 3))
b3 = np.random.random((1, 2))
b4 = np.random.random((1, 1))
bias = [b0, b1, b2, b3, b4]

#Neural Network

class NN:
    def __init__(self, input_data, expected_output_data, num_iterations, num_iterations_per_error, learning_rate, syns, bias):
        self.input_data = input_data
        self.expected_output_data = expected_output_data
        self.num_iterations = num_iterations
        self.num_iterations_per_error = num_iterations_per_error
        self.learning_rate = learning_rate
        self.syn0 = syns[0]
        self.syn1 = syns[1]
        self.syn2 = syns[2]
        self.syn3 = syns[3]
        self.syn4 = syns[4]
        self.b0 = bias[0]
        self.b1 = bias[1]
        self.b2 = bias[2]
        self.b3 = bias[3]
        self.b4 = bias[4]

#predict
def pred(self):
    self.l0 = self.input_data
    self.l1 = nonlin(np.dot(self.l0, self.syn0) + self.b0)
    self.l2 = nonlin(np.dot(self.l1, self.syn1) + self.b1)
    self.l3 = nonlin(np.dot(self.l2, self.syn2) + self.b2)
    self.l4 = nonlin(np.dot(self.l3, self.syn3) + self.b3)
    self.z = (np.dot(self.l4, self.syn4) + self.b4)

    self.pred = nonlin(self.z)

    return self.pred 

#Cost func
def cost_func(self):
    self.l4_error = np.square(self.l4 - self.expected_output_data)

    self.l4_delta = self.l4_error * nonlin(self.l4, deriv=True)

    self.l3_error = self.l4_delta.dot(self.syn3.T)

    self.l3_delta = self.l3_error * nonlin(self.l3, deriv=True)

    self.l2_error = self.l3_delta.dot(self.syn2.T)

    self.l2_delta = self.l2_error * nonlin(self.l2, deriv=True)

    self.l1_error = self.l2_delta.dot(self.syn1.T)

    self.l1_delta = self.l1_error * nonlin(self.l1, deriv=True)

    self.total_error += self.l4_error

    return self.l4_error

#Backprop 
def backprop(self):
    self.syn3 += self.l3.T.dot(self.l4_delta * self.learning_rate)
    self.syn2 += self.l2.T.dot(self.l3_delta * self.learning_rate)
    self.syn1 += self.l1.T.dot(self.l2_delta * self.learning_rate)
    self.syn0 += self.l0.T.dot(self.l1_delta * self.learning_rate)

def runner(self):
    self.total_error = 0

    for iteration in range(self.num_iterations): 
        pred = self.pred()
        cost = self.cost_func()
        self.backprop()

neuralNet = NN(x, y, num_iterations, num_iterations_per_error, learning_rate, syns, bias)

neuralNet.runner()

所以我不知道它有什么问题,所以你能帮帮我吗? 这是错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-55-e63563ac83ed> in <module>
     72 neuralNet = NN(x, y, num_iterations, num_iterations_per_error, learning_rate, syns, bias)
     73 
---> 74 neuralNet.runner()

<ipython-input-55-e63563ac83ed> in runner(self)
     66 
     67         for iteration in range(self.num_iterations):
---> 68             pred = self.pred()
     69             cost = self.cost_func()
     70             self.backprop()

TypeError: 'numpy.ndarray' object is not callable

请将您的答案发布在底部的内容中 它在 def pred 中说是的,请帮助,它只是一个深度前馈神经网络

【问题讨论】:

  • 哎呀抱歉我没有缩进 defs 虽然它们实际上是缩进的
  • 是什么阻止您编辑帖子以修复缩进?
  • 不要将您的成员命名为self.pred,因为self.pred 已经是一个函数。所以对于 Python 来说,你似乎是在返回一个函数或调用一个成员。

标签: python neural-network deep-learning backpropagation gradient-descent


【解决方案1】:

问题就在这里,在函数self.pred

self.pred = nonlin(self.z)
return self.pred

函数self.pred 将自己替换为数字或ndarray,因为这是nonlin() 返回的内容。这意味着您只能调用一次self.pred,因为它会在第一次运行时自行擦除。相反,不要使用函数的名称来存储函数的结果,因为那样你实际上是在用静态结果替换函数,它不能像函数一样被调用。

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2018-06-30
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多