首页app攻略全部损失和直接损失的区别 全部损失和部分损失判断标准

全部损失和直接损失的区别 全部损失和部分损失判断标准

圆圆2025-09-09 21:01:19次浏览条评论

处理不同形状批次的损失计算:加权平均损失方法

本文介绍了一种处理不同形状批次损失的加权平均方法。当数据训练集中批次的样本数量不一致时,直接平均损失会导致偏差。通过计算每个批次的加权平均损失,并根据批次大小进行加权,可以更准确地反映整体效果训练。以下将详细介绍该方法的实现。问题背景

在深度学习模型训练中,我们通常将数据集分散多个批次进行训练。然而,在某些情况下,例如处理变长序列数据时,其每个批次的样本可能具有不同的形状。如果直接计算所有批次损失的顺序,会导致损失计算不准确,因为样本数量较少的批次对最终损失的影响更大。解决方案:加权平均损失

为了解决上述问题,我们可以采用加权平均该方法的核心思想是:首先计算每个批次的平均损失,然后根据每个批次的样本数量对这些平均损失进行加权,最后计算加权平均损失作为最终的损失值。

具体步骤如下:计算每个批次的平均损失: 对于每个批次,计算所有样本损失的双手。计算每个批次的权重:每个批次的权重等于该批次的样本数量除最终总样本数量。计算加权平均损失:将每个批次的平均损失乘应答动画的权重,然后将所有加权后的损失相加,得到的加权平均损失。代码示例

以下是一个使用PyTorch实现加权平均损失的示例代码:啵啵其其

一键生成动漫视频,小白也能轻松做动漫。

116 查看详情 import torch# 模拟不同批次的损失losses_perbatch = [torch.randn(8, 1), torch.randn(4, 1), torch.randn(2, 1)]# 计算总样本数量total_samples = sum([len(batch) for batch inloss_perbatch])# 计算每个批次的加权平均损失weighted_mean_perbatch = torch.tensor([batch.sum() for batch inloss_perbatch]) /total_samples# 等价于:#weighted_mean_perbatch = torch.tensor([batch.mean() * len(batch)forbatchinloss_perbatch]) /total_samples#计算最终的加权平均损失final_weighted_loss = sum(weighted_mean_perbatch)print(fquot;最终加权平均损失: {final_weighted_loss}quot;)登录后复制

代码解释:losses_perbatch:一个包含多个批次损失的列表。每个批次损失是一个 PyTorch张量,形状表示该批次的样本数量。total_samples:总样本数量,计算所有批次的样本数量之和得到。weighted_mean_perbatch:一个包含每个批次加权平均损失的张量。每批次的加权平均损失等于该批次所有样本损失的总和除以总样本数量。final_weighted_loss:最终的加权平均损失,通过计算所有批次加权平均损失的总和得到其。

应用到训练函数

将上述训练加权平均损失计算方法应用到原始的函数中,需要修改损失计算部分:def Training(): model.train() train_mae = []progress = tqdm(train_dataloader, desc='Training') for batch_index,batch in enumerate(progress): x = batch['x'].to(device) x_lengths = batch['x_lengths'].to(device) y = batch['y'].to(device) y_type = batch['y_type'].to(device) y_valid_indices = batch['y_valid_indices'].to(device) # 零梯度 optimizationr.zero_grad() # 前向传递 y_first, y_second = model(x) Loss = [] batch_sizes = [] # 记录每个batch的有效样本数量 for j in range(len(x_lengths)):x_length = x_lengths[j].item() if y_type[j].item() == 0:predicted = y_first[j] else:predicted = y_second[j]actual = y[j] valid_mask = torch.zeros_like(predicted, dtype=torch.bool) valid_mask[:x_length] = 1 # 去掉-1的填充y Indexs_mask = y[j].ne(-1) valid_indices = y[j][indices_mask] valid_predicted = Predicted[valid_mask] valid_actual =actual[valid_mask] loss = mae_fn(valid_predicted, valid_actual, valid_indices) Loss.append(loss.sum()) # 存储loss的总和batch_sizes.append(len(valid_indices)) # 存储有效样本的数量 # 向后传递并更新total_samp

les_in_batch=sum(batch_sizes)weighted_losses=[loss/total_samples_in_batch*batch_size for loss,batch_size in zip(losses,batch_sizes)]loss=sum(weighted_losses)loss.backward()optimizer.step()train_mae.append(loss.detach().cpu().numpy())progress.set_description(fquot;mae: {loss.detach().cpu().numpy():.4f}quot; ) # Return theaverage MAEs for y type return ( np.mean(train_mae) )登录后复制

关键修改点:在循环中,我们计算每个样本的损失,并使用loss.sum()存储每个样本损失的总和。同时,使用batch_sizes列表记录每个样本中有效样本的数量。在逆向传播之前,计算每个样本的损失Total_samples_in_batch (总样本数),并计算加权损失weighted_losses。最终的损失 是所有加权损失的总和。注意事项确保在计算加权平均损失时,使用的样本数量是每个批次的有效样本数量,而不是批次的总样本数量。例如,如果批次中包含填充值,则应排除这些填充值。加权平均损失方法可以检查各种损失函数,例如均方表格(MSE)、交叉熵损失等。在某些情况下,可能需要对权重进行调整,以获得更好的训练效果。例如,可以根据每个批次的损失大小来调整权重。总结

加权平均损失是一种有效的处理不同形状批次损失的方法。通过根据批次大小对损失进行加权,可以更准确地反映整体训练效果,并因样本数量偏差造成偏差。在实际应用中,可以根据具体情况对权重进行调整,以获得更好的避免训练效果。

以上就是处理不同形状批次的损失计算:加权平均损失方法的详细内容,更多请关注乐哥常识网其他相关文章!相关标签: app ai 深度学习 red 循环 pytorch

处理不同形状批次的损
如何使用json文件 如何使用json
相关内容
发表评论

游客 回复需填写必要信息