簡體   English   中英

如何使用批量歸一化對所有軸進行歸一化?

[英]How to normalize all axis with batch normalization?

據我了解,對於tf.layers.batch_normalization ,我定義的軸是被標准化的軸。

簡單的說:

鑒於這些價值觀

a = [[0, 2], 
     [1, 4]]

形狀為 (2, 2),因此軸為 0 和 1。

對軸 1 進行歸一化意味着將軸 0 減少到其平均值和標准偏差,然后將這些值用於歸一化。

所以

bn = tf.layers.batch_normalization(a, axis=[1])

會有(幾乎)相同的結果

m, v = tf.nn.moments(a, axes=[0])
bn = (a - m) / tf.sqrt(v)

但是我將如何為所有軸做tf.layers.batch_normalization

使用之前的均值和標准差計算,這將很容易:

m, v = tf.nn.moments(a, axes=[0, 1])
bn = (a - m) / tf.sqrt(v)

但是如何通過批量歸一化來做到這一點呢?

bn = tf.layers.batch_normalization(a, axis=[???])

我嘗試了以下不起作用的方法:

  • axis = None : AttributeError: 'BatchNormalization' object has no attribute 'axis'
  • axis = []IndexError: list index out of range
  • axis = [0, 1] :所有結果均為零

不幸的是,我認為使用 tensorflow API 的batch_normalization層/函數是不可行的。

正如該函數的名稱所暗示的那樣,它旨在執行“批量”歸一化,因此預計它會在給定當前批次(通常為 0 維)的特征軸上進行歸一化。

這可以通過層歸一化來實現:

>>> data = tf.constant(np.arange(10).reshape(5, 2) * 10, dtype=tf.float32)
    layer = tf.keras.layers.LayerNormalization(axis=[0, 1])
    output = layer(data)
    print(output)

tf.Tensor(
[[-1.5666981  -1.2185429 ]
 [-0.8703878  -0.5222327 ]
 [-0.17407757  0.17407756]
 [ 0.52223265  0.8703878 ]
 [ 1.2185429   1.5666981 ]], shape=(5, 2), dtype=float32)

與批歸一化的不同之處在於,層歸一化將操作分別應用於批次中的每個單元。

如果你想對一個批次執行此操作,請使用批歸一化。 同樣,這可以通過將軸設置為列表來實現。

暫無
暫無

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

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