我尝试在 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) PyTorch 似乎没有tensor.stride()
. 有人可以确认我的理解吗?
我的问题有三个。
Stride 用于访问存储中的元素。因此步幅大小将与张量的维度相同。正确的?
对于每个维度,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) 我正在使用一个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) 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')
但是,它们给了我一个错误 …
我有一个具有以下结构的神经网络:
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
?重置网络的任何其他方法也可以。任何帮助表示赞赏。
我有火炬 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 训练期间某些权重是否未更改?
据我了解,一种选择可以是在某些时期转储模型权重,并检查它们是否通过迭代权重进行更改,但也许有一些更简单的方法?
FashionMNIST 数据集有 10 个不同的输出类别。如何获取仅包含特定类的数据集的子集?就我而言,我只想要运动鞋、套头衫、凉鞋和衬衫类别的图像(它们的类别分别为 7、2、5 和 6)。
\n这就是我加载数据集的方式。
\ntrain_dataset_full = torchvision.datasets.FashionMNIST(data_folder, train = True, download = True, transform = transforms.ToTensor())
我\xe2\x80\x99ve遵循的方法如下。\n逐一迭代数据集,然后将返回的元组中的第一个元素(即类)与我所需的类进行比较。我\xe2\x80\x99m 卡在这里。如果返回的值为 true,我如何将此观察结果追加/添加到空数据集中?
\nsneaker = 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 += 1
、pullover += 1
、sandal += 1 …
我正在使用 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
我正在尝试在启用 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 似乎也没有显示任何进一步的细节。
有人遇到过这个问题吗?