Возможно, вы могли бы просто иметь слой BatchNormalization
в начале вашей модели.
Однако во всех случаях вам необходимо, чтобы ваши производственные данные были в том же формате, что и данные обучения.
В качестве альтернативы, вместо передачи данных обучения, передайте только means
и stds
.
class StdLayer(tf.keras.layers.Layer):
def __init__(self, means, stds, trainable=False,**kwargs):
...
self.means_init = means
self.stds_init = stds
...
def build(self, input_shape):
self.means = self.add_weight(name='means',
shape=self.means_init.shape,
initializer='zeros',
trainable=True)
#if you put false here, they will never be trainable
self.stds = self.add_weight(name='stds',
shape=self.stds_init.shape,
initializer='ones',
trainable=True)
#if you put false here, they will never be trainable
keras.backend.set_value(self.means, self.means_init)
keras.backend.set_value(self.stds, self.stds)
self.built = True
def call(self, inputs):
...
def compute_output_shape(self, input_shape):
...
def get_config(self):
config = {
'means_init': self.means_init,
'stds_init': self.stds_init,
}
base_config = super(StdLayer, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
Если честно, я не уверен, можно ли передать массивы numpy в config
.
Вы можете использовать __init__(self, means=None, stds=None, ...
и поместить if
внутрь build
для set_values
. Найдите другой способ вычисления фигур в add_weight
, и вы сможете избавиться от config
переменных.