2017-08-07 5 views
1

Pymc3を使って深いベイジアンニューラルネットワークを構築しました。私はモデルを訓練し、必要なサンプルを取得しました。今度は、この適合モデルをディスクに保存するための検索を行っています テストデータセットのサイズを変更すると、このエラーが発生します。 def save_model(trace、network、ann_input、num): print( "in")バフとして( 'my_model.pkl'、 'WB')オープンと : pickle.dump({ 'モデル':ネットワーク、 'トレース':トレース}、バフ)simmpling後にPymc3モデルをディスクに保存

f = open ('ann_input'+str(num)+'.pckl', 'wb') 
pickle.dump (ann_input, f) 
f.close() 

デフload_model(NUM) データ= pickle.load(バフ)

network, trace = data[ 'model' ], data[ 'trace' ] 

f = open ('ann_input'+str(num)+'.pckl', 'rb') 
ann_input = pickle.load (f) 
f.close() 

return trace, network, ann_input 
:バフとしてオープン( 'my_model.pkl'、 'RB')と

は、私はこのエラーに

print(accuracy_score(y_pred,y_test)) 

ファイルを取得する "D:\ Users \ユーザーwissam \のAppData \ローカル\プログラム\ Pythonの\ Python36 \ libには\サイト - パッケージ\ sklearn \メトリック\ classification.py"、行172、 Python \ Python \ lib \ site-packages \ sklearn \ metrics \ classification.py "というファイル名を使用しています。このファイルは、ディレクトリ181、行72、_check_targets check_consistent_length(y_true、y_pred) ファイル "D:¥Users¥wissam¥AppData¥Local¥Programs¥Python¥Python36¥lib¥site-packages¥sklearn¥utils¥validation.py" in check_consistent_length "samples:%r" lenのlに対する%[int(l)] gths]) とValueError:サンプルの一貫性のない数で見入力変数:[174、169]

iは、次のコード

with neural_network: 
     step = pm.Metropolis() 
     print("start simpling") 
     db = pm.backends.Text ('test') 
     trace = pm.sample (10000,step, trace=db) 
     print ("end simpling") 
     from pymc3 import summary 
     summary(trace, varnames=['p']) 

を使用してバックエンドを使用することも試み、私は次のエラーを取得

Traceback (most recent call last): 
File "D:\Users\wissam\AppData\Roaming\Python\Python36\site- 
packages\pymc3\model.py", line 121, in get_context 
return cls.get_contexts()[-1] 
IndexError: list index out of range 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
File 
"D:/Users/wissam/PycharmProjects/git_repo/projetenovap/Training/ 
trainModel.py", 
line 301, in <module> 
trace = pm.backends.text.load('test') 
File "D:\Users\wissam\AppData\Roaming\Python\Python36\site- 
packages\pymc3\backends\text.py", line 171, in load 
strace = Text(name, model=model) 
File "D:\Users\wissam\AppData\Roaming\Python\Python36\site- 
packages\pymc3\backends\text.py", line 44, in __init__ 
super(Text, self).__init__(name, model, vars) 
File "D:\Users\wissam\AppData\Roaming\Python\Python36\site- 
packages\pymc3\backends\base.py", line 31, in __init__ 
model = modelcontext(model) 
File "D:\Users\wissam\AppData\Roaming\Python\Python36\site- 
packages\pymc3\model.py", line 131, in modelcontext 
return Model.get_context() 
File "D:\Users\wissam\AppData\Roaming\Python\Python36\site- 
packages\pymc3\model.py", line 123, in get_context 
raise TypeError("No context on context stack") 
TypeError: No context on context stack 

このモデルの保存についてのご意見はありますか?

+0

私の問題は解決しました。私たちはトレース(サンプリングされたデータ)と新しいニューラルネットワークを作成するたびに(すべてのニューラルネットワークではなくウェイトだけを保存する) – user2856587

答えて

1

まあ私のproblemeが解決した、我々は唯一のトレース(サンプリングされたデータ)を保存し、我々は(重みのみを保存していないすべてのニューラルネットワーク)新しいニューラルネットワークを作成するたびにする必要があり

これはコードというのたわごとです私はそれを再ロードするために、この機能

 #save trained model 
    def save_model(trace, network): 
      with open ('my_model.pkl', 'wb') as buff: 
      pickle.dump ({'model': network, 'trace': trace}, buff) 

を使用していた痕跡を保存するために

def predict(trace, test_X): 

     #create the model 
     X_test, X_train, y_test, y_train = loadDataset() 
     binary = sklearn.preprocessing.LabelBinarizer().fit (y_train) 
     y_2_bin = binary.transform (y_train) 
     ann_input = theano.shared (X_train) 
     n_hidden = 8; 
     nbHidden = 3; 
     # Initialize random weights between each layer 
     init_1 = np.random.randn (X_train.shape[ 1 ], n_hidden) 
     init_2 = [ ] 
     for i in range (nbHidden): 
      init_2.append (np.random.randn (n_hidden, n_hidden)) 
     init_out = np.random.randn (n_hidden, 3) 
     with pm.Model() as neural_network: 
      # Weights from input to hidden layer 
      weights_in_1 = pm.Normal ('w_in_1', 0, sd=1, 
             shape=(X_train.shape[ 1 ], n_hidden), 
             testval=init_1) 
      # Weights from 1st to 2nd layer 
      weights_1_2 = [ ] 
      for i in range (1, nbHidden, 1): 
       weights_1_2.append (pm.Normal ('w_' + str (i) + '_' + str (i + 1), 0, sd=1, 
               shape=(n_hidden, n_hidden), 
               testval=init_2[ i ])) 

      # Weights from hidden lay2er to output 

      weights_2_out = pm.Normal ('w_' + str (nbHidden) + '_out', 0, sd=1, 
             shape=(n_hidden, 3), 
             testval=init_out) 

      # Build neural-network using tanh activation function 
      act_1 = T.tanh (T.dot (ann_input, 
            weights_in_1)) 
      act_2 = [ ] 
      act_2.append (T.tanh (T.dot (act_1, 
             weights_1_2[ 0 ]))) 

      for i in range (1, nbHidden, 1): 
       act_2.append (T.tanh (T.dot (act_2[ i - 1 ], 
              weights_1_2[ i - 1 ]))) 

      act_out = T.nnet.softmax (T.dot (act_2[ nbHidden - 1 ], 
              weights_2_out)) 
      # 10 discrete output classes -> pymc3 categorical distribution 
      p = pm.Deterministic ('p', act_out) 
      # y_train [y_train==2]=0 
      # y_2_bin = sklearn.preprocessing.LabelBinarizer().fit_transform (y_train) 
      out = pm.Bernoulli ('out', p, observed=y_2_bin) 
      print("model etablis") 
     ann_input.set_value(test_X) 

     #use the saved trace which containes the weight 
     with neural_network: 
      print("start simpling") 
      ppc = pm.sample_ppc (trace, samples=1000) 
      print("end simpling") 

     #get the prediction 
     y_pred = ppc[ 'p' ] 

     #return the prediction 
     return y_pred 

を使用していた私は

01を使用しました
#reload trained model 
    def load_model(num): 
      with open ('my_model.pkl', 'rb') as buff: 
      data = pickle.load (buff) 

      network, trace = data[ 'model' ], data[ 'trace' ] 
関連する問題