如何拦截层内输出并将其作为目标数据提供

How to intercept and feed intra-layer output as target data

有时我们需要通过 preprocessing 层对数据进行预处理。当您的模型是自动编码器时,这会成为问题,在这种情况下,输入既是 x 又是 y。

如果我错了请纠正我,也许还有其他解决方法,但对我来说很明显,如果真正的输入是 [1,2,3],我将其缩放为 0 和 1 : [0,0.5,1],那么模型应该根据 x=[0,0.5,1]y=[0,0.5,1] 而不是 x=[1,2,3] 来评估自动编码器。因此,如果我的模型是,例如:

[
  preprocess_1,
  preprocess_2,
  encode1,
  ...
  decode1
]

如何将 [preprocess_1, preprocess_2] 的输出作为 y 提供给我的模型?


一个明显的解决方案是在模型之前进行预处理(例如,在 tft 的 preprocessing_fn 中),但这也有缺点。例如,我猜想在模型之外执行此操作意味着您将无法充分利用模型可以访问的任何 GPU/accelerator。另一个原因是 preprocessing 包提供了更好的支持。在预处理层之外执行此操作意味着您必须自己编写一些代码。

您只需修改您的损失函数,以最小化预测和缩放输入之间的差异。

这可以使用 model.add_loss 来完成。

考虑虚拟重建任务,我们必须在其中重建此数据:

X = np.random.uniform(0,255, (300,10))

使用这个自动编码器:

inp = Input(shape=(10,))
prepocess_inp = Rescaling(scale=1./255)(inp)  # PREPROCESSING LAYER
x = Dense(64)(prepocess_inp)
x = Dense(16)(x)
x = Dense(64)(x)
out = Dense(10)(x)
model = Model(inputs=inp, outputs=out)

您必须以这种方式手动添加损失,以考虑对输入数据应用的预处理:

model.add_loss( tf.keras.losses.mean_absolute_error( prepocess_inp, out ) )
model.compile(optimizer='adam', loss=None)

训练照常计算:

model.fit(X, X, epochs=10, batch_size = 32)