【发布时间】:2020-12-06 06:37:01
【问题描述】:
我对如何使用自定义损失函数训练深度神经网络感兴趣。我看过有关堆栈溢出的帖子,但没有得到答复。我已经下载了 VGG16 并冻结了权重并添加了我自己的头。现在我想用自定义损失训练那个网络,我该怎么做?
【问题讨论】:
-
请提供您尝试过的一些代码示例,以便我们为您提供帮助。
标签: python tensorflow2.0
我对如何使用自定义损失函数训练深度神经网络感兴趣。我看过有关堆栈溢出的帖子,但没有得到答复。我已经下载了 VGG16 并冻结了权重并添加了我自己的头。现在我想用自定义损失训练那个网络,我该怎么做?
【问题讨论】:
标签: python tensorflow2.0
这是 PyTorch 中的自定义 RMSE 损失。我希望这能让您具体了解如何实现自定义损失函数。您必须创建一个继承 nn.Module 的类,定义初始化和前向传递。
class RMSELoss(nn.Module):
def __init__(self, eps=1e-9):
super().__init__()
self.mse = nn.MSELoss()
self.eps = eps
def forward(self,yhat,y):
loss = torch.sqrt(self.mse(yhat,y) + self.eps)
return loss
【讨论】:
您可以简单地定义一个具有两个输入参数(真值、预测值)的函数。然后,您可以通过自己的方法使用这些值计算损失。
这是编码示例:
def custom_loss( y_true , y_pred ):
tf.losses.mean_squared_error( y_true , y_pred )
我在这个例子中使用了来自 tf 后端的 mse。但是您可以在此处使用手动计算。 使用此损失函数编译您的模型。
model.compile(
optimizer=your_optimizer,
loss=custom_loss
)
您还可以定义自己的自定义指标在训练过程中进行判断。
def custom_metric( y_true , y_pred ):
return calculate_your_metric( y_true , y_pred )
最后,用它编译,
model.compile(
optimizer=your_optimizer,
loss=custom_loss,
metrics=[ custom_metric ]
)
【讨论】:
有几个示例和存储库展示了如何实现听起来像您所指的感知损失。当然,您可以根据您的问题将这些方法中的一些方法推广到不同的模型并从中学习。如果您这样做,我建议您写下它并分享。除了使用一些预训练的 vgg 模型之外,我没有看到很多示例,打破这种模式可能是一个不错的贡献!无论如何,您可能会发现这些其他答案很有用:
【讨论】: