Объект 'Neural_Network' не имеет атрибута 'w1', но я думаю, что он - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь войти в Neural Networks и хотел протестировать некоторый код из видео, которое я смотрю, но я продолжаю получать сообщение об ошибке «Объект Neural_Network не имеет атрибута w1», и я не могу понять это , Я прошел через многие связанные стековые потоки, но они, похоже, не отвечают на этот вопрос, и, поскольку я раньше не занимался объектно-ориентированным программированием на python, я не понимаю, что происходит.

Когда я просматривал код, я подумал, что self.w1 устанавливается как локальная переменная, поэтому я попытался создать его экземпляр и установить как глобальную переменную над объявлением конструктора, но это не сработало.

import numpy as np
class Neural_Network(object):

def _init_(self):
    self.inputLayerSize = 2
    self.outputLayerSize = 1
    self.hiddenLayerSize = 3

    self.w1 = np.random.randn(self.inputLayerSize, self.hiddenLayerSize)
    self.w2 = np.random.randn(self.hiddenLayerSize, self.outputLayerSize)

def forward(self, x):
    self.z2= np.dot(x, self.w1)
    self.a2 = self.sigmoid(self.layer1)
    self.z3 = np.dot(self.a2,self.w2)
    yhat = self.sigmoid(self.z3)
    return yhat


def sigmoid(self, x):
    return 1 / (1 + np.exp(-x))

x = np.array(([3,5],[5,1],[10,2]),dtype=float)
y = np.array((([75],[82],[93])),dtype=float)
n1 = Neural_Network()
yhat = n1.forward(x)
print(yhat)

Код должен создавать матрицу, в которой указываются возможные оценки при заданном входном значении 'x'.

что-то вроде: x = [[2,3], [5,2]] вывод: [[82], [93], [100]]

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Эта ошибка noob просто убивает меня, я также нашел ее не сразу:

  • init с одним _ не вызывается как init, так что в то время как Neural_Network () ничего не было выполнено
  • Наследование от Object всегда, не пишите это
  • , тогда вы заметите, что скрытый слой self.layer1 не был определен
  • , тогда не давайте именам переменных одна буква + цифракак и w1, он очень запутан с wl и т. д.
  • Аааа, и это важно, у вас может не быть выхода [75], [82], [93], потому что сигмоиды, как вы помните, имеют диапазон отОт 0 до 1, то же самое для ввода.Сделайте сигмоиды для ввода и выберите очистить выходы, означает только 0 или 1

    import numpy as np
    class Neural_Network:
    
    def __init__(self):
        self.inputLayerSize = 2
        self.outputLayerSize = 1
        self.hiddenLayerSize = 3
    
        self.w_h = np.random.randn(self.inputLayerSize, self.hiddenLayerSize)
        self.w_o = np.random.randn(self.hiddenLayerSize, self.outputLayerSize)
    
        self.layer_hidden = np.random.randn(self.hiddenLayerSize)
    
    def forward(self, x):
        self.z2= np.dot(x, self.w_h)
        self.a2 = self.sigmoid(self.layer_hidden)
        self.z3 = np.dot(self.a2,self.w_o)
        yhat = self.sigmoid(self.z3)
        return yhat
    
    
    def sigmoid(self, x):
        return 1 / (1 + np.exp(-x))
    

    x = np.array (([3,5], [5,1], [10,2]), dtype= float) y = np.array ((([75], [82], [93])), dtype = float) n1 = Neural_Network () yhat = n1.forward (x) print (yhat)

0 голосов
/ 03 июня 2019

init должно иметь два подчеркивания, окружающих его, например:

def __init__(self):

Без двух подчеркиваний на каждой стороне, Python не вызывает функцию, когда создается объект.В общем, все такие специальные функции и атрибуты имеют пару двойных подчеркиваний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...