论文复现:nn.L1Loss()

本文介绍了PyTorch库中的L1Loss函数,它是计算预测值与真实值之间L1距离的常用工具,适用于减少异常值影响的回归任务。L1Loss的特点在于对异常值不敏感,与L2损失相比,对较大误差的权重更低。文章还展示了如何在PyTorch中实例化和使用L1Loss进行训练过程中的损失计算。
部署运行你感兴趣的模型镜像

nn.L1Loss() 是 PyTorch 中的一个损失函数,属于 torch.nn 模块的一部分。它计算预测值和真实值之间差的绝对值的平均值,也就是 L1 距离(或曼哈顿距离)。这个损失函数常用于回归任务,特别是当你希望减少异常值对总体损失的影响时。L1 损失的一个特点是它对异常值不那么敏感,因为它不像平方误差损失(L2 损失)那样对较大的误差值赋予更高的权重。

L1 损失的数学表达式是:

其中:

在 PyTorch 中使用 nn.L1Loss() 非常简单。首先,你需要实例化这个损失函数,然后在训练循环中调用它,将模型的预测输出和真实标签作为参数传入。例如:

import torch
import torch.nn as nn

# 假设 output 是模型的预测输出,target 是真实的标签
output = torch.randn(10, 2, requires_grad=True)
target = torch.randn(10, 2)

# 实例化 L1Loss 对象
criterion = nn.L1Loss()

# 计算损失
loss = criterion(output, target)

# 使用损失进行反向传播等
loss.backward()

 

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

# 0801new 模型搭建改用pytorch 0/3 固定随机数保证结果复现(注意0/3执行后单独重复执行1/3 2/3 3/3会导致结果无法固定/复现,每次执行前都要set_seed) import torch import numpy as np import random def set_seed(seed): # PyTorch torch.manual_seed(seed) torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) # 多GPU时需设置 # NumPy和Python随机库 np.random.seed(seed) random.seed(seed) # 启用确定性算法(可能降低性能) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False # 关闭自动优化 myseed = 1812189 set_seed(myseed) # 设置种子 # 0801new 模型搭建改用pytorch 1/3 import torch import torch.nn as nn input_len = len(aggregate_Xdata[0]) # 采用组合样本的输入 output_len = 1 EPOCHS = 50 # 版本1 和早期keras实现不同 class bpnet(nn.Module): def __init__(self, input_len: int, output_len: int): super().__init__() self.net = nn.Sequential( nn.Linear(input_len, 32), nn.ReLU(), nn.Linear(32, 16), nn.ReLU(), nn.Linear(16, output_len) ) def forward(self, x): return self.net(x) # # 版本2 更改参数初始化方式 # class bpnet(nn.Module): # def __init__(self, input_len, output_len): # super().__init__() # # 使用nn.Sequential构建网络结构 # self.net = nn.Sequential( # nn.Linear(input_len, 32), # nn.ReLU(), # nn.Linear(32, 16), # nn.ReLU(), # nn.Linear(16, output_len) # ) # self._init_weights() # 对齐Keras的glorot_uniform初始化 # def _init_weights(self): # for layer in self.net: # if isinstance(layer, nn.Linear): # nn.init.xavier_uniform_(layer.weight) # 对应Keras的glorot_uniform # nn.init.zeros_(layer.bias) # 偏置初始化为0 # def forward(self, x): # return self.net(x) # # 0804调试:加载.h5模型参数,模型不执行训练,把keras预训练的模型参数拿过来按对应位置放进去直接用; # from keras.models import load_model # keras_model = load_model('AIACSModel_5g.h5') # 或 model.load_weights('your_weights.h5') # weight = [] # model = bpnet(input_len, output_len) # state_dict = model.state_dict() # key = list(state_dict.keys()) # i = 0 # for layer in keras_model.layers: # print(layer.name, len(layer.get_weights())) # w, b =layer.get_weights() # # print(w.T) # # weight.append((w.T, b)) # state_dict[key[i]] = torch.from_numpy(w.T) # keras和pytorch权重存放方式有差异,需要转置; # state_dict[key[i+1]] = torch.from_numpy(b) # print(state_dict[key[i]]) # print(state_dict[key[i+1]]) # i+=2 # model.load_state_dict(state_dict) # 0801new 模型改用pytorch 2/3 from torch.utils.data import DataLoader, TensorDataset X_train = aggregate_Xdata # 不再沿用keras的拆分 Y_train = Ydata X_train = X_train.astype(np.float32) # 输入数据 Y_train = Y_train.astype(np.float32) # 标签数据 X_train_tensor = torch.from_numpy(X_train) Y_train_tensor = torch.from_numpy(Y_train) dataset_tensor = TensorDataset(X_train_tensor, Y_train_tensor) g = torch.Generator() g.manual_seed(myseed) train_loader = DataLoader(dataset_tensor, batch_size=8, shuffle=True, num_workers=0, generator=g) X_test=aggregate_X_verify Y_test=Y_verify X_test = X_test.astype(np.float32) # 输入数据 Y_test = Y_test.astype(np.float32) # 标签数据 X_test_tensor = torch.from_numpy(X_test) Y_test_tensor = torch.from_numpy(Y_test) val_dataset = TensorDataset(X_test_tensor, Y_test_tensor) val_loader = DataLoader(val_dataset, batch_size=8, num_workers=0) # 建立模型 model = bpnet(input_len, output_len) criterion =nn.L1Loss() optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01) model.train() training_loss = np.zeros(EPOCHS) testing_loss = np.zeros(EPOCHS) for epoch in range(EPOCHS): model.train() epoch_loss = 0.0 for data, target in train_loader: optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() epoch_loss += loss.item() * data.size(0) training_loss[epoch] = epoch_loss / len(train_loader.dataset) model.eval() # 切换评估模式 val_loss = 0.0 # for module in model.modules(): # if isinstance(module, torch.nn.BatchNorm1d) or isinstance(module, torch.nn.BatchNorm2d): # module.track_running_stats = False with torch.no_grad(): # 禁用梯度计算 for val_data, val_target in val_loader: val_output = model(val_data) v_loss = criterion(val_output, val_target) val_loss += v_loss.item() * val_data.size(0) # 记录验证损失(按样本数平均) testing_loss[epoch] = val_loss / len(val_loader.dataset) # print(f"Epoch {epoch+1}/{EPOCHS} | Train_Loss: {epoch_loss / len(train_loader.dataset):.4f}") print(f"Epoch {epoch+1}/{EPOCHS} | Train_Loss: {epoch_loss / len(train_loader.dataset):.4f}| Test_Loss: {val_loss / len(val_loader.dataset):.4f}") # for module in model.modules(): # if isinstance(module, torch.nn.BatchNorm1d) or isinstance(module, torch.nn.BatchNorm2d): # module.track_running_stats = True 具体分析这段代码实现的功能
最新发布
10-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值