keras层的归一化输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keras层的归一化输出相关的知识,希望对你有一定的参考价值。

我想创建一个带有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参数尝试了不同的值,并且对于所有可能的值,测试失败。但我错过了吗?

答案

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

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

现在测试工作正常!!

另一答案

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

以上是关于keras层的归一化输出的主要内容,如果未能解决你的问题,请参考以下文章

python中3D矩阵的归一化(LSTM/Keras输入)

MATLAB中神经网络建模中的归一化和非归一化

Matlab中可变范围[x,y]的归一化

几种常见的归一化方法

matlab程序的归一化问题

R中的归一化函数