簡體   English   中英

使用 keras 的 L2 歸一化輸出

[英]L2 normalised output with keras

我想用帶有 Tensorflow 后端的 Keras 構建一個神經網絡,它輸出一個 L2 歸一化向量。 我嘗試了以下方法,但由於某種原因它沒有標准化輸出:

import keras.backend as K
input = Input(shape=input_shape)
...
dense7 = Dense(output_dim=3)(flatten6)
l2_norm = Lambda(lambda  x: K.l2_normalize(x,axis=1))(dense7)
return Model(input=input, output=l2_norm)

我發現了問題!

所以我使用 tensorflow 作為支持和 K.l2_normalize(x,axis) 調用 tf.nn.l2_normalize(x,dim,epsilon=1e-12,name=None)。 請注意,此方法有一個額外的參數 epsilon。 此方法如下所示:

with ops.name_scope(name, "l2_normalize", [x]) as name:
   x = ops.convert_to_tensor(x, name="x")
   square_sum = math_ops.reduce_sum(math_ops.square(x), dim, keep_dims=True)
   x_inv_norm = math_ops.rsqrt(math_ops.maximum(square_sum, epsilon))
return math_ops.mul(x, x_inv_norm, name=name)

因此,如果網絡的輸出包含低於 epsilon 的數字(默認設置為 1e-12),那么它沒有正確標准化,這就是我的情況。

您可以使用由 tensorflow.keras.backend.l2_normalize 調用的函數來設置 epsilon 值:

from tensorflow.python.ops import nn
nn.l2_normalize(x, axis=None, epsilon=1e-12) 

@thebeancounter 您可以定義自己的 L2 層。 例如支持遮罩:如果在 L2 歸一化之后有后續層,這取決於遮罩,您應該使用以下內容:

class L2Layer(tf.keras.layers.Layer):
    def __init__(self):
        super(L2Layer, self).__init__()
        self.supports_masking = True

    def call(self, inputs, mask=None):
        return K.l2_normalize(inputs, axis=2)

我認為您可以使用像這樣的最后一層:

tf.keras.layers.Lambda(lambda x: tf.math.l2_normalize(x, axis=1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM