Значение глобальной переменной изменяется внутри функции, но я не могу понять, почему это произошло - PullRequest
0 голосов
/ 27 марта 2019

Пока я изучаю «Deeplearning с нуля» и его пример кода, я вижу, что значение глобальной переменной изменяется внутри функции.

Я пытался понять это, но не смог. Я надеюсь, что кто-то скажет мне, как работает этот код.

Подробно, объект "net.W" изменяется после изменения ключевого слова "weight", получающего "net.W" в функции. Я думаю, что "net.W" не изменится, потому что это глобальная переменная без глобальной. Но это изменилось, и я не могу понять.

Код был изменен на основе https://github.com/oreilly-japan/deep-learning-from-scratch.

import sys
import os
import numpy as np

class simpleNet:
    def __init__(self):
        self.W = np.random.rand(2,3)

    def predict(self, x):
        return np.dot(x, self.W)

    def loss(self, x, t):
        z = self.predict(x)
        z = np.sum(z)
        return z

def numerical_gradient(f, weight):
    h = 1.0
    grad = np.zeros_like(weight)

    it = np.nditer(weight, 
                   flags=['multi_index'], 
                   op_flags=['readwrite'])

    while not it.finished:
        idx = it.multi_index

        print("Before net.W: \n",net.W)

        weight[idx] = weight[idx] + h

        print("After net.W: \n",net.W)
        print(' ')
        it.iternext()

net = simpleNet()
print('Originla net.W: \n', net.W)
x = np.array([0.6, 0.9])
t = np.array([0,0,1])
dW = numerical_gradient(f, net.W)

Я ожидал, что напечатанные объекты "net.W" совпадают, но компонент "net.W" изменяется (+1,0 на h) каждый раз после изменения ключевого слова "weight".

''''''
Originla net.W: 
[[0.74942285 0.28408918 0.43493956]
 [0.50182208 0.19556924 0.75924396]]
''''''

''''''
Before net.W: 
 [[0.74942285 0.28408918 0.43493956]
 [0.50182208 0.19556924 0.75924396]]
After net.W: 
 [[1.74942285 0.28408918 0.43493956]
 [0.50182208 0.19556924 0.75924396]]

Before net.W: 
 [[1.74942285 0.28408918 0.43493956]
 [0.50182208 0.19556924 0.75924396]]
After net.W: 
 [[1.74942285 1.28408918 0.43493956]
 [0.50182208 0.19556924 0.75924396]]

Before net.W: 
 [[1.74942285 1.28408918 0.43493956]
 [0.50182208 0.19556924 0.75924396]]
After net.W: 
 [[1.74942285 1.28408918 1.43493956]
 [0.50182208 0.19556924 0.75924396]]

Before net.W: 
 [[1.74942285 1.28408918 1.43493956]
 [0.50182208 0.19556924 0.75924396]]
After net.W: 
 [[1.74942285 1.28408918 1.43493956]
 [1.50182208 0.19556924 0.75924396]]

Before net.W: 
 [[1.74942285 1.28408918 1.43493956]
 [1.50182208 0.19556924 0.75924396]]
After net.W: 
 [[1.74942285 1.28408918 1.43493956]
 [1.50182208 1.19556924 0.75924396]]

Before net.W: 
 [[1.74942285 1.28408918 1.43493956]
 [1.50182208 1.19556924 0.75924396]]
After net.W: 
 [[1.74942285 1.28408918 1.43493956]
 [1.50182208 1.19556924 1.75924396]]
''''''
...