keras层的归一化输出

问题描述 投票:2回答:2

我想创建一个带有Tensorflow背景的Keras模型,该模型返回带有范数1的向量。为此,模型以下一层结束:

main_network = Lambda(lambda t: K.l2_normalize(t, axis=1))(x)

我还创建了一个测试,其中我只创建模型,并且在没有训练的情况下,我进行随机预测以检查输出是否具有规范1.但是测试失败:

AssertionError: 0.37070954 != 1 within 0.1 delta

因此Lambda层无法正常工作,因为它没有规范化输出。我为axis参数尝试了不同的值,并且对于所有可能的值,测试失败。但我错过了吗?

python keras neural-network
2个回答
2
投票

好的,我解决了这个问题。出于同样的原因,K.l2_normalize不适用于非常小的数字,所以我只是改变了这一行:

main_network = Lambda(lambda t: K.l2_normalize(1000*t, axis=1))(x)

现在测试工作正常!!


0
投票

L2 normalize公式是:

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

例如,对于输入[3, 1, 4, 3, 1][3/6, 1/6, 4/6, 3/6, 1/6] = 12/6,表示L2-normalize的输出不必是1。如果你需要将输出规范化为1的总和,你可能需要Softmax

这是一个例子,你可以检查softmax的输出是一个:

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([[1, 2, 3, 4, 5]], dtype=tf.float32))
n_layer = Lambda(lambda t: K.softmax(t, axis=-1))(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(n_layer.eval())
© www.soinside.com 2019 - 2024. All rights reserved.