标签: pytorch

获取pytorch数据集的子集

我有一个网络,我想在一些数据集上训练(例如,说CIFAR10).我可以通过创建数据加载器对象

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)
Run Code Online (Sandbox Code Playgroud)

我的问题如下:假设我想进行几次不同的训练迭代.假设我首先想要在奇数位置的所有图像上训练网络,然后在偶数位置的所有图像上训练网络,依此类推.为此,我需要能够访问这些图像.不幸的是,它似乎trainset不允许这种访问.也就是说,尝试做trainset[:1000]或更多一般trainset[mask]会抛出错误.

我可以做

trainset.train_data=trainset.train_data[mask]
trainset.train_labels=trainset.train_labels[mask]
Run Code Online (Sandbox Code Playgroud)

然后

trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                              shuffle=True, num_workers=2)
Run Code Online (Sandbox Code Playgroud)

但是,这将迫使我在每次迭代中创建完整数据集的新副本(因为我已经更改,trainset.train_data所以我需要重新定义trainset).有没有办法避免它?

理想情况下,我希望有一些"等同"的东西

trainloader = torch.utils.data.DataLoader(trainset[mask], batch_size=4,
                                              shuffle=True, num_workers=2)
Run Code Online (Sandbox Code Playgroud)

python machine-learning neural-network torch pytorch

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

pytorch冻结权重并更新param_groups

冻结pytorch中的砝码以进行param_groups设置。

因此,如果您想在训练期间冻结体重:

for param in child.parameters():
    param.requires_grad = False
Run Code Online (Sandbox Code Playgroud)

优化器也必须更新为不包括非梯度权重:

optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=opt.lr, amsgrad=True)
Run Code Online (Sandbox Code Playgroud)

如果要weight_decay对偏倚和权重使用不同的/学习率/这也允许不同的学习率:

param_groups = [{'params': model.module.bias_parameters(), 'weight_decay': args.bias_decay},
                {'params': model.module.weight_parameters(), 'weight_decay': args.weight_decay}]
Run Code Online (Sandbox Code Playgroud)

param_groups定义了一个dic 列表并将其传递SGD如下:

optimizer = torch.optim.Adam(param_groups, args.lr,
                                 betas=(args.momentum, args.beta))
Run Code Online (Sandbox Code Playgroud)

冻结单个砝码如何实现?在dic列表上运行filter或是否可以将张量单独添加到优化器?

python machine-learning computer-vision pytorch

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

PyTorch自定义损失功能

自定义损失函数应如何实施?使用以下代码会导致错误:

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
import numpy as np
import matplotlib.pyplot as plt
import torch.utils.data as data_utils
import torch.nn as nn
import torch.nn.functional as F

num_epochs = 20

x1 = np.array([0,0])
x2 = np.array([0,1])
x3 = np.array([1,0])
x4 = np.array([1,1])

num_epochs = 200

class cus2(torch.nn.Module):

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

    def forward(self, outputs, labels):
        # reshape labels to give a flat vector of length batch_size*seq_len
        labels = labels.view(-1)  

        # mask out 'PAD' tokens
        mask …
Run Code Online (Sandbox Code Playgroud)

python deep-learning pytorch

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

是否有pytorch方法来检查CPU的数量?

我可以用它torch.cuda.device_count()来检查 GPU 的数量。我想知道是否有等同于检查 CPU 数量的东西。

python neural-network deep-learning pytorch

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

具有 kernel_size=1 的 Conv1D 与线性层

我正在处理非常稀疏的向量作为输入。我开始使用简单的Linear(密集/完全连接的层)并且我的网络产生了非常好的结果(让我们在这里将准确度作为我的指标,95.8%)。

后来我尝试将 aConv1d与 akernel_size=1和 a一起使用MaxPool1d,这个网络的效果稍微好一些(96.4% 的准确率)。

问题:这两种实现有何不同?Conv1d一个单位kernel_size不应该和一个Linear层一样吗?

我试过多次运行,CNN 总是产生稍微好一点的结果。

python conv-neural-network pytorch

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

BucketIterator 抛出“Field”对象没有属性“vocab”

这不是一个新问题,我找到了没有任何解决方案的参考文献firstsecond。我是 PyTorch 的新手,AttributeError: 'Field' object has no attribute 'vocab'PyTorch使用torchtext.

继本书之后,Deep Learning with PyTorch我编写了与书中解释的相同的示例。

这是片段:

from torchtext import data
from torchtext import datasets
from torchtext.vocab import GloVe

TEXT = data.Field(lower=True, batch_first=True, fix_length=20)
LABEL = data.Field(sequential=False)
train, test = datasets.IMDB.splits(TEXT, LABEL)

print("train.fields:", train.fields)
print()
print(vars(train[0]))  # prints the object



TEXT.build_vocab(train, vectors=GloVe(name="6B", dim=300),
                 max_size=10000, min_freq=10)

# VOCABULARY
# print(TEXT.vocab.freqs)  # freq
# print(TEXT.vocab.vectors)  # vectors
# print(TEXT.vocab.stoi)  # Index

train_iter, test_iter …
Run Code Online (Sandbox Code Playgroud)

python iterator nlp pytorch torchtext

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

将 tensorDataset 或 Dataloader 传递给 skorch

我想使用 skorch 在 Pytorch 中应用交叉验证,所以我准备了我的模型和我的 tensorDataset,它返回(图像、标题和标题长度),所以它有 X 和 Y,所以我无法在方法中设置 Y

net.fit(dataset)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时出现错误:

ValueError: Stratified CV 需要明确传递一个合适的 y

这是我的代码的一部分:

start = time.time()
net = NeuralNetClassifier(
        decoder, criterion= nn.CrossEntropyLoss,
        max_epochs=args.epochs,
        lr=args.lr,
        optimizer=optim.SGD,
        device='cuda',  # uncomment this to train with CUDA
       )
net.fit(dataset, y=None)
end = time.time()
Run Code Online (Sandbox Code Playgroud)

machine-learning computer-vision deep-learning pytorch skorch

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

PyTorch LSTM 输入维度

我正在尝试使用 PyTorch LSTM 训练一个简单的 2 层神经网络,但在解释 PyTorch 文档时遇到问题。具体来说,我不太确定如何处理我的训练数据的形状。

我想要做的是通过小批量在一个非常大的数据集上训练我的网络,其中每个批次的长度为 100 个元素。每个数据元素将有 5 个特征。文档指出层的输入应该是形状(seq_len、batch_size、input_size)。我应该如何塑造输入?

我一直在关注这篇文章:https : //discuss.pytorch.org/t/understanding-lstm-input/31110/3,如果我正确解释了这一点,每个小批量应该是形状 (100, 100, 5 )。但在这种情况下,seq_len 和 batch_size 有什么区别?另外,这是否意味着输入 LSTM 层的第一层应该有 5 个单元?

谢谢!

python machine-learning lstm pytorch

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

Pytorch 中的批量矩阵乘法 - 与输出维度的处理相混淆

我有两个数组:

A
B
Run Code Online (Sandbox Code Playgroud)

数组A包含一批 RGB 图像,形状为:

[batch, Width, Height, 3]
Run Code Online (Sandbox Code Playgroud)

而 ArrayB包含对图像进行“类转换”操作所需的系数,其形状为:

[batch, 4, 4, 3]
Run Code Online (Sandbox Code Playgroud)

简单来说,对单个图像的运算是乘法,输出环境图(normalMap * Coefficients)。

我想要的输出应该保持形状:

[batch, Width, Height, 3]
Run Code Online (Sandbox Code Playgroud)

我尝试使用torch.bmm但失败了。这有可能吗?

python vectorization batch-processing matrix-multiplication pytorch

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

torch.cat 但创造了一个新的维度

我想连接张量,不是沿着一个维度,而是通过创建一个新维度。

例如:

x = torch.randn(2, 3)
x.shape # (2, 3)

torch.cat([x,x,x,x], 0).shape # (8, 3)
# This concats along dim 0, not what I want

torch.cat([x,x,x,x], -1).shape # (2, 10)
# This concats along dim 1, not what I want

torch.cat([x[None, :, :],x[None, :, :],x[None, :, :],x[None, :, :]], 0).shape 
# => (4, 2, 3)
# This is what I want, but unwieldy
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法?

concatenation pytorch tensor

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