2016-11-18 3 views
0

私は機械学習のAndrew's Courseraコースに従っています。私はPython(784入力、25隠された、10出力)で桁認識のための3層ニューラルネットを構築しようとしています。しかし、(トレーニングデータの)予測(正確度<、100 iterで5%、繰り返しでは精度が向上しない)を得ることができません。Pythonで数字認識のためのニューラルネットを構築しようとしています。 theta2と予測が正しく得られない

J(コスト関数)が下がっているように見えます(写真1を参照)。(最小化する前に)グラデーションチェックを行っており、約1e-11(写真2参照)と一致するようです。

100回繰り返した後のtheta1とtheta2を私の作業用matlabコードと比較しました(コードスニペット1はオクターブ、コードスニペット2はPythonを参照してください)。シータ1は合理的には類似しているようですが、シータ2は非常に異なっています - コードスニペット2を参照してください(異なる最適化ルーチンのために異なるはずがありますが、

-c:32:RuntimeWarning:EXPで遭遇オーバーフロー

彼らは

私が見る唯一の誤差がある)収束し始め、または少なくとも100回の反復の後、近づくべきであるということです

最適化中にシグモイドを実行しているとき。しかし、これは必須ではないと言われました。最適化中にこのエラーが発生するのは正常ですか?さらに、それはシグモイドであるため、入力が大きいときはいつでも、それは1に向かう傾向があります。

私はスニペット3に自分のコードを添付しました。私は可能な限り短くするために、他の必須ではないビット(勾配チェックなど)をすべて削除しました。

私はそれが間違っている場所を見つけることさえできないので、これを助けていただければと思います。ありがとうございました。

写真:

J (cost function) decreasing to 1.8 after 12 iterations

Gradient checking before optimizing, they look very similar

コードスニペット:

Initializing Neural Network Parameters ... 
 
initial1 
 
    -0.0100100 
 
    -0.0771400 
 
    -0.1113800 
 
    -0.0230100 
 
    0.0547800 
 
    -0.0505500 
 
    -0.0731200 
 
    -0.0988700 
 
    0.0128000 
 
    -0.0855400 
 
    -0.1002500 
 
    -0.1137200 
 
    -0.0669300 
 
    -0.0999900 
 
    0.0084500 
 
    -0.0363200 
 
    -0.0588600 
 
    -0.0431100 
 
    -0.1133700 
 
    -0.0326300 
 
    0.0282800 
 
    0.0052400 
 
    -0.1134600 
 
    -0.0617700 
 
    0.0267600 
 
initial2 
 
    0.0273700 
 
    0.1026000 
 
    -0.0502100 
 
    -0.0699100 
 
    0.0190600 
 
    0.1004000 
 
    0.0784600 
 
    -0.0075900 
 
    -0.0362100 
 
    0.0286200 
 
Doing fminunc 
 

 
Training Neural Network... 
 
Iteration 100 | Cost: 6.219605e-01 
 
theta1 
 
    -0.0099719 
 
    -0.0768462 
 
    -0.1109559 
 
    -0.0229224 
 
    0.0545714 
 
    -0.0503575 
 
    -0.0728415 
 
    -0.0984935 
 
    0.0127513 
 
    -0.0852143 
 
    -0.0998682 
 
    -0.1132869 
 
    -0.0666751 
 
    -0.0996092 
 
    0.0084178 
 
    -0.0361817 
 
    -0.0586359 
 
    -0.0429458 
 
    -0.1129383 
 
    -0.0325057 
 
    0.0281723 
 
    0.0052200 
 
    -0.1130279 
 
    -0.0615348 
 
    0.0266581 
 
theta2 
 
    1.124918 
 
    1.603780 
 
    -1.266390 
 
    -0.848874 
 
    0.037956 
 
    -1.360841 
 
    2.145562 
 
    -1.448657 
 
    -1.262285 
 
    -1.357635

theta1_initial 
 
[-0.01001 -0.07714 -0.11138 -0.02301 0.05478 -0.05055 -0.07312 -0.09887 
 
    0.0128 -0.08554 -0.10025 -0.11372 -0.06693 -0.09999 0.00845 -0.03632 
 
-0.05886 -0.04311 -0.11337 -0.03263 0.02828 0.00524 -0.11346 -0.06177 
 
    0.02676] 
 
theta2_initial 
 
[ 0.02737 0.1026 -0.05021 -0.06991 0.01906 0.1004 0.07846 -0.00759 
 
-0.03621 0.02862] 
 
Doing fminunc 
 
-c:32: RuntimeWarning: overflow encountered in exp 
 
theta1 
 
[-0.00997202 -0.07680716 -0.11086841 -0.02292044 0.05455335 -0.05034252 
 
-0.07280686 -0.09842603 0.01275117 -0.08516515 -0.0997987 -0.11319546 
 
-0.06664666 -0.09954009 0.00841804 -0.03617494 -0.05861458 -0.04293555 
 
-0.1128474 -0.0325006 0.02816879 0.00522031 -0.1129369 -0.06151103 
 
    0.02665508] 
 
theta2 
 
[ 0.27954826 -0.08007496 -0.36449273 -0.22988024 0.06849659 -0.47803973 
 
    1.09023041 -0.25570559 -0.24537494 -0.40341995]

#-----------------BEGIN HEADERS----------------- 
import numpy as np 
import matplotlib.pyplot as plt 
from scipy import stats 
import csv 
import scipy 
#-----------------END HEADERS----------------- 


#-----------------BEGIN FUNCTION 1----------------- 
def randinitialize(L_in, L_out): 
    w = np.zeros((L_out, 1 + L_in)) 
    epsilon_init = 0.12 
    w = np.random.rand(L_out, 1 + L_in) * 2 * epsilon_init - epsilon_init 

    return w 
#-----------------END FUNCTION 1----------------- 


#-----------------BEGIN FUNCTION 2----------------- 
def sigmoid(lz): 
    g = 1.0/(1.0+np.exp(-lz)) 

    return g 
#-----------------END FUNCTION 2----------------- 


#-----------------BEGIN FUNCTION 3----------------- 
def sigmoidgradient(lz): 
    g = np.multiply(sigmoid(lz),(1-sigmoid(lz))) 

    return g 
#-----------------END FUNCTION 3----------------- 


#-----------------BEGIN FUNCTION 4----------------- 
def nncostfunction(ltheta_ravel, linput_layer_size, lhidden_layer_size, lnum_labels, lx, ly, llambda_reg): 
    ltheta1 = np.array(np.reshape(ltheta_ravel[:lhidden_layer_size * (linput_layer_size + 1)], (lhidden_layer_size, (linput_layer_size + 1)))) 
    ltheta2 = np.array(np.reshape(ltheta_ravel[lhidden_layer_size * (linput_layer_size + 1):], (lnum_labels, (lhidden_layer_size + 1)))) 
    ltheta1_grad = np.zeros((np.shape(ltheta1))) 
    ltheta2_grad = np.zeros((np.shape(ltheta2))) 
    y_matrix = [] 
    lm = np.shape(lx)[0] 

    eye_matrix = np.eye(lnum_labels) 
    for i in range(len(ly)): 
     y_matrix.append(eye_matrix[int(ly[i])-1,:]) #The minus one as python is zero based 
    y_matrix = np.array(y_matrix) 

    a1 = np.hstack((np.ones((lm,1)), lx)).astype(float) 
    z2 = sigmoid(ltheta1.dot(a1.T)) 
    a2 = (np.concatenate((np.ones((np.shape(z2)[1], 1)), z2.T), axis=1)).astype(float) 
    a3 = sigmoid(ltheta2.dot(a2.T)) 
    h = a3 

    J_unreg = 0 
    J = 0 
    J_unreg = (1/float(lm))*np.sum(\ 
    -np.multiply(y_matrix,np.log(h.T))\ 
    -np.multiply((1-y_matrix),np.log(1-h.T))\ 
    ,axis=None) 

    J = J_unreg + (llambda_reg/(2*float(lm)))*\ 
    (np.sum(\ 
    np.multiply(ltheta1[:,1:],ltheta1[:,1:])\ 
    ,axis=None)+np.sum(\ 
    np.multiply(ltheta2[:,1:],ltheta2[:,1:])\ 
    ,axis=None)) 

    delta3 = a3.T - y_matrix 
    delta2 = np.multiply((delta3.dot(ltheta2[:,1:])), (sigmoidgradient(ltheta1.dot(a1.T))).T) 
    cdelta2 = ((a2.T).dot(delta3)).T 
    cdelta1 = ((a1.T).dot(delta2)).T 

    ltheta1_grad = (1/float(lm))*cdelta1 
    ltheta2_grad = (1/float(lm))*cdelta2 

    theta1_hold = ltheta1 
    theta2_hold = ltheta2 
    theta1_hold[:,0] = 0; 
    theta2_hold[:,0] = 0; 
    ltheta1_grad = ltheta1_grad + (llambda_reg/float(lm))*theta1_hold; 
    ltheta2_grad = ltheta2_grad + (llambda_reg/float(lm))*theta2_hold; 
    thetagrad_ravel = np.concatenate((np.ravel(ltheta1_grad), np.ravel(ltheta2_grad))) 

    return (J, thetagrad_ravel) 
#-----------------END FUNCTION 4----------------- 


#-----------------BEGIN FUNCTION 5----------------- 
def predict(ltheta1, ltheta2, x): 
    m, n = np.shape(x) 
    p = np.zeros(m) 

    h1 = sigmoid((np.hstack((np.ones((m,1)),x.astype(float)))).dot(ltheta1.T)) 
    h2 = sigmoid((np.hstack((np.ones((m,1)),h1))).dot(ltheta2.T)) 
    for i in range(0,np.shape(h2)[0]): 
     p[i] = np.argmax(h2[i,:]) 

    return p 
#-----------------END FUNCTION 5----------------- 

## Setup the parameters you will use for this exercise 
input_layer_size = 784; # 28x28 Input Images of Digits 
hidden_layer_size = 25; # 25 hidden units 
num_labels = 10;   # 10 labels, from 0 to 9 
data = [] 

#Reading in data, split into X and y, rewrite label 0 to 10 (for easy comparison to course) 
with open('train.csv', 'rb') as csvfile: 
    has_header = csv.Sniffer().has_header(csvfile.read(1024)) 
    csvfile.seek(0) # rewind 
    data_csv = csv.reader(csvfile, delimiter=',') 
    if has_header: 
     next(data_csv) 
    for row in data_csv: 
     data.append(row) 
data = np.array(data) 
x = data[:,1:] 
y = data[:,0] 
y = y.astype(int) 
for i in range(len(y)): 
    if y[i] == 0: 
     y[i] = 10 

#Set basic parameters 
m, n = np.shape(x) 
lambda_reg = 1.0 

#Randomly initalize weights for Theta_initial 
#theta1_initial = np.genfromtxt('tt1.csv', delimiter=',') 
#theta2_initial = np.genfromtxt('tt2.csv', delimiter=',') 
theta1_initial = randinitialize(input_layer_size, hidden_layer_size); 
theta2_initial = randinitialize(hidden_layer_size, num_labels); 
theta_initial_ravel = np.concatenate((np.ravel(theta1_initial), np.ravel(theta2_initial))) 

#Doing optimize 
fmin = scipy.optimize.minimize(fun=nncostfunction, x0=theta_initial_ravel, args=(input_layer_size, hidden_layer_size, num_labels, x, y, lambda_reg), method='L-BFGS-B', jac=True, options={'maxiter': 10, 'disp': True}) 
fmin 
theta1 = np.array(np.reshape(fmin.x[:hidden_layer_size * (input_layer_size + 1)], (hidden_layer_size, (input_layer_size + 1)))) 
theta2 = np.array(np.reshape(fmin.x[hidden_layer_size * (input_layer_size + 1):], (num_labels, (hidden_layer_size + 1)))) 

p = predict(theta1, theta2, x); 
for i in range(len(y)): 
    if y[i] == 10: 
     y[i] = 0 

correct = [1 if a == b else 0 for (a, b) in zip(p,y)] 
accuracy = (sum(map(int, correct))/float(len(correct))) 
print 'accuracy = {0}%'.format(accuracy * 100) 
+1

IMHO scikit-learn libraryはあなたのライブをより簡単にします。私はあなたの質問に答えることができる人はいないと思う。 –

+0

AndrewのNGコースのコードはOctave/Matlabで書かれていませんか?あなたはPythonです!彼らは言語を変えましたか? –

+0

@SembeiNorimakiはい、それはOctaveにありました。私はPythonで一度やりたかっただけです。 –

答えて

0

は私が問題を修正したと思う:私が

があるべき指数を台無しに思える:

y_matrix.append(eye_matrix [INT(LY [I ])、)]

y_matrix。

関連する問題