2017-10-17 2 views
1
import numpy as np 
temp_data_x = np.random.randn(200,3) 
temp_data_y = temp_data_x[:,0] + temp_data_x[:,1] + temp_data_x[:,2] + np.random.randn(200,1).reshape(200,) 
from sklearn.neural_network import MLPRegressor 
net = MLPRegressor(hidden_layer_sizes=(3), activation='tanh', max_iter=1000, 
    learning_rate_init=0.1,verbose=True, random_state=3) 
net1 = net.fit(temp_data_x[0:150,],temp_data_y[0:150]) 
net.coefs_[0][0:5,0:5] 
net1.coefs_[0][0:5,0:5] 
net.predict(temp_data_x[199,].reshape(1,-1)) 
net1.predict(temp_data_x[199,].reshape(1,-1)) 

を動作しません。 。 どうしたのですか?ニューラルネットワークモデルは、私が作ったと走ったこの単純なニューラルネットワークをPythonのnumpyのを使用して、学ぶscikit、 しかし係数と初期モデル(純額)とフィットモデル(NET1)の値が同一であると予測

答えて

2

変数netとnet1を使用して同じ係数と予測を得る理由についての質問に答えるには、両方が同じオブジェクトへの参照であるためです。 ことを確認するために、あなたはこれを実行することができます。

print(net is net1) 

あなたはTrueを取得します。その理由は、MLPRegressorオブジェクトの参照を既に作成しているためです。したがって、fitの値がXとyのモデルの場合、netというモデルは、指定された値に適合し、同じオブジェクトをnet1に割り当てようとします。

次に、学習率を上げるため、または少なくともニューラルネットワークが提供されたデータに適合するように、学習率(0.01など)を下げる必要があると思います。

最後に、既にチェックされているように、データがランダムなデータであるため、テストデータ以外の値ではモデルのパフォーマンスが向上しないことがあります。

編集:エポックの各ラウンドの後に学んだの重み(係数)を印刷する要求に基づいて

、私は余分な詳細を追加しています。 MLPRegressorと同じように、各反復/バッチなどの後で学習されたウェイトの詳細を印刷することはできません。そのためにはsknn.mlpモジュールを使用する必要があります。彼らはあなたの学習の時間を印刷/評価するために使用できる様々なcallbacksを持っています。このコードを実行すると

def print_coeff_callback(**variables): 
    print('End of epoch: {}'.format(variables['i'])) 
    print('Layer 0: Weights:') 
    print(variables['best_params'][0][0]) 
    print('Layer 0: Biases:') 
    print(variables['best_params'][0][1]) 
    print('Layer 1: Weights:') 
    print(variables['best_params'][1][0]) 
    print('Layer 1: Biases:') 
    print(variables['best_params'][1][1]) 
    print() 

import numpy as np 
temp_data_x = np.random.randn(200,3) 
temp_data_y = temp_data_x[:,0] + temp_data_x[:,1] + temp_data_x[:,2]\ 
    + np.random.randn(200,1).reshape(200,) 

from sknn.mlp import Regressor, Layer 
net = Regressor(layers = [Layer('Tanh', units = 3), Layer('Linear', units = 1)], 
       learning_rate = 0.01, n_iter = 10, 
       verbose = True, random_state = 3, 
       callback = {'on_epoch_finish': print_coeff_callback}) 
net.fit(temp_data_x[0:150,],temp_data_y[0:150]) 

、各エポックの終わりに、あなたはこのような追加の詳細を取得します:

End of epoch: 1 
Layer 0: Weights: 
[[-0.50751932 -0.72378025 -0.37128063] 
[-0.53206593 -0.33147215 0.83072845] 
[-0.66474313 -0.76372327 -0.85991181]] 
Layer 0: Biases: 
[-0.03277463 -0.10826231 0.01669442] 
Layer 1: Weights: 
[[-0.88015991] 
[-1.13531142] 
[ 0.06633887]] 
Layer 1: Biases: 
[ 0.16668694] 

End of epoch: 2 
Layer 0: Weights: 
[[-0.49187796 -0.70438651 -0.36641678] 
[-0.66897643 -0.51718653 0.83213911] 
[-0.68042139 -0.72434914 -0.85017705]] 
Layer 0: Biases: 
[ 0.09687692 0.04577672 0.00219902] 
Layer 1: Weights: 
[[-1.11614207] 
[-1.31741563] 
[-0.02267721]] 
Layer 1: Biases: 
[ 0.02075817] 

として

は、以下のコードあなたが始めるために考えてみましょう学習した重み/偏りの詳細が存在し、時々刻々と変化しています。

+0

あなたは初期モデル 'net'が 'net1'によって上書きされることを意味します。それでは、どうすれば 'ネット'モデルを変更しないでおくことができますか?私が比較できるように? – user67275

+0

実際には、現在のデータセットに別の観測値を追加し、モデル 'net1'と 'net2'を比較する必要があります。 – user67275

+0

同じ擬似コードをRまたはMATLABに実装すると、モデル 'net1'に適合していても 'net'モデルは同じままになります。 Pythonはこれのように動作しますか? – user67275

関連する問題