pytorch的踩坑记录(随时更新)

1.RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: balabala...

今天在尝试复现别人论文的过程中出现了以上错误,花了很长时间才解决,看到这篇文章(PyTorch 的 Autograd 链接:https://zhuanlan.zhihu.com/p/69294347)才解答了我的疑问

:在激活函数Relu和LeakyRelu中将参数inplace设置为True一般情况下并不会影响到反向传播,并且该操作还可以起到有效降低显存的作用

2.RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`

别人的博客上说这个错误可能是因为分类数的设定有问题,在仔细核对数据集之后,我发现数据集和label并没有错误,直到在pytorch forums中找到了解决方案,即显存不足,batchsize过大,将batchsize调小之后问题就迎刃而解了。

即该问题与cuda out of menmery(单词可能拼写错了)类似,都可通过降级batchsize解决

3.nn.MSE()和nn.CrossEntropyLoss()

MSE为均方损失函数,常用于回归问题,CEL(CrossEntropyLoss)为交叉熵损失函数,常用于分类问题。

这两者都要求predict和target的shape保持一致,由于我制作的label并没有进行onehot编码,在使用MSE作为损失函数的时候代码报错,而在使用CEL作为损失函数的时候代码正常运行,后来看文章得知CEL会自动将label转化为onehot编码的格式而MSE则不会,并且CEL中内置softmax操作,所以通常情况下在最后一层的全连接层不需要加上softmax操作,

4.nn.Module类ModuleList重复调用问题

import torch
import torch.nn as nn


class net1(nn.Module):
    def __init__(self):
        super(net1, self).__init__()
        self.conv1 = nn.Conv2d(3,64,3,1,1)
        self.conv2 = nn.Conv2d(64,64,3,1,1)

    def forward(self,x):
        x = self.conv1(x)
        x = self.conv2(x)
        return x


class net2(nn.Module):
    def __init__(self):
        super(net2, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, 3, 1, 1)
        self.conv2 = nn.Conv2d(64, 64, 3, 1, 1)

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv2(x)
        x = self.conv2(x)

        return x

sum1 = 0
model = net1()
for i in model.parameters():
    sum1 += i.numel()
print(model)
print(sum1)
sum2 = 0
model1 = net2()
for i in model1.parameters():
    sum2 += i.numel()

print(sum2)
print(model1)#输出为:
net1(
  (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
38720
38720
net2(
  (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)

 

也就是说一个模块是否可以在 forward 函数中被调用多次呢?答案当然是可以的,但是,被调用多次的模块,是使用同一组 parameters 的,也就是它们的参数是共享的,无论之后怎么更新。例子如下,虽然在 forward 中我们用了 self.conv1被调用了三次 ,但是它们只有一组参数。在笔者实现自己的一个idea的时候这个特性起到了关键的作用。因此,如果你不希望模型的多个操作的使用同一组参数,就不要在forward方法中对同一方法进行重复调用。而对于那些没有参数的操作,则可以重复调用,如最大池化,平均池化,不带参数的激活函数,这样可以在一定程度上减少代码量。

4.nn 与 nn.functional

  • nn.Xxx和nn.functional.xxx的实际功能是相同的,即nn.Conv2d和nn.functional.conv2d 都是进行卷积,nn.Dropout 和nn.functional.dropout都是进行dropout。 运行效率也是近乎相同。

nn.functional.xxx是函数接口,而nn.Xxx是nn.functional.xxx的类封装,并且nn.Xxx都继承于一个共同祖先nn.Module。这一点导致nn.Xxx除了具有nn.functional.xxx功能之外,内部附带了nn.Module相关的属性和方法,例如train(), eval(),load_state_dict, state_dict 等。 

两者的差别主要在于:

1调用方式不同:nn.Xxx 需要先实例化并传入参数,然后以函数调用的方式调用实例化的对象并传入输入数据。

2.nn.Xxx继承于nn.Module, 能够很好的与nn.Sequential结合使用, 而nn.functional.xxx无法与nn.Sequential结合使用。

3. nn.Xxx不需要你自己定义和管理weight;而nn.functional.xxx需要你自己定义weight,每次调用的时候都需要手动传入weight, 不利于代码复用,nn.XXX对于我们在构建需要网络有很大的便利性.如果在构建网络的过程中使用的全部是nn.functional.xxx,则在打印模型结构的时候,网络中的结构不会显示出来,但是网络依然是可以训练的,不过不利于模型结构的可视化,因此pytorch官方推荐:具有学习参数的(例如,conv2d, linear, batch_norm)采用nn.Xxx方式,没有学习参数的(例如,maxpool, loss func, activation func)等根据个人选择使用nn.functional.xxx或者nn.Xxx方式。笔者更喜欢使用nn.Xxx。

 

reference:

1.PyTorch 的 Autograd 链接:https://zhuanlan.zhihu.com/p/69294347

2.Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解 链接:https://zhuanlan.zhihu.com/p/98785902

3PyTorch 中,nn 与 nn.functional 有什么区别?链接:.https://www.zhihu.com/question/66782101/answer/579393790

4.PyTorch 中的 ModuleList 和 Sequential: 区别和使用场景  链接:https://zhuanlan.zhihu.com/p/64990232

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用以下命令来更新 PyTorch: ``` pip install --upgrade torch ``` 如果您使用的是 GPU 版本的 PyTorch,您需要使用以下命令来更新: ``` pip install --upgrade torch torchvision ``` 这将更新 PyTorch 和 torchvision 到最新版本。请注意,更新 PyTorch 可能需要更新 CUDA 和 cuDNN,因此请确保您的 GPU 驱动程序和 CUDA / cuDNN 版本与您的 PyTorch 版本兼容。如果您不确定,请查看 PyTorch 文档中的 CUDA 支持部分。 ### 回答2: 更新 PyTorch 可以通过以下步骤完成: 1. 首先,检查当前安装的 PyTorch 版本。你可以在 Python 交互环境中运行以下代码来获取版本信息: ```python import torch print(torch.__version__) ``` 2. 如果你的 PyTorch 版本较旧,可以使用 `pip` 命令来升级 PyTorch。在命令行中运行以下命令: ``` pip install --upgrade torch ``` 这将自动下载并安装最新版本的 PyTorch。 3. 如果你的系统上有多个 Python 版本安装,确保使用正确的 `pip` 命令。例如,如果你使用的是 Python3,应使用 `pip3` 命令: ``` pip3 install --upgrade torch ``` 4. 在安装权重需要使用的 GPU 或 CPU 上运行上述命令,以确保将适当的版本安装到正确的环境中。 5. 在安装期间,可能会要求其他依赖项进行更新或安装。按照命令行中的提示进行操作并保证依赖项的正确安装。 6. 安装完成后,再次运行第一步中的代码验证 PyTorch 版本是否已更新。 请注意,官方文档可能提供了更新 PyTorch 的特定指南和更详细的信息。你可以通过访问 PyTorch 官方网站或阅读相关文档获取更多指导。 ### 回答3: 更新 PyTorch 可以通过以下步骤进行: 1. 首先,确保你已经安装了适当的 Python 开发环境(如 Anaconda 或 Miniconda)。如果没有安装,请先安装适当的 Python 版本。 2. 打开终端(或命令提示符),输入以下命令来检查当前安装的 PyTorch 版本: ``` pip show torch ``` 3. 如果你已经安装了 PyTorch,可以使用以下命令来更新它: ``` pip install --upgrade torch ``` 4. 如果你想要安装特定版本的 PyTorch,可以使用以下命令: ``` pip install torch==<desired_version> ``` 5. 更新 PyTorch 还可能需要更新其它依赖项,比如 torchvision。可以使用以下命令来更新 torchvision: ``` pip install --upgrade torchvision ``` 6. 等待更新过程完成。这可能需要一些时间,具体取决于你的网络连接和系统性能。 7. 更新完成后,使用以下命令来验证 PyTorch 是否已成功更新: ``` pip show torch ``` 这些步骤可以在 Windows、Linux 和 macOS 等操作系统上进行。请注意,某些操作可能需要管理员权限才能执行。另外,记得在更新 PyTorch 之前备份你的工程项目,以防止可能出现的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值