10

レイヤー間の重みがリストに格納されているディープ ニューラル ネットワークがあります。

layers[j].weightsコスト関数にリッジ ペナルティを含めたいと考えています。tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers))次に、すべての重みの二乗和などを使用する必要があり ます。

特に、重みは次のように定義されます。

>>> 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>
>>> 

テンソルフローでそれを行うにはどうすればよいですか?

4

2 に答える 2

23

テンソルのリストを合計する標準的な方法は、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 はすべての引数が計算されるまで各引数tf.add()の値をメモリに保持するため、一連の演算を計算する方が効率的であることに注意してください。演算のチェーン計算の一部をより早く行うことができます。)add_nadd

于 2015-12-29T22:25:05.580 に答える
1

この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 で乗算するため、tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers))実際に重みを 4 乗するようなものを使用した場合。結果として、この損失項の導関数は奇妙になります: 1/2 から 1 をキャンセルせず (ただし、暗黙的に β を 2 倍にすることになります)、重みは 3 乗になります。

于 2016-02-24T23:23:43.600 に答える