在循环内调用函数时发生NameError

2024-05-13 01:57:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前是python的一个新开发人员,我正在尝试从一个我在互联网上找到的代码中制作一个简单的反向传播ANN来处理太空入侵者游戏。你知道吗

我使用VisualStudioCode2015只是为了调试,所以我可以理解代码是如何流动的。你知道吗

我有一个文件名为太空入侵者.py,在这个文件中,所有的代码都是用很多类编写的,这些类可以创建精灵、声音和所有其他的游戏内容。你知道吗

为了实现ANN,我只是粘贴了代码并尝试运行它,但是每当我尝试从2个特定函数调用时,就会得到“NameError was unhandled by the user code-global name”activate\u neuron“is not defined”,但是函数已经定义了!你知道吗

我找了很多类似的问题,但都不知道如何解决(主要是因为我是Python的新开发人员)。你知道吗

下面是完整的代码,以及在调用函数“forward\u propagate”中的函数“activate\u neuron”时出现的错误。你知道吗

[Other Space Invaders Classes]
    class BackPropagation (object):

        def inicializar_rede_neural(n_inputs, n_hidden, n_outputs):
            network = list()
            #inicializa os pesos da input para a hidden layer
            hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
            network.append(hidden_layer)
            #inicializa os pesos da hidden para a output layer
            output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
            network.append(output_layer)
            return network

        #Faz a ativação do neurônio
        def activate_neuron(weights, inputs):
            activation = weights[-1]
            for i in range(len(weights)-1):
                activation += weights[i] * inputs[i]
            return activation

        # Transfer neuron activation (função sigmoide)
        def transferir(activation):
            return 1.0 / (1.0 + exp(-activation))

        # Realiza o foward propagate
        def forward_propagate(network, row):
            inputs = row
            for layer in network:
                new_inputs = []
                for neuron in layer:
                    activation = activate_neuron(neuron['weights'], inputs) >Here's the error<
                    neuron['output'] = transferir(activation)
                    new_inputs.append(neuron['output'])
                inputs = new_inputs
            return inputs

        np.random.seed(1)
        network = inicializar_rede_neural(3, 2, 1)
        for layer in network:
            print(layer)
        row = [1, 1, 0, None]
        output = forward_propagate(network, row)
        print(output)

我还认为,我将得到相同的错误类型,尝试调用下一个名为“transferir”的函数。你知道吗

你们有办法解决吗? 谢谢!你知道吗


Tags: 代码inlayerforoutputdefrangenetwork
1条回答
网友
1楼 · 发布于 2024-05-13 01:57:05

如果你是python新手,那么我可以理解你为什么会错过这个。代码需要

activation = self.activate_neuron(neuron['weights'], inputs)

不是

activation = activate_neuron(neuron['weights'], inputs)

无论何时调用在同一类中创建的函数,都需要使用自我功能()而不仅仅是函数()。这个怪癖主要是针对python的,但是你会看到很多

编辑:整个类重做

[Other Space Invaders Classes]
    class BackPropagation(object):

        def inicializar_rede_neural(self, n_inputs, n_hidden, n_outputs):
            network = []
            #inicializa os pesos da input para a hidden layer
            hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
            network.append(hidden_layer)
            #inicializa os pesos da hidden para a output layer
            output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
            network.append(output_layer)
            return network

        #Faz a ativação do neurônio
        def activate_neuron(self, weights, inputs):
            activation = weights[-1]
            for i in range(len(weights)-1):
                activation += weights[i] * inputs[i]
            return activation

        # Transfer neuron activation (self, função sigmoide)
        def transferir(self, activation):
            return 1.0 / (1.0 + exp(-activation))

        # Realiza o foward propagate
        def forward_propagate(self, network, row):
            inputs = row
            for layer in network:
                new_inputs = []
                for neuron in layer:
                    activation = self.activate_neuron(neuron['weights'], inputs) #>Here's the error<
                    neuron['output'] = self.transferir(activation)
                    new_inputs.append(neuron['output'])
                inputs = new_inputs
            return inputs

    np.random.seed(1)
    backprop = BackPropagation()
    network = backprop.inicializar_rede_neural(3, 2, 1)
    for layer in network:
        print(layer)
    row = [1, 1, 0, None]
    output = backprop.forward_propagate(network, row)
    print(output)

相关问题 更多 >