我有一个网络,我想在一些数据集上训练(例如,说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) 冻结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或是否可以将张量单独添加到优化器?
自定义损失函数应如何实施?使用以下代码会导致错误:
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) 我可以用它torch.cuda.device_count()
来检查 GPU 的数量。我想知道是否有等同于检查 CPU 数量的东西。
我正在处理非常稀疏的向量作为输入。我开始使用简单的Linear
(密集/完全连接的层)并且我的网络产生了非常好的结果(让我们在这里将准确度作为我的指标,95.8%)。
后来我尝试将 aConv1d
与 akernel_size=1
和 a一起使用MaxPool1d
,这个网络的效果稍微好一些(96.4% 的准确率)。
问题:这两种实现有何不同?Conv1d
一个单位kernel_size
不应该和一个Linear
层一样吗?
我试过多次运行,CNN 总是产生稍微好一点的结果。
这不是一个新问题,我找到了没有任何解决方案的参考文献first和second。我是 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) 我想使用 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
我正在尝试使用 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 个单元?
谢谢!
我有两个数组:
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
我想连接张量,不是沿着一个维度,而是通过创建一个新维度。
例如:
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)
有没有更简单的方法?