Я пытаюсь определить функцию стоимости для нейронной сети. Я вызываю функцию из 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. Большое спасибо.