В следующем коде показан один способ, который работает, а другой — нет.
BatchNorm на оси = 0 не должен зависеть от размера партии, а если и зависит, то это должно быть явно указано в документах.
In [118]: tf.__version__
Out[118]: '2.0.0-beta1'
class M(tf.keras.models.Model):
import numpy as np
import tensorflow as tf
class M(tf.keras.Model):
def __init__(self, axis):
super().__init__()
self.layer = tf.keras.layers.BatchNormalization(axis=axis, scale=False, center=True, input_shape=(6,))
def call(self, x):
out = self.layer(x)
return out
def fails():
m = M(axis=0)
x = np.random.randn(3, 6).astype(np.float32)
print(m(x))
x = np.random.randn(2, 6).astype(np.float32)
print(m(x))
def ok():
m = M(axis=1)
x = np.random.randn(3, 6).astype(np.float32)
print(m(x))
x = np.random.randn(2, 6).astype(np.float32)
print(m(x))
РЕДАКТИРОВАТЬ:
Ось в аргументах — это не та ось, о которой вы думаете.
axis
должен быть осью признаков. Во многих случаях это будет -1. Если у вас есть свертка «сначала каналы», это будет 1. И т. Д. Предоставление оси пакета в качестве аргумента здесь имеет очень мало смысла. - person xdurch0   schedule 25.07.2019axis
, поэтому размер должен быть постоянным; это полностью ожидаемое поведение. - person xdurch0   schedule 25.07.2019