2015-12-29 11 views
7

私は、レイヤー間の重みがリストに格納されている深いニューラルネットワークを持っています。テンソルフローのテンソルのリストの合計

layers[j].weights私はコスト関数にリッジペナルティを含める必要があります。私は、 tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers))のようなもの、つまりすべての重みの二乗和を使用する必要があります。私はtensorflowでそれを行うことができますどのように

>>> avs.layers 
[<neural_network.Layer object at 0x10a4b2a90>, <neural_network.Layer object at 0x10ac85080>, <neural_network.Layer object at 0x10b0f3278>, <neural_network.Layer object at 0x10b0eacf8>, <neural_network.Layer object at 0x10b145588>, <neural_network.Layer object at 0x10b165048>, <neural_network.Layer object at 0x10b155ba8>] 
>>> 
>>> avs.layers[0].weights 
<tensorflow.python.ops.variables.Variable object at 0x10b026748> 
>>> 

特に重みは以下のように定義されていますか?

+0

私はあなたがそれらの重みから新しいテンソルを作成し、それをコスト方程式に使う必要があると思います。 – fabrizioM

答えて

16

テンソルのリストを合計する標準的な方法は、tf.add_n()演算を使用することです。テンソルのリスト(それぞれが同じサイズと形状を持つ)を取り、その合計を含む単一のテンソルを生成します。

あなたが持っている特定の問題については、それぞれlayers[j].weightsが異なるサイズを持つ可能性があると想定しています。したがって、各要素を合計する前にスカラに下げる必要があります。 tf.nn.l2_loss()機能自体を使用して:

weights = [layers[j].weights for j in range(self.n_layers)] 
losses = [tf.nn.l2_loss(w) for w in weights] 
total_loss = tf.add_n(losses) 

(TensorFlowがadd_nのそれぞれの値を維持するので、追加される値が大きい場合、それがより効率的tf.add()動作のシーケンスを計算するために見つけることができることに注意してくださいそれらの全てまでメモリに引数が計算されている。add OPSの鎖は、計算の一部が先に起こることを可能にする。)

0

tf.nn.l2_loss()関数は0寸法のテンソルを返します。

しかし、それを手動で各重量テンソルに適用する必要はないので、重量テンソルをリストに格納することは問題を解決するための1つの方法です(@mrryが指摘したように)。

むしろ、あなたが何ができるか、毎回のことを書き出すために必要よりも、これは次のようになりますあなたのケースでは、以下の機能に

def l2_loss_sum(list_o_tensors): 
    return tf.add_n([tf.nn.l2_loss(t) for t in list_o_tensors]) 

を使用している:暗黙のうちに、また

total_loss = l2_loss_sum([layers[j].weights for j in range(self.n_layers)]) 

tf.nn.l2_loss()値に二乗演算を適用するとともに、二乗された値に1/2を掛けることで、実際には第4累乗にウェイトを上げることになるtf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers))のようなものを使用しました。結果として、この損失期間の派生物は奇妙になります.1/2〜1はキャンセルされませんが(暗黙のうちにβが2倍になります)、ウェイトは3乗されます。

関連する問題