2017-08-12 16 views
1

シンプルなニューラルネットワークに問題があります。私は映画のレビューを表す入力として疎ベクトルを持っています。私はsklearnのCountVectorizerでこれらのベクトルを生成しました。各ベクトルのサイズは5000です。
いくつかのレビューを繰り返した後、私は警告を受け取ります。
シグモイド関数の一部であるnp.expでオーバーフローが発生しました。私はnp.exp-警告が前方伝播におけるSYN1とL1の乗算後に大きな値によって引き起こされたことが、分かった
数回の反復後のニューラルネットワークが立ち往生し、常に同じエラー値
を生成します。
ネットのさまざまなレイヤーで値を正規化しようとしましたが、それから数回反復した後に が再びスタックしました。
誰も私を助けて、私のコードで何が間違っているのか教えてください。
ありがとうございました。NNが立ち往生し、np.expのオーバーフローが発生する

def sigmoid(x): 
    output = 1/(1 + np.exp(-x)) 
    return output 

def sigmoid_output_to_derivate(x): 
    return x * (1 - x) 

if __name__ == "__main__": 
    with open("train_data_20.pkl", "rb") as fid: 
     train_data_features = pickle.load(fid) 
    with open("train_labels_20.pkl", "rb") as fid_train: 
     train_labels = pickle.load(fid_train) 

    with open("test_data_20.pkl", "rb") as fid_test: 
     test_data_features = pickle.load(fid_test) 
    with open("test_labels_20.pkl","rb") as fid_l: 
     test_labels = pickle.load(fid_l) 

    x = train_data_features[:2500] 
    y = np.reshape(train_labels[:2500], (-1,1)) 


    np.random.seed(1) 
    syn0 = 2*np.random.random((5000,6000))-1 
    syn1 = 2*np.random.random((6000,1))-1 

    for i in range(1000): 
     l0 = x 
     #l0 = l0/np.linalg.norm(l0) 
     l1 = sigmoid(np.dot(l0,syn0)) 
     l2 = sigmoid(np.dot(l1,syn1)) 

     l2_error = y - l2 

     error_mean = np.mean(np.abs(l2_error)) 
     print("Error: ", str(error_mean)) 

     l2_delta = l2_error * sigmoid_output_to_derivate(l2) 

     l1_error = np.dot(l2_delta, syn1.T) 
     l1_delta = l1_error * sigmoid_output_to_derivate(l1) 

     syn1 += np.dot(l1.T, l2_delta) 
     syn0 += np.dot(l0.T, l1_delta) 

答えて

関連する問題