pytorch代码个人心得

本文详细解析PyTorch中交叉熵损失函数的工作原理,包括log_softmax和nll_loss的功能区别,以及如何在不使用softmax的情况下应用交叉熵损失。同时,介绍了torch.nn.functional和torch.nn.CrossEntropyLoss类的使用方法,以及在PyTorch中处理Variable和autograd求梯度的技巧。

#1

nn.crossentropyloss()类包含两步函数: log_softmax和nllloss,(log-likelihood loss), 后者没有log步骤。

如果loss只想要交叉熵,不要softmax步骤,可以在网络最后加上nn.softmax层,以及torch.log()函数进行输出,训练的loss使用nn.NLLLoss()类。

#2

torch.log()等运算不需要参提供参数,所以直接调用即可。

torch.nn.functional是函数,除了一般的输入输出,还需要输入计算所用的参数,所以不能直接调用。定义如下:

def cross_entropy(input, target, weight=None, size_average=None, ignore_index=-100,
                  reduce=None, reduction='elementwise_mean'):
    if size_average is not None or reduce is not None:
        reduction = _Reduction.legacy_get_string(size_average, reduce)
    return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)

 为了使用torch.nn.functional更加方便, 就有了类torch.nn.CrossEntropyLoss,这里init定义了需要的参数,在forward里调用torch.nn.functional, 这样就很好地解决了参数的保存问题,使得神经网络训练过程更加方便。

class CrossEntropyLoss(_WeightedLoss):
    def __init__(self, weight=None, size_average=None, ignore_index=-100,
                 reduce=None, reduction='elementwise_mean'):
        super(CrossEntropyLoss, self).__init__(weight, size_average, reduce, reduction)
        self.ignore_index = ignore_index

    def forward(self, input, target):
        return F.cross_entropy(input, target, weight=self.weight,
                               ignore_index=self.ignore_index, reduction=self.reduction)

#3

在版本3.0.1中,Variable最好作为一个整体来做处理,而不要拆分,否则容易影响到梯度的计算。

比如, 想对一个数组变量s的个别分量做倍乘等处理,可以单独设置一个和s一样尺寸的变量mask,初始化为1,把mask在s要处理的对应位置上设为倍乘倍率,然后点乘s*mask。这样做矩阵导数可以直接得到这一步对mask的导数为s。

 

#4

pytorch中的autograd求梯度方式不会保存中间量(如x)的梯度,只会保存类初始化定义的变量(如self.conv()参数)。

而hook函数可以记录中间的任意中间量,如CNN里面的feature map。 Grad_CAM里就是使用的这个函数。、

参见Pytorch中autograd以及hook函数详解

### 关于PyTorch复现论文代码的最佳实践 在学术研究和技术开发领域,复现一篇论文中的方法是一个重要的技能。以下是基于PyTorch框架复现论文代码的一些最佳实践和建议: #### 1. 明确目标并理解理论基础 在尝试复现之前,应全面掌握所涉及的模型架构及其应用场景。对于Transformer模型而言,需具备扎实的自然语言处理(NLP)基础知识以及对其起源和发展历程的理解[^1]。 #### 2. 阅读官方文档与社区资料 利用丰富的在线资源来加深对工具库的认识至关重要。例如,在准备阶段可以通过查阅PyTorch官方网站获取最新API说明;同时也可以参考其他开发者分享的经验帖或者教学视频作为辅助材料。 #### 3. 编写清晰结构化的程序代码 下面给出一段简单的数据加载示例,展示了如何使用Pandas配合PyTorch完成基本操作: ```python import pandas as pd from torch.utils.data import Dataset, DataLoader class CustomDataset(Dataset): def __init__(self, csv_file): self.data = pd.read_csv(csv_file) def __len__(self): return len(self.data) def __getitem__(self, idx): sample = { 'feature': self.data.iloc[idx][:-1].values.astype(float), 'label' : int(self.data.iloc[idx][-1]) } return sample dataset = CustomDataset('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') dataloader = DataLoader(dataset, batch_size=64, shuffle=True) for i_batch, sample_batched in enumerate(dataloader): print(i_batch, sample_batched['feature'].size(),sample_batched['label'].size()) ``` 此部分来源于先前展示过的dataframe读取实例,并扩展为了适配深度学习训练流程的形式[^2]。 #### 4. 测试每一步骤确保无误后再继续推进项目进度 当构建好初步版本之后,应该反复验证各个组件是否按照预期工作正常。只有确认当前环节完全正确以后才能放心地向下一层次迈进。 #### 5. 寻求反馈不断优化改进方案 积极参与开源贡献活动不仅能提升个人技术水平还能结识志同道合的朋友共同成长进步。如果遇到困难不妨求助于GitHub Issues区寻求帮助或是加入Slack频道与其他成员交流心得技巧等等方式均有助于加速解决问题效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值