首页 > 解决方案 > 如何构建这个自定进度的学习损失函数并在 keras 中使用它?

问题描述

我正在尝试在我的 keras 模型中实现自定进度学习 (SPL)。我专注于这项工作,其中自定进度学习也应用于深度学习模型,但实现是使用 pytorch 完成的。我在将以下 pythoch 代码转换为 keras 时遇到了一些麻烦。

创建损失函数

import torch
from torch import Tensor
import torch.nn as nn


class SPLLoss(nn.NLLLoss):
    def __init__(self, *args, n_samples=0, **kwargs):
        super(SPLLoss, self).__init__(*args, **kwargs)
        self.threshold = 0.1
        self.growing_factor = 1.3
        self.v = torch.zeros(n_samples).int()

    def forward(self, input: Tensor, target: Tensor, index: Tensor) -> Tensor:
        super_loss = nn.functional.nll_loss(input, target, reduction="none")
        v = self.spl_loss(super_loss)
        self.v[index] = v
        return (super_loss * v).mean()

    def increase_threshold(self):
        self.threshold *= self.growing_factor

    def spl_loss(self, super_loss):
        v = super_loss < self.threshold
        return v.int()

将损失函数应用于训练

import torch.optim as optim

from model import Model
from dataset import get_dataloader
from loss import SPLLoss


def train():
    model = Model(2, 2, 2, 0)
    dataloader = get_dataloader()
    criterion = SPLLoss(n_samples=len(dataloader.dataset))
    optimizer = optim.Adam(model.parameters())

    for epoch in range(10):
        for index, data, target in dataloader:
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target, index)
            loss.backward()
            optimizer.step()
        criterion.increase_threshold()
    return model 

1.我怎样才能相应地定义我的损失函数(SPL_loss)? 2.由于我正在使用此数据生成器加载数据,如何使用 model.fit() 并增加 keras 中火车之间的阈值?

标签: kerasdeep-learningpytorchloss-functiondata-generation

解决方案


推荐阅读