pytorch自定义loss损失函数
自定义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损失函数相关推荐
- pytorch 区间loss 损失函数
pytorch 区间loss 损失函数 我们知道sigmoid可以把值转化为0-1之间. tanh函数可以把值转化到[-1,1]之间, 但是在回归时,希望梯度是均匀的,有么有别的方法呢? 答案是肯定的 ...
- Pytorch自定义Loss
Pytorch如何自定义Loss 设置空loss: loss=torch.tensor(0).float().to(outs[0].device) 这个可以试试: regression_losses. ...
- loss 加权_【转载】keras 自定义 loss损失函数, sample在loss上的加权 和 metric
首先辨析一下概念: 1. loss是整体网络进行优化的目标, 是需要参与到优化运算,更新权值W的过程的 2. metric只是作为评价网络表现的一种"指标", 比如accuracy ...
- Pytorch学习 - Task6 PyTorch常见的损失函数和优化器使用
Pytorch学习 - Task6 PyTorch常见的损失函数和优化器使用 官方参考链接 1. 损失函数 (1)BCELoss 二分类 计算公式 小例子: (2) BCEWithLogitsLoss ...
- R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型,配置自定义的损失函数评估函数并使用交叉验证训练xgboost模型
R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型,配置自定义的损失函数(loss function).评估函数(evaluation function) ...
- java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...
如今,深度学习模型处于持续的演进中,它们正变得庞大而复杂.研究者们通常通过组合现有的 TensorFlow 或 PyTorch 操作符来发现新的架构.然而,有时候,我们可能需要通过自定义的操作符来实现 ...
- Pytorch自定义数据集
简述 Pytorch自定义数据集方法,应该是用pytorch做算法的最基本的东西. 往往网络上给的demo都是基于torch自带的MNIST的相关类.所以,为了解决使用其他的数据集,在查阅了torch ...
- Pytorch自定义Dataset和DataLoader去除不存在和空的数据
Pytorch自定义Dataset和DataLoader去除不存在和空的数据 [源码GitHub地址]:https://github.com/PanJinquan/pytorch-learning-t ...
- 使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作
使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作 总共分为四步 构造一个my_dataset类,继承自torch.utils.data.Dataset 重写__getite ...
最新文章
- android发送短信
- Android之独孤口诀:之强大的“测试单元”
- VC菜菜鸟:基于CFree的HelloWorld程序
- Oracle常用批量操作
- DRAM 各项基本参数记录
- 一个应用程序多线程误用的分析
- Winform控件WebBrowser与JS脚本交互
- 搭建Windows Embedded Compact 7开发环境
- 【Python爬虫】Beautiful Soup库入门
- JAVA实现中点画线_Java 实现中点法画线
- OAF_文件系列9_实现OAF解析Excel并读取至数据库JXL
- MD5加密算法(C语言实现,已编译,亲试可用~)
- IBM WMB 使用方法
- 三星+android+u盘模式,三星安卓机,如何开启开发者模式,进行USB调试?
- 微信小程序实现路线规划demo
- 读遍装修书,我们帮你选出了最有用的10本
- python通信技术_一起学Python:网络通信过程
- ffmpeg-nvenc
- 关于flask入门教程-ajax+echarts实现大屏展示
- mysql数据库安装最详解
热门文章
- 汇编怎么从内存地址写入连续的数字_汇编语言 第一章 基础知识
- 生成core文件的步骤
- 计算机组成原理与汇编语言试题,中央电大计算机组成原理与汇编语言试题
- 检查是否禁止asp.net服务扩展_在 Kubernetes 环境下部署 OpenWhisk 服务
- 山东大学linux应用实验五,【Linux】山东大学Linux应用课程实验记录
- 求余运算转换为位运算
- UE3 体积感光束教程
- 如何在CentOS上创建Kubernetes集群
- JavaScript字符集编码与解码
- C++ 与 php 的交互 之----- C++ 异步获取 网页文字内容,异步获取 php 的 echo 值。...