VGG,在keras的感性损失

Wil*_*con 5 python deep-learning keras tensorflow vgg-net

我想知道是否可以在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
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ler 6

通常的做法是将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   
Run Code Online (Sandbox Code Playgroud)

创建一个彼此追加的新模型:

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. 
Run Code Online (Sandbox Code Playgroud)

此模型将具有与mainModel和lossModel完全相同的权重,并且训练此模型将影响其他模型.

确保在编译之前无法训练lossModel:

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

fullModel.compile(loss='mse',optimizer=....)
Run Code Online (Sandbox Code Playgroud)

现在调整您的数据进行培训:

fullYTrain = lossModel.predict(originalYTrain)
Run Code Online (Sandbox Code Playgroud)

最后进行培训:

fullModel.fit(xTrain, fullYTrain, ....)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。是的,我看到这是在其他项目中完成的。是否有理由不能将其添加到 loss_fn 中的符号图中?并直接对 y_pred, y_true 进行操作? (2认同)