2017-07-12 6 views
2

ネットワークにTensorBoardビジュアライゼーションを追加し、外側レイヤーだけが大きく変化することに気付きました。なぜネットワークの重みはあまり変わらないのですか?これは、特にオーバーレイヒストグラムに表示されます。テンソルボードウェイトヒストグラムは最後のレイヤーの表示変更のみ

ヒストグラム weight histogram 同じですが、オーバーレイビュー overlay

def neural_network_model(inputdata): 
    """The blueprint of the network and the tensorboard information 
     :param inputdata: the placeholder for the inputdata 
     :returns: the output of the network? 
      """ 
    W1 = tf.get_variable("W1", shape=[set.input, nodes_h1], 
         initializer=tf.contrib.layers.xavier_initializer()) 
    B1 = tf.get_variable("B1", shape=[nodes_h1], 
         initializer=tf.random_normal_initializer()) 
    layer1 = tf.matmul(inputdata, W1) 
    layer1_bias = tf.add(layer1, B1) 
    layer1_act = tf.nn.relu(layer1) 

    W2 = tf.get_variable("W2", shape=[nodes_h1, nodes_h2], 
         initializer=tf.contrib.layers.xavier_initializer()) 
    B2 = tf.get_variable("B2", shape=[nodes_h2], 
         initializer=tf.random_normal_initializer()) 
    layer2 = tf.matmul(layer1_act, W2) 
    layer2_bias = tf.add(layer2, B2) 
    layer2_act = tf.nn.relu(layer2) 

    W3 = tf.get_variable("W3", shape=[nodes_h2, nodes_h3], 
         initializer=tf.contrib.layers.xavier_initializer()) 
    B3 = tf.get_variable("B3", shape=[nodes_h3], 
         initializer=tf.random_normal_initializer()) 

    layer3 = tf.matmul(layer2_act, W3) 
    layer3_bias = tf.add(layer3, B3) 
    layer3_act = tf.nn.relu(layer3) 
    WO = tf.get_variable("WO", shape=[nodes_h3, set.output], 
         initializer=tf.contrib.layers.xavier_initializer()) 
    layerO = tf.matmul(layer3_act, WO) 

    with tf.name_scope('Layer1'): 
     tf.summary.histogram("weights", W1) 
     tf.summary.histogram("layer", layer1) 
     tf.summary.histogram("bias", layer1_bias) 
     tf.summary.histogram("activations", layer1_act) 
    with tf.name_scope('Layer2'): 
     tf.summary.histogram("weights", W2) 
     tf.summary.histogram("layer", layer2) 
     tf.summary.histogram("bias", layer2_bias) 
     tf.summary.histogram("activations", layer2_act) 
    with tf.name_scope('Layer3'): 
     tf.summary.histogram("weights", W3) 
     tf.summary.histogram("layer", layer3) 
     tf.summary.histogram("bias", layer3_bias) 
     tf.summary.histogram("activations", layer3_act) 
    with tf.name_scope('Output'): 
     tf.summary.histogram("weights", WO) 
     tf.summary.histogram("layer", layerO) 
    return layerO 

は私がトレーニングプロセスの理解私のモデルでは、体重はほとんどの画像で起こるどの調整を受けるべきであるということです。しかし、損失は行われます。私は10000エポックのためにネットワークを訓練したので、私は全体的にもう少し変化が予想されました。特に私は理解できない体重の変化の欠如。誰かがそれについて詳しく説明できますか?
enter image description here

+0

私は神経ネットで同様の問題を抱えており、損失の大半がバイアスによって消費されていることがわかりました。万が一結論に達しましたか? – mamafoku

答えて

0

私のニューラルネットワークのウェイトヒストグラムにも同様の問題がありました。 Reluは、隠れたレイヤーの消失勾配問題に対処していますが、学習率をチェックして、各変数の更新が小さすぎないようにする必要があります。これは、ゼロに近い更新を引き起こす可能性が高く、その結果、時間の経過とともにわずかな変化が生じます。

def replace_none_with_zero(tensor): 
    return[0 if i==None else i for i in tensor] 

with tf.name_scope('Gradients'): 
    gradient_for_variable_of_interest=replace_none_with_zero(
           tf.gradients(loss,[variable_of_interest])) 

そして勾配にtf.summary.histogramを呼び出すことによってtensorboardであなたのグラデーションをチェック:あなたは、単に次のコードを使用して、各レイヤーのグラデーションを確認することができます。

関連する問題