[英]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.