Pyotorch自定义损失函数

简介: 深度学习笔记总结_GoAI的博客-CSDN博客PyTorch 笔记.常见的PyTorch损失函数 - 知乎Pytorch神经网络实战学习笔记_10 神经网络模块中的损失函数_LiBiGor的博客-CSDN博客

1.损失函数知识总结参考:


深度学习笔记总结_GoAI的博客-CSDN博客


PyTorch 笔记.常见的PyTorch损失函数 - 知乎


Pytorch神经网络实战学习笔记_10 神经网络模块中的损失函数_LiBiGor的博客-CSDN博客


2.自定义损失函数学习参考:


pytorch教程之nn.Module类详解——使用Module类来自定义模型


pytorch教程之nn.Module类详解——使用Module类来自定义网络层


pytorch教程之损失函数详解——多种定义损失函数的方法


Loss Function Library - Keras & PyTorch | Kaggle

Pytorch如何自定义损失函数(Loss Function)? - 知乎

pytorch系列12 --pytorch自定义损失函数custom loss function_墨流觞的博客-

自定义损失函数 - image processing

pytorch教程之损失函数详解——多种定义损失函数的方法

Pytorch自定义网络结构+读取自己数据+自定义Loss 全过程代码示例


3.定义原始模版:


使用torch.Tensor提供的接口实现:


继承nn.Module类

在__init__函数中定义所需要的超参数,在foward函数中定义loss的计算方法。

所有的数学操作使用tensor提供的math operation

返回的tensor是0-dim的scalar

有可能会用到nn.functional中的一些操作

Pytorch如何自定义损失函数(Loss Function)? - 知乎

#例子:
    class myLoss(nn.Module):
          def __init__(self,parameters)
             self.params = self.parameters
         def forward(self)
             loss = cal_loss(self.params)
                return loss
    #使用  
    criterion=myLoss()
    loss=criterion(……)


4.自定义函数方法


方法一:新建一个类

方案1:只定义loss函数的前向计算公式

在pytorch中定义了前向计算的公式,在训练时它会自动帮你计算反向传播。


class My_loss(nn.Module):
    def __init__(self):
        super().__init__()
    def forward(self, x, y):
        return torch.mean(torch.pow((x - y), 2))
#使用:
criterion = My_loss()
loss = criterion(outputs, targets)

方案2:自定义loss函数的forward和backward

from numpy.fft import rfft2, irfft2
class BadFFTFunction(Function):
    def forward(self, input):
        numpy_input = input.numpy()
        result = abs(rfft2(numpy_input))
        return input.new(result)
    def backward(self, grad_output):
        numpy_go = grad_output.numpy()
        result = irfft2(numpy_go)
        return grad_output.new(result)

69672a210a372e91d3494530909e2114_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3ODI1NDUx,size_16,color_FFFFFF,t_70.png

fbc19f15b43398399794b686a6429612_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3ODI1NDUx,size_16,color_FFFFFF,t_70.png

Pytorch完整训练流程


1.限定使用GPU的序号


import os
os.environ['CUDA_VISIBLE_DEVICES'] = '3'
os.system('echo $CUDA_VISIBLE_DEVICES')

2、导入相关库


import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as data
import torch.optim as optim
from torch.autograd import Variable
import numpy as np
from Encoding import load_feature

3、自定义网络


class TransientModel(nn.Module):
    def __init__(self):
        super(TransientModel,self).__init__()
        self.conv1 = nn.Conv2d(16, 8, kernel_size=1)
        self.conv2 = nn.Conv2d(8, 4, kernel_size=1)
        self.conv3 = nn.Conv2d(4, 2, kernel_size=1)
        self.conv4 = nn.Conv2d(2, 1, kernel_size=1)
    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = F.relu(self.conv3(x))
        x = F.relu(self.conv4(x))
        return x

4、自定义损失函数Loss


class MyLoss(nn.Module):
    def __init__(self):
        super(MyLoss, self).__init__()
        print '1'
    def forward(self, pred, truth):
        truth = torch.mean(truth,1)
        truth = truth.view(-1,2048)
        pred  = pred.view(-1,2048)
        return  torch.mean(torch.mean((pred-truth)**2,1),0)

5、自定义数据读取


class MyTrainData(data.Dataset):
    def __init__(self):
        self.video_path = '/data/FrameFeature/Penn/'
        self.video_file = '/data/FrameFeature/Penn_train.txt'
        fp = open(self.video_file,'r')
        lines = fp.readlines()
        fp.close()
        self.video_name = []
        for line in lines:
            self.video_name.append(line.strip().split(' ')[0])
    def __len__(self):
        return len(self.video_name)
    def __getitem__(self, index):
        data = load_feature(os.path.join(self.video_path,self.video_name[index]))
        data = np.expand_dims(data,2)
        return data

6、定义Train函数


def train(model, train_loader, myloss, optimizer, epoch):
    model.train()
    for batch_idx, train_data in enumerate(train_loader):
        train_data = Variable(train_data).cuda()
        optimizer.zero_grad()
        output = model(train_data)
        loss = myloss(output, train_data)
        loss.backward()
        optimizer.step()
        if batch_idx%100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tloss: {:.6f}'.format(
                epoch, batch_idx*len(train_data), len(train_loader.dataset),
                100.*batch_idx/len(train_loader), loss.data.cpu().numpy()[0]))

7.训练


if __name__=='__main__':
    # main()
    model = TransientModel().cuda()
    myloss= MyLoss()
    train_data = MyTrainData()
    train_loader = data.DataLoader(train_data,batch_size=1,shuffle=True,num_workers=1)
    optimizer = optim.SGD(model.parameters(),lr=0.001)
    for epoch in range(10):
        train(model, train_loader, myloss, optimizer, epoch)

8、结果展示

f2a787751cff510e857db856a14223ac_db46704193a64ff7b48b23bf75bce49d.png



完整代码

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '3'
os.system('echo $CUDA_VISIBLE_DEVICES')
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as data
import torch.optim as optim
from torch.autograd import Variable
import numpy as np
from Encoding import load_feature
class TransientModel(nn.Module):
    def __init__(self):
        super(TransientModel,self).__init__()
        self.conv1 = nn.Conv2d(16, 8, kernel_size=1)
        self.conv2 = nn.Conv2d(8, 4, kernel_size=1)
        self.conv3 = nn.Conv2d(4, 2, kernel_size=1)
        self.conv4 = nn.Conv2d(2, 1, kernel_size=1)
    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = F.relu(self.conv3(x))
        x = F.relu(self.conv4(x))
        return x
class MyLoss(nn.Module):
    def __init__(self):
        super(MyLoss, self).__init__()
        print '1'
    def forward(self, pred, truth):
        truth = torch.mean(truth,1)
        truth = truth.view(-1,2048)
        pred  = pred.view(-1,2048)
        return  torch.mean(torch.mean((pred-truth)**2,1),0)
class MyTrainData(data.Dataset):
    def __init__(self):
        self.video_path = '/data/FrameFeature/Penn/'
        self.video_file = '/data/FrameFeature/Penn_train.txt'
        fp = open(self.video_file,'r')
        lines = fp.readlines()
        fp.close()
        self.video_name = []
        for line in lines:
            self.video_name.append(line.strip().split(' ')[0])
    def __len__(self):
        return len(self.video_name)
    def __getitem__(self, index):
        data = load_feature(os.path.join(self.video_path,self.video_name[index]))
        data = np.expand_dims(data,2)
        return data
def train(model, train_loader, myloss, optimizer, epoch):
    model.train()
    for batch_idx, train_data in enumerate(train_loader):
        train_data = Variable(train_data).cuda()
        optimizer.zero_grad()
        output = model(train_data)
        loss = myloss(output, train_data)
        loss.backward()
        optimizer.step()
        if batch_idx%100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tloss: {:.6f}'.format(
                epoch, batch_idx*len(train_data), len(train_loader.dataset),
                100.*batch_idx/len(train_loader), loss.data.cpu().numpy()[0]))
def main():
    model = TransientModel().cuda()
    myloss= MyLoss()
    train_data = MyTrainData()
    train_loader = data.DataLoader(train_data,batch_size=1,shuffle=True,num_workers=1)
    optimizer = optim.SGD(model.parameters(),lr=0.001)
    for epoch in range(10):
        train(model, train_loader, myloss, optimizer, epoch)
if __name__=='__main__':
    main()


目录
相关文章
|
7月前
|
机器学习/深度学习 算法 Serverless
大模型开发:描述损失函数的作用以及一些常见的损失函数。
损失函数在机器学习中至关重要,用于衡量预测误差、优化模型、评估性能及选择模型。常见类型包括均方误差(MSE)、均方根误差(RMSE)、交叉熵损失(适用于分类)、绝对误差(MAE)、hinge损失(SVMs)、0-1损失、对数似然损失和Focal Loss(应对类别不平衡)。选择时要考虑模型性质、数据特征和优化需求。
492 3
WK
|
3月前
|
机器学习/深度学习 算法 PyTorch
如何计算损失函数关于参数的梯度
计算损失函数关于参数的梯度是深度学习优化的关键,涉及前向传播、损失计算、反向传播及参数更新等多个步骤。首先,输入数据经由模型各层前向传播生成预测结果;其次,利用损失函数评估预测与实际标签间的差距;再次,采用反向传播算法自输出层逐层向前计算梯度;过程中需考虑激活函数、输入数据及相邻层梯度影响。针对不同层类型,如线性层或非线性层(ReLU、Sigmoid),梯度计算方式各异。最终,借助梯度下降法或其他优化算法更新模型参数,直至满足特定停止条件。实际应用中还需解决梯度消失与爆炸问题,确保模型稳定训练。
WK
61 0
WK
|
3月前
|
机器学习/深度学习 算法
什么是损失函数和损失函数关于参数的梯度
损失函数是机器学习中评估模型预测与真实值差异的核心概念,差异越小表明预测越准确。常见损失函数包括均方误差(MSE)、交叉熵损失、Hinge Loss及对数损失等。通过计算损失函数关于模型参数的梯度,并采用梯度下降法或其变种(如SGD、Adam等),可以优化参数以最小化损失,提升模型性能。反向传播算法常用于神经网络中计算梯度。
WK
87 0
|
4月前
|
机器学习/深度学习 存储 数据可视化
2.8.4 加入正则化项,避免模型过拟合
这篇文章详细探讨了在深度学习中避免模型过拟合的方法,包括加入正则化项和使用暂退法(Dropout),并介绍了如何通过可视化工具如Matplotlib和VisualDL来分析模型训练过程,以便更好地理解和优化模型性能。
|
7月前
|
人工智能 物联网
PiSSA :将模型原始权重进行奇异值分解的一种新的微调方法
我们开始看4月的新论文了,这是来自北京大学人工智能研究所、北京大学智能科学与技术学院的研究人员发布的Principal Singular Values and Singular Vectors Adaptation(PiSSA)方法。
95 3
|
7月前
|
机器学习/深度学习 自然语言处理 算法
PyTorch实例:简单线性回归的训练和反向传播解析
PyTorch实例:简单线性回归的训练和反向传播解析
PyTorch实例:简单线性回归的训练和反向传播解析
|
7月前
|
定位技术
基于Amos路径分析的模型拟合参数详解
基于Amos路径分析的模型拟合参数详解
214 2
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch学习笔记(6):模型的权值初始化与损失函数
Pytorch学习笔记(6):模型的权值初始化与损失函数
322 0
Pytorch学习笔记(6):模型的权值初始化与损失函数
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch基础使用—自定义损失函数
pytorch基础使用—自定义损失函数
313 0
|
机器学习/深度学习 缓存 监控
Pytorch学习笔记-04 权值初始化与损失函数
Pytorch学习笔记-04 权值初始化与损失函数
131 0
Pytorch学习笔记-04 权值初始化与损失函数

相关实验场景

更多