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层的归一化输出的主要内容,如果未能解决你的问题,请参考以下文章