2017-08-27 8 views
1

私はシグナード層を重ねてNNをトレーニングしています。私は各レイヤーに関連付けられたラベルを持っており、第1レイヤーの損失を最小限に抑え、第2レイヤーの損失を最小限に抑えるためにトレーニングを交互にしたいと考えています。私は、第1層に得た結果は、第2層のために訓練するかどうかにかかわらず変わらないと思います。しかし、私は大きな違いがあります。私は何が欠けていますか?ここで積み重ねられたシグモイド:なぜ第2層をトレーニングすると第1層が変わるのですか?

は、コードは次のとおりです。

dim = Xtrain.shape[1] 
output_dim = Ytrain.shape[1] 
categories_dim = Ctrain.shape[1] 
features = C.input_variable(dim, np.float32) 
label = C.input_variable(output_dim, np.float32) 
categories = C.input_variable(categories_dim, np.float32) 
b = C.parameter(shape=(output_dim)) 
w = C.parameter(shape=(dim, output_dim)) 
adv_w = C.parameter(shape=(output_dim, categories_dim)) 
adv_b = C.parameter(shape=(categories_dim)) 
pred_parameters = (w, b) 
adv_parameters = (adv_w, adv_b) 
z = C.tanh(C.times(features, w) + b) 
adverse = C.tanh(C.times(z, adv_w) + adv_b) 
pred_loss = C.cross_entropy_with_softmax(z, label) 
pred_error = C.classification_error(z, label) 

adv_loss = C.cross_entropy_with_softmax(adverse, categories) 
adv_error = C.classification_error(adverse, categories) 

pred_learning_rate = 0.5 
pred_lr_schedule = C.learning_rate_schedule(pred_learning_rate, C.UnitType.minibatch) 
pred_learner = C.adam(pred_parameters, pred_lr_schedule, C.momentum_as_time_constant_schedule(0.9)) 
pred_trainer = C.Trainer(adverse, (pred_loss, pred_error), [pred_learner]) 

adv_learning_rate = 0.5 
adv_lr_schedule = C.learning_rate_schedule(adv_learning_rate, C.UnitType.minibatch) 
adv_learner = C.adam(adverse.parameters, adv_lr_schedule, C.momentum_as_time_constant_schedule(0.9)) 
adv_trainer = C.Trainer(adverse, (adv_loss, adv_error), [adv_learner]) 

minibatch_size = 50 
num_of_epocs = 40 

# Run the trainer and perform model training 
training_progress_output_freq = 50 

def permute (x, y, c): 
    rr = np.arange(x.shape[0]) 
    np.random.shuffle(rr) 
    x = x[rr, :] 
    y = y[rr, :] 
    c = c[rr, :] 
    return (x, y, c) 
for e in range(0,num_of_epocs): 
    (x, y, c) = permute(Xtrain, Ytrain, Ctrain) 
    for i in range (0, x.shape[0], minibatch_size): 
     m_features = x[i:min(i+minibatch_size, x.shape[0]),] 
     m_labels = y[i:min(i+minibatch_size, x.shape[0]),] 
     m_cat = c[i:min(i+minibatch_size, x.shape[0]),] 

     if (e % 2 == 0): 
      pred_trainer.train_minibatch({features : m_features, label : m_labels, categories : m_cat, diagonal : m_diagonal}) 
     else: 
      adv_trainer.train_minibatch({features : m_features, label : m_labels, categories : m_cat, diagonal : m_diagonal}) 

私は最後の2行コメントアウトかのことを驚いています(他:adv_training.trainを...)は、zの電車やテストのエラーは、ラベルの変更を予測するには。 adv_trainerは、zやその損失を計算するのに使われないadv_wとadv_bだけを修正することになっているので、なぜそれが起こるべきかわかりません。私は援助に感謝します。あなたは

adv_learner = C.adam(adverse.parameters, adv_lr_schedule, C.momentum_as_time_constant_schedule(0.9)) 

が、やるべきではない

答えて

1

adv_learner = C.adam(adv_parameters, adv_lr_schedule, C.momentum_schedule(0.9)) 

adverse.parametersは、すべてのパラメータが含まれていて、あなたはそれを望んでいません。別の言葉では、momentum_as_time_constant_schedulemomentum_scheduleに置き換えたいと思うでしょう。前者は、勾配の寄与がexp(-1)だけ減衰した後のサンプル数をパラメータとして取ります。

+0

ありがとうございましたNikos、あなたはそれを釘付け! –

関連する問題