我想在Keras中编写一个自定义层,该层可以修改网络的输入以及相应的输出标签。 可以修改输出标签吗?
我已经编写了可更改输入的自定义层。现在,我需要相应地修改网络的输出标签。我不知道该如何实现。
以下是我所拥有/想要的例子:
from keras import layers
import numpy as np
class MyLayer(layers.Layer):
def call(self, x):
a = np.random.randint(0, 5)
new_x = x + a
new_y = y + a # <-- how can I do this?
return new_x
在培训期间是否甚至可以修改输出标签?
预期结果如下:
X = [[1, 2, 3], [4, 5, 6]]
Y = [1, 2]
a
a = 2
X = [[3, 4, 5], [6, 7, 8]]
Y = [3, 4]
答案 0 :(得分:1)
简短的回答可能是“不,不容易-而且您可能还是不想这样做”。
更长的答案:
考虑培训期间会发生什么。过于简化,我们可以说我们做了一些模糊的事情:
y_pred = model(x_train)
loss = compute_loss(y_pred, y_train)
back_propagate_and_update_gradients_through_model(loss_operations)
然后,一旦我们训练了模型,就可以推断出像这样的东西
predictions = model(x_new)
请记住,我们无权访问任何标签!因此,该模型缠结任何标签实际上没有多大意义。
在预处理流水线中或在自定义损失函数中紧要关头做任何标签纠缠会更好(并且很常见):
def my_loss(y_true, y_pred):
y_pred_wrangled = ## do your wrangling here
return tf.keras.losses.{your_prefered_loss_fn}(y_true, y_pred_wrangled )