Почему переменная функции изменяется после второго вызова функции в Python? - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь определить функцию стоимости для нейронной сети. Я вызываю функцию из main, как описано ниже:

#without regularization
lambda_rate = 0
J,Theta_1,Theta_2 = functions.nnCostFunction(initial_theta1,initial_theta2,input_layer_size,hidden_layer_size,num_labels,X, y, lambda_rate,m)

#testing regularization
lambda_rate = 1
J,Theta_1,Theta_2 = functions.nnCostFunction(initial_theta1,initial_theta2,input_layer_size,hidden_layer_size,num_labels,X, y, lambda_rate,m)

И сама функция, как описано ниже, но проблема в том, что когда я устанавливаю первый столбец тэта-массива в ноль, конечно, тэта-массивы меняются. Я делаю этот раздел в конце функции, поэтому нет необходимости заботиться о тета-изменении, по моему мнению. Когда я изменяю theta1 и theta2, когда я вспоминаю функцию для проверки части регуляризации, theta1 и theta2 приходят с предыдущими измененными значениями, даже если я присваиваю им значения initial_theta в начале функции.

Мне кажется, я понимаю проблема, которая может быть: я ссылаюсь на theta1 и theta2 на значения initial_theta. Как я уже упоминал, когда я меняю theta1, он меняет initial_theta. Но даже это все происходит, я возвращаюсь к основному, так почему же это происходит, когда я вспоминаю функцию? Это причина проблемы, потому что я определяю initial_theta1 и initial_theta2 как одно и то же имя в основном?

 def nnCostFunction(initial_theta1,initial_theta2,input_layer_size,hidden_layer_size,num_labels,X, y, lambda_rate,m):
        J = 0
        X = np.insert(X,0,1.0,axis=1) #adding bias to input layer
        v = np.zeros((m,num_labels)) #create zeros for output unit as 10 class classification
        Theta1 = initial_theta1
        Theta2 = initial_theta2
        for i in range(m):         #define output units variable
            v[i][(y[i])-1] = 1

        z2 = np.matmul(X,Theta1.transpose())
        a2 = sigmoid(z2)
        a2 = np.insert(a2,0,1.0,axis=1)
        z3 = np.matmul(a2,Theta2.transpose())
        a3 = sigmoid(z3)
        #Non-Regularized Cost
        for i in range(num_labels):
            J_test = (1/m)*(np.matmul(-v[:,i].transpose(),np.log(a3)[:,i])-np.matmul(1-v[:,i].transpose(),np.log(1-a3)[:,i]))
            J = J+J_test
        #Regularized Cost    
        Regular_part = (lambda_rate/(2*m))*(sum(sum(np.power(Theta1[:,1:],2)))+sum(sum(np.power(Theta2[:,1:],2))))
        J = J+Regular_part

        #Back Propagation
        der_error_3 = (a3 - y)
        der_error_2 = np.multiply(np.matmul(der_error_3,Theta2[:,1:]),sigmoid_prime(z2))

        delta_2 = np.matmul(der_error_3.transpose(),a2)
        delta_1 = np.matmul(der_error_2.transpose(),X)

        Theta1[:,0] = 0 #setting first column of theta1 to zeros for regularization of backpropagation algorithm
        Theta2[:,0] = 0 #setting first column of theta2 to zeros for regularization of backpropagation algorithm

        Theta1 = Theta1*lambda_rate/m;
        Theta2 = Theta2*lambda_rate/m;
        Theta1_grad = delta_1/m+Theta1;
        Theta2_grad = delta_2/m+Theta2; 

        return J,Theta1_grad,Theta2_grad

Одним из возможных решений этой проблемы является написание кода, как показано ниже.

      Theta1_Reg,Theta2_Reg = Theta1.copy(),Theta2.copy()
      Theta1_Reg[:,0] = 0     #setting first column of theta1 to zeros for regularization of backpropagation algorithm
      Theta2_Reg[:,0] = 0     #setting first column of theta2 to zeros for regularization of backpropagation algorithm

или в начале функции, написание кода ниже:

Theta1 = initial_theta1.copy()
Theta2 = initial_theta2.copy()

У меня есть решение, но я не понимаю, почему значение в функции влияет на внешние функции? Вот почему я использую глобальные переменные в Matlab или иногда в Python. Большое спасибо.

...