2017-05-29 3 views
0

私はtf.gradientを使って勾配を計算し、勾配を使って損失を渡して重みを更新しようとしています。重み行列の次元が大きいときは、勾配がゼロであることがわかります。これの理由は何でしょうか?大きな重量マトリックスの次元でテンソルフロー勾配の問題を解決する方法は?

コードにエラーはありません。私はより小さい重み行列と入力ベクトルサイズでゼロでない勾配を得ています。入力ベクトルのサイズが1 * 100、重量が100x50の場合、FP値は1 x 50になります。BPの場合、ipは1 x 50になり、重量は50 x 100になります。BPベクトルは1 x 100になります。

lossは、Forward(FP)値とBackward propagation(BP)値の差の合計です。 FP値は入力ベクトル(IP) - シグモイド(IP xウェイト)とBP値 - シグモイド(FP x weight.Transpose)です。

var_grad = tf.gradients(loss, [weight_matrix])[0] 
update = tf.subtract(weight_matrix,(tf.mul(var_grad,0.1))) 

伝播が損失を

for i in range(len(PopulatedList)): 
    branch = PopulatedList[i] 

    RC_FP = branch['RC_FP'] 
    RC_BP = branch['RC_BP'] 
    LC_FP = branch['RC_FP'] 
    LC_BP = branch['LC_BP'] 
    loss = tf.reduce_sum(tf.squared_difference(RC_FP_TF,RC_BP_TF),[0, 1]) + tf.reduce_sum(tf.squared_difference(LC_FP_TF,LC_BP_TF),[0, 1]) 

    out_error.append(loss) 

error = tf.reduce_sum(out_error) 
return error 

答えて

0

のように計算される。

w = tf.matmul(final,weight) 
sig = tf.sigmoid(w) 

あなたで一見何も間違ってはありません値フォワード

result,cost,gradient = sess.run([update,loss,var_grad], feed_dict={weight_matrix: weight_mat}) 

以下のように私はTFグラフを呼び出していますコードなのであなたが見ているのはおそらく、体重をどのように初期化するかの結果です。

関連する問題