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

侠客

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

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

这不仅取决于y_truey_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)

在哪里my_augmenter()应该给我上面x使用的相关功能的功能custom_objective()但是,用

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

似乎无法让我访问使用计算的功能my_augmenter

我想我可以隐藏增强中的功能,x_train立即在模型设置中将其复制,然后直接将其输入y_true或类似的操作中,但是肯定有更好的方法吗?

丹尼尔·莫勒

也许您可以使用以下方法创建一个两部分模型:

  • 内部模型:可预测所需输出的原始模型
  • 外型:
    • 将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)遵循以下相同的逻辑。帮助页面显示了如何。

因此,让我们编译并训练外部模型(这也会训练内部模型,以便您以后可以将其用于预测):

outerModel.compile(optimizer=..., loss=finalLoss)
outerModel.fit_generator(customGenerator(originalGenerator), batchesInOriginalGenerator, 
                         epochs=...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

依赖于输入特征的 Keras 自定义损失函数

简洁的评估:如何在依赖于%>%管道的自定义函数中使用dplyr :: na_if作为可选参数

当修改依赖于索引时,如何使用镜头修改嵌套自定义数据类型的字段

如何使用PyFMI定义依赖于模拟FMU输出的输入函数?

木偶:使自定义功能依赖于资源

如何编写依赖于反应查询调用的自定义钩子

如何创建依赖于Spring Bean的自定义Spring PropertySource

如何正确编写依赖于值的自定义反应挂钩?

如何使 npm install 依赖于自定义位置并避免在 node_modules 中包装?

创建依赖于选项的自定义记录器和依赖于记录器的选项验证器时的循环依赖项异常

如何定义依赖于输入的某些修改的Shake规则

如何在pytorch中定义依赖于模型wrt输入的偏导数的损失函数?

如何使用附加的图像相关参数在 Keras 中创建自定义成本函数?

keras自定义ImageDataGenerator

自定义ImageDataGenerator keras

如何使用自定义版本的依赖项构建沙盒式阴谋项目,而不依赖于黑客(例如,从github签出)

朱莉娅:如何正确定义使用依赖于数字的类型的函数?

当自定义适配器的数据依赖于另一个类时,如何自动刷新其内容?

如何创建不依赖于ASP.NET Core中的声明的自定义Authorize属性?

将额外输入传递给 Keras Deep Network 以计算自定义成本函数

我可以有依赖于值的自定义Sequelize验证器吗?

Django Rest Framework 自定义只读字段依赖于相关模型

从旧模块中删除依赖于自定义字段的Django迁移

Interlocked.Exchange() 具有依赖于读取锁定变量的自定义条件

IDRIS-依赖于自定义数据类型的映射功能失败

自定义 UINavigationItem 类 - 标题依赖于 Active UIStoryboard

依赖于其他字段的 Spring 自定义验证器

Keras:无法在模型中使用自定义损失函数

在Keras中使用自定义损失函数时的批次大小问题