【问题标题】:VGG, perceptual loss in kerasVGG,keras 中的感知损失
【发布时间】:2017-10-10 10:15:56
【问题描述】:

我想知道是否可以将自定义模型添加到 keras 的损失函数中。例如:

def model_loss(y_true, y_pred):
    inp = Input(shape=(128, 128, 1))
    x = Dense(2)(inp)
    x = Flatten()(x)

    model = Model(inputs=[inp], outputs=[x])
    a = model(y_pred)
    b = model(y_true)

    # calculate MSE
    mse = K.mean(K.square(a - b))
    return mse

这是一个简化的示例。我实际上会在损失中使用 VGG 网络,所以只是想了解 keras 的机制。

【问题讨论】:

  • 你试过了吗?尝试听起来很简单。但我建议在损失函数之外创建模型。你的损失函数应该从a=model(y_pred)这一行开始。
  • 但是:你希望那个小模型和包含损失函数的模型一起训练吗?那我就不说了。
  • 不,这是一个冷冻模型。这是为了 VGG 损失

标签: python tensorflow keras deep-learning vgg-net


【解决方案1】:

通常的做法是将 VGG 附加到模型的末尾,在编译之前确保它的所有层都具有trainable=False

然后你重新计算你的 Y_train。

假设你有这些模型:

mainModel - the one you want to apply a loss function    
lossModel - the one that is part of the loss function you want   

创建一个将一个附加到另一个的新模型:

from keras.models import Model

lossOut = lossModel(mainModel.output) #you pass the output of one model to the other

fullModel = Model(mainModel.input,lossOut) #you create a model for training following a certain path in the graph. 

此模型的 mainModel 和 lossModel 的权重完全相同,训练此模型会影响其他模型。

在编译之前确保 lossModel 不可训练:

lossModel.trainable = False
for l in lossModel.layers:
    l.trainable = False

fullModel.compile(loss='mse',optimizer=....)

现在调整您的训练数据:

fullYTrain = lossModel.predict(originalYTrain)

最后进行训练:

fullModel.fit(xTrain, fullYTrain, ....)

【讨论】:

  • 谢谢。是的,我在其他项目中看到了这一点。为什么不能将其添加到loss_fn中的符号图中有什么原因吗?并直接对y_pred、y_true进行操作?
猜你喜欢
  • 2023-04-03
  • 2019-10-01
  • 2021-11-30
  • 2019-05-31
  • 1970-01-01
  • 2019-03-10
  • 2020-03-27
  • 2021-04-05
  • 1970-01-01
相关资源
最近更新 更多