在 Keras 中使用 ImageDataGenerator 时如何定义依赖于输入的自定义成本函数?

2024-04-02

我想定义一个自定义成本函数

def custom_objective(y_true, y_pred):
    ....
    return L

这不仅取决于y_true and y_pred,但是在相应的某些特征上x产生的y_pred。我能想到的唯一方法是“隐藏”相关功能y_true, 以便y_true = [usual_y_true, relevant_x_features], 或类似的东西。

我在实现这个过程中遇到两个主要问题:

1)改变形状y_true意味着我需要垫y_pred加上一些垃圾,使它们的形状相同。我可以通过修改模型的最后一层来做到这一点

2)我像这样使用数据增强:

datagen = ImageDataGenerator(preprocessing_function=my_augmenter)

where my_augmenter()该函数还应该给我相关的x使用的功能custom_objective()多于。然而,训练与

model.fit_generator(datagen.flow(x_train, y_train, batch_size=1), ...)

似乎没有让我访问使用 计算的功能my_augmenter.

我想我可以隐藏增强中的功能x_train,立即将它们复制到我的模型设置中,然后将它们直接输入y_true或类似的东西,但肯定有更好的方法来做到这一点?


也许您可以创建一个由两部分组成的模型:

  • 内部模型:预测期望输出的原始模型
  • Outer model:
    • 将 y_true 数据作为输入
    • 将特征作为输入
    • 输出损失本身(而不是预测数据)

所以,假设您已经拥有originalModel定义的。让我们定义外部模型。

#this model has three inputs:
originalInputs = originalModel.input  
yTrueInputs = Input(shape_of_y_train)
featureInputs = Input(shape_of_features)

#the original outputs will become an input for a custom loss layer
originalOutputs = originalModel.output

#this layer contains our custom loss
loss = Lambda(innerLoss)([originalOutputs, yTrueInputs, featureInputs])

#outer model
outerModel = Model([originalInputs, yTrueInputs, featureInputs], loss)

现在,我们自定义的内部损失:

def innerLoss(x):
    y_pred = x[0] 
    y_true = x[1]
    features = x[2] 

    .... calculate and return loss here .... 

现在,对于这个“内部”已经包含自定义损失的模型,我们实际上并不想要最终损失函数,但由于 keras 需要它,我们将使用最终损失作为return y_pred:

def finalLoss(true,pred):
    return pred

这将使我们能够训练通过一个假人y_true.


但当然,我们还需要一个自定义生成器,否则我们无法获得这些功能。

考虑一下你已经拥有了originalGenerator =datagen.flow(x_train, y_train, batch_size=1)定义:

def customGenerator(originalGenerator):

    while True: #keras needs infinite generators
        x, y = next(originalGenerator)

        features = ____extract features here____(x)

        yield (x,y,features), y 
            #the last y will be a dummy output, necessary but not used

如果您想要随机化批次顺序并使用多重处理的额外功能,您还可以实现class CustomGenerator(keras.utils.Sequence)遵循相同的逻辑。这帮助页面 https://keras.io/utils/显示如何。

因此,让我们编译并训练外部模型(这也会训练内部模型,以便您稍后可以使用它进行预测):

outerModel.compile(optimizer=..., loss=finalLoss)
outerModel.fit_generator(customGenerator(originalGenerator), batchesInOriginalGenerator, 
                         epochs=...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Keras 中使用 ImageDataGenerator 时如何定义依赖于输入的自定义成本函数? 的相关文章

随机推荐