Keras层的输出归一化,使得输出之和为1。

3

我希望有一个像K.l2_normalize这样的函数,但是能够使输出结果的总和为1

L2标准化公式如下:

       x
---------------
sqrt(sum(x**2))

例如,对于输入 [3, 1, 4, 3, 1],输出为 [3/6, 1/6, 4/6, 3/6, 1/6],计算结果为 12/6 = 1/2。
但我想要的是:
    x 
---------------
   ||x||

例如,对于输入 [3, 1, 4, 3, 1],其输出为 [3/12, 1/12, 4/12, 3/12, 1/12]=12/12=1。
在Python中,我想得到这样的结果:
import tensorflow as tf
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.layers import Lambda

x = tf.keras.layers.Input(tensor=tf.constant([[3, 1, 4, 3, 1]], dtype=tf.float32))
n_layer = Lambda(lambda t: "somefunction" )(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(n_layer.eval())

---------输出结果--------

[[0.25 0.0833 0.3333 0.25 0.0833 ]]
1个回答

2
你需要的是“L1范数”,所以你需要将阶数设置为1。你可以通过tf.linalg.norm中的ord参数传递范数的阶数。请保留HTML标签。
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.layers import Lambda

x = tf.keras.layers.Input(tensor=tf.constant([[3, 1, 4, 3, 1]], dtype=tf.float32))
n_layer = Lambda(lambda t: tf.linalg.norm(t,ord=1) )(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(n_layer.eval())

输出:

12.0

谢谢你的回答。你几乎解决了我的问题。我只是用这一行代码简单地进行了更改:n_layer = Lambda(lambda t: t/tf.linalg.norm(t,ord=1) )(x) 然后就对了! - Li Deyang
@LiDeyang 很高兴能帮忙! - Sayandip Dutta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接