标签: pytorch

在 Pytorch 中注册模型参数的正确方法

我尝试在 Pytorch 中定义一个简单的模型。该模型计算高斯分布的负对数概率:

import torch
import torch.nn as nn

class GaussianModel(nn.Module):

    def __init__(self):
        super(GaussianModel, self).__init__()

        self.register_parameter('mean', nn.Parameter(torch.zeros(1),
                                                     requires_grad=True))
        
        self.pdf = torch.distributions.Normal(self.state_dict()['mean'],
                                              torch.tensor([1.0]))
    def forward(self, x):
        return -self.pdf.log_prob(x)

model = GaussianModel()
Run Code Online (Sandbox Code Playgroud)

然后我尝试优化mean参数:

optimizer = torch.optim.SGD(model.parameters(), lr=0.002)
for _ in range(5):
  optimizer.zero_grad()
  nll = model(torch.tensor([3.0], requires_grad=True))
  nll.backward()
  optimizer.step()
  print('mean : ', model.state_dict()['mean'],
                 ' - Negative Loglikelihood : ', nll.item())
Run Code Online (Sandbox Code Playgroud)

但看起来梯度为零并且mean没有改变:

mean :  tensor([0.])  - Negative Loglikelihood :  5.418938636779785
mean :  tensor([0.])  - Negative Loglikelihood :  5.418938636779785
mean : …
Run Code Online (Sandbox Code Playgroud)

python pytorch

7
推荐指数
1
解决办法
1万
查看次数

pytorch 张量步幅 - 它是如何工作的

PyTorch 似乎没有tensor.stride(). 有人可以确认我的理解吗?

我的问题有三个。

  1. Stride 用于访问存储中的元素。因此步幅大小将与张量的维度相同。正确的?

  2. 对于每个维度,stride 的相应元素表示沿着一维存储移动需要多少距离。正确的?

例如:

In [15]: x = torch.arange(1,25)

In [16]: x
Out[16]:
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18
, 19, 20, 21, 22, 23, 24])

In [17]: a = x.view(4,3,2)

In [18]: a
Out[18]:
tensor([[[ 1,  2],
         [ 3,  4],
         [ 5,  6]],

        [[ 7,  8],
         [ 9, 10],
         [11, 12]],

        [[13, 14],
         [15, 16],
         [17, 18]],

        [[19, 20], …
Run Code Online (Sandbox Code Playgroud)

numpy stride pytorch tensor

7
推荐指数
0
解决办法
2428
查看次数

在 PyTorch 中提取 CNN 的中间层输出

我正在使用一个Resnet18模型。

ResNet(
  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu): ReLU(inplace=True)
  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  (layer1): Sequential(
    (0): BasicBlock(
      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
    (1): BasicBlock(
      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn1): …
Run Code Online (Sandbox Code Playgroud)

python python-3.x deep-learning pytorch torchvision

7
推荐指数
1
解决办法
1万
查看次数

路径问题:NameError:名称“__file__”未定义

import os.path as osp
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch_geometric.datasets import MNISTSuperpixels
import torch_geometric.transforms as T
from torch_geometric.data import DataLoader
from torch_geometric.utils import normalized_cut
from torch_geometric.nn import (NNConv, graclus, max_pool, max_pool_x, global_mean_pool)

path = osp.join(osp.dirname(osp.realpath(__file__)), '..', 'data', 'MNIST')

transform = T.Cartesian(cat=False)
train_dataset = MNISTSuperpixels(path, True, transform=transform)
test_dataset = MNISTSuperpixels(path, False, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
d = train_dataset
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 MNISTSuperpixels 数据进行图卷积,但使用示例代码时遇到一些问题。大多数脚本都使用 path = osp.join(osp.dirname(osp.realpath(__file__)), '..', 'data', 'MNIST') 但是,它们给了我一个错误 …

python conv-neural-network pytorch

7
推荐指数
2
解决办法
1万
查看次数

在pytorch中重置神经网络的参数

我有一个具有以下结构的神经网络:

class myNetwork(nn.Module):
    def __init__(self):
        super(myNetwork, self).__init__()
        self.bigru = nn.GRU(input_size=2, hidden_size=100, batch_first=True, bidirectional=True)
        self.fc1 = nn.Linear(200, 32)
        torch.nn.init.xavier_uniform_(self.fc1.weight)
        self.fc2 = nn.Linear(32, 2)
        torch.nn.init.xavier_uniform_(self.fc2.weight)
Run Code Online (Sandbox Code Playgroud)

我需要通过重置神经网络的参数来将模型恢复到未学习的状态。nn.Linear我可以使用以下方法对图层执行此操作:

def reset_weights(self):
    torch.nn.init.xavier_uniform_(self.fc1.weight)
    torch.nn.init.xavier_uniform_(self.fc2.weight)
Run Code Online (Sandbox Code Playgroud)

但是,要重置图层的权重nn.GRU,我找不到任何此类片段。

我的问题是如何重置图层nn.GRU?重置网络的任何其他方法也可以。任何帮助表示赞赏。

neural-network python-3.x gated-recurrent-unit pytorch

7
推荐指数
1
解决办法
3万
查看次数

训练 opennmt 时出错 - 找不到 caffe2_detectron_ops.dll

我有火炬 1.6 和 python 3.8。训练 OpenNMT 时,会抛出以下错误 -

OSError: [WinError 126] 找不到指定的模块。加载“C:\Users\Girish\AppData\Local\Programs\Python\Python38\lib\sitepackages\torch\lib\caffe2_detectron_ops.dll”或其依赖项之一时出错。

我检查了该文件夹,该文件存在于该文件夹中。我尝试卸载 torch 并重新安装它,但没有帮助。

任何帮助将不胜感激。谢谢

pytorch opennmt

7
推荐指数
2
解决办法
1万
查看次数

PyTorch:如何检查训练期间某些权重是否没有改变?

如何检查 PyTorch 训练期间某些权重是否未更改?

据我了解,一种选择可以是在某些时期转储模型权重,并检查它们是否通过迭代权重进行更改,但也许有一些更简单的方法?

pytorch

7
推荐指数
1
解决办法
5636
查看次数

如何从 PyTorch 的 FashionMNIST 数据集中获取特定类?

FashionMNIST 数据集有 10 个不同的输出类别。如何获取仅包含特定类的数据集的子集?就我而言,我只想要运动鞋、套头衫、凉鞋和衬衫类别的图像(它们的类别分别为 7、2、5 和 6)。

\n

这就是我加载数据集的方式。

\n

train_dataset_full = torchvision.datasets.FashionMNIST(data_folder, train = True, download = True, transform = transforms.ToTensor())

\n

我\xe2\x80\x99ve遵循的方法如下。\n逐一迭代数据集,然后将返回的元组中的第一个元素(即类)与我所需的类进行比较。我\xe2\x80\x99m 卡在这里。如果返回的值为 true,我如何将此观察结果追加/添加到空数据集中?

\n
sneaker = 0\npullover = 0\nsandal = 0\nshirt = 0\nfor i in range(60000):\n    if train_dataset_full[i][1] == 7:\n        sneaker += 1\n    elif train_dataset_full[i][1] == 2:\n        pullover += 1\n    elif train_dataset_full[i][1] == 5:\n        sandal += 1\n    elif train_dataset_full[i][1] == 6:\n        shirt += 1\n
Run Code Online (Sandbox Code Playgroud)\n

现在,代替sneaker += 1pullover += 1sandal += 1 …

python pytorch

7
推荐指数
1
解决办法
7655
查看次数

将 ddp 后端与 PyTorch Lightning 结合使用时对整个验证集进行验证

我正在使用 PyTorch Lightning 训练图像分类模型,并在具有多个 GPU 的机器上运行,因此我使用推荐的分布式后端以获得最佳性能ddp(DataDistributedParallel)。这自然会分割数据集,因此每个 GPU 只能看到数据的一部分。

但是,对于验证,我想计算整个验证集(而不仅仅是一部分)的准确性等指标。我该怎么做呢?我在官方文档中找到了一些提示,但它们没有按预期工作或者让我感到困惑。所发生的情况validation_epoch_end称为每次验证数据的num_gpus次数。1/num_gpus我想汇总所有结果并只运行validation_epoch_end一次。

本节中,他们指出,当使用 dp/ddp2 时,您可以添加一个附加函数,如下所示

def validation_step(self, batch, batch_idx):
    loss, x, y, y_hat = self.step(batch)
    return {"val_loss": loss, 'y': y, 'y_hat': y_hat}

def validation_step_end(self, self, *args, **kwargs):
    # do something here, I'm not sure what, 
    # as it gets called in ddp directly after validation_step with the exact same values
    return args[0]
Run Code Online (Sandbox Code Playgroud)

然而,结果并没有被聚合,validation_epoch_end仍然被称为num_gpu时间。这种行为不适合吗ddp?还有其他方法可以实现这种聚合行为吗?

python parallel-processing distributed-computing pytorch pytorch-lightning

7
推荐指数
1
解决办法
4722
查看次数

CUDA 错误:在 Colab 上触发设备端断言

我正在尝试在启用 GPU 的情况下在 Google Colab 上初始化张量。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

t = torch.tensor([1,2], device=device)
Run Code Online (Sandbox Code Playgroud)

但我收到了这个奇怪的错误。
RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1

即使将该环境变量设置为 1 似乎也没有显示任何进一步的细节。
有人遇到过这个问题吗?

pytorch tensor google-colaboratory

7
推荐指数
3
解决办法
1万
查看次数