Я хочу определить слой предварительной обработки сразу после моего входного слоя, то есть он будет использовать среднее значение и дисперсию масштабатора, которые были вычислены ранее, и применяет его к моим входам перед передачей их в плотную сеть.
Лямбда-слои не работают в моем случае, потому что я хочу сохранить модель, цель в том, что при применении к данным нет необходимости обрабатывать входные данные, поскольку это будет сделано на ранней стадии сети.
Использование K.variables для средних и переменных работает, но я бы хотел вместо этого использовать веса и установить trainable = False.Таким образом, они будут сохранены в весах сети, и мне не нужно каждый раз предоставлять их.
class PreprocessLayer(Layer):
"""
Defines a layer that applies the preprocessing from a scaler
Needed because lambda layers are too fragile to be saved in a model
"""
def __init__(self, batch_size, mean, var, **kwargs):
self.b = batch_size
self.m = mean
self.v = var
super(PreprocessLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.mean = self.add_weight(name='mean',
shape=(self.b,input_shape[1]),
initializer=tf.constant_initializer(self.m),
trainable=False)
self.var = self.add_weight(name='var',
shape=(self.b,input_shape[1]),
initializer=tf.constant_initializer(self.v),
trainable=False)
super(PreprocessLayer, self).build(input_shape) # Be sure to call this at the end
def call(self, x):
return (x-self.mean)/self.var
def compute_output_shape(self, input_shape):
return (input_shape[0],input_shape[1])
def get_config(self):
config = super(PreprocessLayer, self).get_config()
config['mean'] = self.m
config['var'] = self.v
return config
И я называю этот слой с
L0 = PreprocessLayer(batch_size=20,mean=scaler.mean_,var=scaler.scale_)(IN)
Проблемавозникает в
shape=(self.b,input_shape[1]),
, что дает мне ошибку (когда batch_size равен 20)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [32,15] vs. [20,15]
[[Node: preprocess_layer_1/sub = Sub[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_IN_0_0, preprocess_layer_1/mean/read)]]
Из того, что я понимаю, так как мои веса (среднее и переменное) должны иметь одинаковую формув качестве входных данных x первая ось создает проблемы, когда batch_size не является делителем размера обучения, поскольку во время обучения он будет иметь разные значения.Это приводит к сбою, потому что форма должна быть определена во время компиляции, и я не могу оставить ее пустой.
Есть ли способ получить динамическое значение для первого значения формы?Если нет, обойти эту проблему?