自定义loss的方法有很多,但是在博主查资料的时候发现有挺多写法会有问题,靠谱一点的方法是把loss作为一个pytorch的模块,比如:

class CustomLoss(nn.Module): # 注意继承 nn.Moduledef __init__(self):super(CustomLoss, self).__init__()def forward(self, x, y):# .....这里写x与y的处理逻辑,即loss的计算方法return loss # 注意最后只能返回Tensor值,且带梯度,即 loss.requires_grad == True

示例代码

以一个pytorch求解线性回归的代码为例(参考:https://blog.csdn.net/weixin_35757704/article/details/117395205):

import torch
import torch.nn as nn
import numpy as np
import osos.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"def get_x_y():np.random.seed(0)x = np.random.randint(0, 50, 300)y_values = 2 * x + 21x = np.array(x, dtype=np.float32)y = np.array(y_values, dtype=np.float32)x = x.reshape(-1, 1)y = y.reshape(-1, 1)return x, yclass LinearRegressionModel(nn.Module):def __init__(self, input_dim, output_dim):super(LinearRegressionModel, self).__init__()self.linear = nn.Linear(input_dim, output_dim)  # 输入的个数,输出的个数def forward(self, x):out = self.linear(x)return outif __name__ == '__main__':input_dim = 1output_dim = 1x_train, y_train = get_x_y()model = LinearRegressionModel(input_dim, output_dim)epochs = 1000  # 迭代次数optimizer = torch.optim.SGD(model.parameters(), lr=0.001)model_loss = nn.MSELoss() # 使用MSE作为loss# 开始训练模型for epoch in range(epochs):epoch += 1# 注意转行成tensorinputs = torch.from_numpy(x_train)labels = torch.from_numpy(y_train)# 梯度要清零每一次迭代optimizer.zero_grad()# 前向传播outputs: torch.Tensor = model(inputs)# 计算损失loss = model_loss(outputs, labels)# 返向传播loss.backward()# 更新权重参数optimizer.step()if epoch % 50 == 0:print('epoch {}, loss {}'.format(epoch, loss.item()))

步骤1:添加自定义的类

我们就用自定义的写法来写与MSE相同的效果,MSE计算公式如下:

添加一个类

class CustomLoss(nn.Module):def __init__(self):super(CustomLoss, self).__init__()self.mse_loss = nn.MSELoss()def forward(self, x, y):mse_loss = torch.mean(torch.pow((x - y), 2)) # x与y相减后平方,求均值即为MSEreturn mse_loss

步骤2:修改使用的loss函数

只需要把原始代码中的:

model_loss = nn.MSELoss() # 使用MSE作为loss

改为:

model_loss = CustomLoss()  # 自定义loss

即可

完整代码

import torch
import torch.nn as nn
import numpy as np
import osos.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"def get_x_y():np.random.seed(0)x = np.random.randint(0, 50, 300)y_values = 2 * x + 21x = np.array(x, dtype=np.float32)y = np.array(y_values, dtype=np.float32)x = x.reshape(-1, 1)y = y.reshape(-1, 1)return x, yclass LinearRegressionModel(nn.Module):def __init__(self, input_dim, output_dim):super(LinearRegressionModel, self).__init__()self.linear = nn.Linear(input_dim, output_dim)  # 输入的个数,输出的个数def forward(self, x):out = self.linear(x)return outclass CustomLoss(nn.Module):def __init__(self):super(CustomLoss, self).__init__()self.mse_loss = nn.MSELoss()def forward(self, x, y):mse_loss = torch.mean(torch.pow((x - y), 2))return mse_lossif __name__ == '__main__':input_dim = 1output_dim = 1x_train, y_train = get_x_y()model = LinearRegressionModel(input_dim, output_dim)epochs = 1000  # 迭代次数optimizer = torch.optim.SGD(model.parameters(), lr=0.001)# model_loss = nn.MSELoss() # 使用MSE作为lossmodel_loss = CustomLoss()  # 自定义loss# 开始训练模型for epoch in range(epochs):epoch += 1# 注意转行成tensorinputs = torch.from_numpy(x_train)labels = torch.from_numpy(y_train)# 梯度要清零每一次迭代optimizer.zero_grad()# 前向传播outputs: torch.Tensor = model(inputs)# 计算损失loss = model_loss(outputs, labels)# 返向传播loss.backward()# 更新权重参数optimizer.step()if epoch % 50 == 0:print('epoch {}, loss {}'.format(epoch, loss.item()))

pytorch自定义loss损失函数相关推荐

  1. pytorch 区间loss 损失函数

    pytorch 区间loss 损失函数 我们知道sigmoid可以把值转化为0-1之间. tanh函数可以把值转化到[-1,1]之间, 但是在回归时,希望梯度是均匀的,有么有别的方法呢? 答案是肯定的 ...

  2. Pytorch自定义Loss

    Pytorch如何自定义Loss 设置空loss: loss=torch.tensor(0).float().to(outs[0].device) 这个可以试试: regression_losses. ...

  3. loss 加权_【转载】keras 自定义 loss损失函数, sample在loss上的加权 和 metric

    首先辨析一下概念: 1. loss是整体网络进行优化的目标, 是需要参与到优化运算,更新权值W的过程的 2. metric只是作为评价网络表现的一种"指标", 比如accuracy ...

  4. Pytorch学习 - Task6 PyTorch常见的损失函数和优化器使用

    Pytorch学习 - Task6 PyTorch常见的损失函数和优化器使用 官方参考链接 1. 损失函数 (1)BCELoss 二分类 计算公式 小例子: (2) BCEWithLogitsLoss ...

  5. R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型,配置自定义的损失函数评估函数并使用交叉验证训练xgboost模型

    R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型,配置自定义的损失函数(loss function).评估函数(evaluation function) ...

  6. java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...

    如今,深度学习模型处于持续的演进中,它们正变得庞大而复杂.研究者们通常通过组合现有的 TensorFlow 或 PyTorch 操作符来发现新的架构.然而,有时候,我们可能需要通过自定义的操作符来实现 ...

  7. Pytorch自定义数据集

    简述 Pytorch自定义数据集方法,应该是用pytorch做算法的最基本的东西. 往往网络上给的demo都是基于torch自带的MNIST的相关类.所以,为了解决使用其他的数据集,在查阅了torch ...

  8. Pytorch自定义Dataset和DataLoader去除不存在和空的数据

    Pytorch自定义Dataset和DataLoader去除不存在和空的数据 [源码GitHub地址]:https://github.com/PanJinquan/pytorch-learning-t ...

  9. 使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作

    使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作 总共分为四步 构造一个my_dataset类,继承自torch.utils.data.Dataset 重写__getite ...

最新文章

  1. android发送短信
  2. Android之独孤口诀:之强大的“测试单元”
  3. VC菜菜鸟:基于CFree的HelloWorld程序
  4. Oracle常用批量操作
  5. DRAM 各项基本参数记录
  6. 一个应用程序多线程误用的分析
  7. Winform控件WebBrowser与JS脚本交互
  8. 搭建Windows Embedded Compact 7开发环境
  9. 【Python爬虫】Beautiful Soup库入门
  10. JAVA实现中点画线_Java 实现中点法画线
  11. OAF_文件系列9_实现OAF解析Excel并读取至数据库JXL
  12. MD5加密算法(C语言实现,已编译,亲试可用~)
  13. IBM WMB 使用方法
  14. 三星+android+u盘模式,三星安卓机,如何开启开发者模式,进行USB调试?
  15. 微信小程序实现路线规划demo
  16. 读遍装修书,我们帮你选出了最有用的10本
  17. python通信技术_一起学Python:网络通信过程
  18. ffmpeg-nvenc
  19. 关于flask入门教程-ajax+echarts实现大屏展示
  20. mysql数据库安装最详解

热门文章

  1. 汇编怎么从内存地址写入连续的数字_汇编语言 第一章 基础知识
  2. 生成core文件的步骤
  3. 计算机组成原理与汇编语言试题,中央电大计算机组成原理与汇编语言试题
  4. 检查是否禁止asp.net服务扩展_在 Kubernetes 环境下部署 OpenWhisk 服务
  5. 山东大学linux应用实验五,【Linux】山东大学Linux应用课程实验记录
  6. 求余运算转换为位运算
  7. UE3 体积感光束教程
  8. 如何在CentOS上创建Kubernetes集群
  9. JavaScript字符集编码与解码
  10. C++ 与 php 的交互 之----- C++ 异步获取 网页文字内容,异步获取 php 的 echo 值。...