2015-01-07 9 views
1

다중 클래스 분류를 위해 Backpropagation 신경망을 사용하려고합니다. 나는 this code을 발견하고 그것을 적응 시키려고 노력했다. 그것은 Machine Learning in Coursera from Andrew Ng의 lection을 기반으로합니다.신경 네트워크에서 scipy.optimize.minimize 사용

여기서 정확히 scipy.optimize.minimize 기능 구현을 이해할 수 없습니다. 코드에서 한 번만 사용됩니다. 반복적으로 네트워크의 가중치를 업데이트합니까? 수렴 시점을 시각화 (음모)하여 어떻게 볼 수 있습니까?

이 기능을 사용하면 더 나은 성능을 얻기 위해 어떤 매개 변수를 조정할 수 있습니까? 은닉층 뉴런의

  • 번호 : 나는 here 목록 일반적인 매개 변수를 발견이 내 코드
  • 학습 속도 hidden_layer_size=25입니다 : 여전히 내장 사용하여 해당 최소화 기능을 조정할 수 있습니다?
  • 모멘텀 : 내 경우에는 reg_lambda=0입니까? overfitting을 피하기위한 정규화 매개 변수, 맞습니까?
  • 신기원 :


    종속성이 너무 명백하다
    65535, 3670, 65535, 3885, -0.73, 1 
    65535, 3962, 65535, 3556, -0.72, 1 
    65535, 3573, 65535, 3529, -0.61, 1 
    3758, 3123, 4117, 3173, -0.21, 0 
    3906, 3119, 4288, 3135, -0.28, 0 
    3750, 3073, 4080, 3212, -0.26, 0 
    65535, 3458, 65535, 3330, -0.85, 2 
    65535, 3315, 65535, 3306, -0.87, 2 
    65535, 3950, 65535, 3613, -0.84, 2 
    65535, 32576, 65535, 19613, -0.35, 3 
    65535, 16657, 65535, 16618, -0.37, 3 
    65535, 16657, 65535, 16618, -0.32, 3 
    

    , 나는 그것을 너무 쉽게해야한다고 생각 : 여기 maxiter=500

내 훈련 데이터 (대상 클래스가 마지막 열에입니다)입니다 그것을 분류하기 위해 ...

그러나 결과는 끔찍합니다. 나는 0.6에서 0.8의 정확도를 얻는다. 이것은 내 신청서에 절대적으로 부적합합니다. 주어진에서

import numpy as np 
from scipy import optimize 

from sklearn import cross_validation 
from sklearn.metrics import accuracy_score 
import math 

class NN_1HL(object): 

    def __init__(self, reg_lambda=0, epsilon_init=0.12, hidden_layer_size=25, opti_method='TNC', maxiter=500): 
     self.reg_lambda = reg_lambda 
     self.epsilon_init = epsilon_init 
     self.hidden_layer_size = hidden_layer_size 
     self.activation_func = self.sigmoid 
     self.activation_func_prime = self.sigmoid_prime 
     self.method = opti_method 
     self.maxiter = maxiter 

    def sigmoid(self, z): 
     return 1/(1 + np.exp(-z)) 

    def sigmoid_prime(self, z): 
     sig = self.sigmoid(z) 
     return sig * (1 - sig) 

    def sumsqr(self, a): 
     return np.sum(a ** 2) 

    def rand_init(self, l_in, l_out): 
     self.epsilon_init = (math.sqrt(6))/(math.sqrt(l_in + l_out)) 
     return np.random.rand(l_out, l_in + 1) * 2 * self.epsilon_init - self.epsilon_init 

    def pack_thetas(self, t1, t2): 
     return np.concatenate((t1.reshape(-1), t2.reshape(-1))) 

    def unpack_thetas(self, thetas, input_layer_size, hidden_layer_size, num_labels): 
     t1_start = 0 
     t1_end = hidden_layer_size * (input_layer_size + 1) 
     t1 = thetas[t1_start:t1_end].reshape((hidden_layer_size, input_layer_size + 1)) 
     t2 = thetas[t1_end:].reshape((num_labels, hidden_layer_size + 1)) 
     return t1, t2 

    def _forward(self, X, t1, t2): 
     m = X.shape[0] 
     ones = None 
     if len(X.shape) == 1: 
      ones = np.array(1).reshape(1,) 
     else: 
      ones = np.ones(m).reshape(m,1) 

     # Input layer 
     a1 = np.hstack((ones, X)) 

     # Hidden Layer 
     z2 = np.dot(t1, a1.T) 
     a2 = self.activation_func(z2) 
     a2 = np.hstack((ones, a2.T)) 

     # Output layer 
     z3 = np.dot(t2, a2.T) 
     a3 = self.activation_func(z3) 
     return a1, z2, a2, z3, a3 

    def function(self, thetas, input_layer_size, hidden_layer_size, num_labels, X, y, reg_lambda): 
     t1, t2 = self.unpack_thetas(thetas, input_layer_size, hidden_layer_size, num_labels) 

     m = X.shape[0] 
     Y = np.eye(num_labels)[y] 

     _, _, _, _, h = self._forward(X, t1, t2) 
     costPositive = -Y * np.log(h).T 
     costNegative = (1 - Y) * np.log(1 - h).T 
     cost = costPositive - costNegative 
     J = np.sum(cost)/m 

     if reg_lambda != 0: 
      t1f = t1[:, 1:] 
      t2f = t2[:, 1:] 
      reg = (self.reg_lambda/(2 * m)) * (self.sumsqr(t1f) + self.sumsqr(t2f)) 
      J = J + reg 
     return J 

    def function_prime(self, thetas, input_layer_size, hidden_layer_size, num_labels, X, y, reg_lambda): 
     t1, t2 = self.unpack_thetas(thetas, input_layer_size, hidden_layer_size, num_labels) 

     m = X.shape[0] 
     t1f = t1[:, 1:] 
     t2f = t2[:, 1:] 
     Y = np.eye(num_labels)[y] 

     Delta1, Delta2 = 0, 0 
     for i, row in enumerate(X): 
      a1, z2, a2, z3, a3 = self._forward(row, t1, t2) 

      # Backprop 
      d3 = a3 - Y[i, :].T 
      d2 = np.dot(t2f.T, d3) * self.activation_func_prime(z2) 

      Delta2 += np.dot(d3[np.newaxis].T, a2[np.newaxis]) 
      Delta1 += np.dot(d2[np.newaxis].T, a1[np.newaxis]) 

     Theta1_grad = (1/m) * Delta1 
     Theta2_grad = (1/m) * Delta2 

     if reg_lambda != 0: 
      Theta1_grad[:, 1:] = Theta1_grad[:, 1:] + (reg_lambda/m) * t1f 
      Theta2_grad[:, 1:] = Theta2_grad[:, 1:] + (reg_lambda/m) * t2f 

     return self.pack_thetas(Theta1_grad, Theta2_grad) 

    def fit(self, X, y): 
     num_features = X.shape[0] 
     input_layer_size = X.shape[1] 
     num_labels = len(set(y)) 

     theta1_0 = self.rand_init(input_layer_size, self.hidden_layer_size) 
     theta2_0 = self.rand_init(self.hidden_layer_size, num_labels) 
     thetas0 = self.pack_thetas(theta1_0, theta2_0) 

     options = {'maxiter': self.maxiter} 
     _res = optimize.minimize(self.function, thetas0, jac=self.function_prime, method=self.method, 
           args=(input_layer_size, self.hidden_layer_size, num_labels, X, y, 0), options=options) 

     self.t1, self.t2 = self.unpack_thetas(_res.x, input_layer_size, self.hidden_layer_size, num_labels) 

     np.savetxt("weights_t1.txt", self.t1, newline="\n") 
     np.savetxt("weights_t2.txt", self.t2, newline="\n") 

    def predict(self, X): 
     return self.predict_proba(X).argmax(0) 

    def predict_proba(self, X): 
     _, _, _, _, h = self._forward(X, self.t1, self.t2) 
     return h 


################## 
# IR data  # 
################## 
values = np.loadtxt('infrared_data.txt', delimiter=', ', usecols=[0,1,2,3,4]) 

targets = np.loadtxt('infrared_data.txt', delimiter=', ', dtype=(int), usecols=[5]) 

X_train, X_test, y_train, y_test = cross_validation.train_test_split(values, targets, test_size=0.4) 
nn = NN_1HL() 
nn.fit(values, targets) 
print("Accuracy of classification: "+str(accuracy_score(y_test, nn.predict(X_test)))) 

답변

0

: 나는 일반적으로 더 많은 데이터를 필요로 알고 있지만, 나는 적어도 여기

(계정 잠재적 인 overfitting을 고려하지 않고) 훈련 데이터에 맞게 수있을 때 나는 이미 행복 할 것입니다 코드입니다 코드 scipy.optimize.minimize은 파생 된 함수 (Jacobi의 행렬)를 반복적으로 최소화합니다. 설명서에 따르면 use는 각 반복 후에 호출 할 함수에 callback 인수를 지정할 수 있습니다. 이렇게하면 성능을 측정 할 수 있지만 최적화 프로세스를 중단시킬 수 있는지 확실하지 않습니다. 나열된

모든 매개 변수는 하이퍼 파라미터이며, 그것은 직접 최적화하기 어렵다 : 숨겨진 레이어 뉴런의

수 따라서, 이산 반환 매개 변수, 그리고, 그라데이션 기법을 통해 최적화 할 수 없습니다. 또한 NeuralNet 아키텍처에 영향을 미치므로 네트워크를 학습하는 동안이를 최적화 할 수 없습니다. 그러나 교차 검증 (예 : GridSearchCV보기) 또는 기타 매개 변수 검색 (hyperopt, spearmint, 등)과 같은 가능한 옵션을 검색하기 위해 더 높은 수준의 루틴을 사용하는 것이 좋습니다.).

학습 속도은 사용 가능한 대부분의 최적화 방법에 대해 사용자 지정할 수없는 것처럼 보입니다. 그러나 실제로 그라디언트 디센트의 학습 속도는 뉴시스의 방법인데, 이는 대시에 반전 된 학습 속도를 갖는 대각 행렬 인 1/eta I에 의해 "근사되어"있습니다.그래서 당신은 hessistic 기반의 방법을이 경험적 방법으로 시도 할 수 있습니다.

모멘텀은 정규화와는 완전히 관련이 없습니다. 이것은 최적화 기술이며 최적화를 위해 scipy를 사용하기 때문에 사용할 수 없습니다.

관련 문제