Получение ошибки в python при попытке вывести переменную из функции класса - PullRequest
0 голосов
/ 21 марта 2020
 class Network(object):

        def __init__(self, sizes):

        def feedforward(self, a):
            for b, w in zip(self.biases, self.weights):
                a = sigmoid(np.dot(w, a)+b)
            return a

        def SGD(self, training_data, epochs, mini_batch_size, eta,
                test_data=None):

        def evaluate(self, test_data):
            test_results = [(np.argmax(self.feedforward(x)), y)
                            for (x, y) in test_data]
            return sum(int(x == y) for (x, y) in test_results)

    def sigmoid(z):
        return 1.0/(1.0+np.exp(-z))

Я делаю нейронную сеть (конечно, я упустил много кода, потому что его много), и в функции «feedforward» у меня есть переменная «a», которая возвращает функции активации. Когда обучение закончится, я хотел бы распечатать эту переменную. Обучение начинается следующим образом:

net=Network([784,30,10])
net.SGD(training_data, 5, 30, 3.0, test_data=test_data)

и код, который я пытался распечатать:

print(net.feedforward(a))

Но я получаю следующую ошибку:

`Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/MyName/DeepLearningPython35/network.py", line 158, in <module>
    print(net.feedforward(a))
NameError: name 'a' is not defined`

1 Ответ

0 голосов
/ 21 марта 2020

Переменная a доступна только в локальной области действия функции feedforward. Строка print(net.feedforward(a)) пытается снова вызвать функцию с переменной, которая должна быть определена в глобальной области видимости. Одна из возможностей - сделать его переменной экземпляра:

def feedforward(self, a):
    for b, w in zip(self.biases, self.weights):
        self.a = sigmoid(np.dot(w, a)+b)
    return self.a

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

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