我没有找到任何卸载和删除所有PyTorch依赖项的命令.甚至来自pytorch.org.
我安装了PyTorch
conda install pytorch torchvision cuda80 -c soumith
Run Code Online (Sandbox Code Playgroud) 我有一个网络,我想在一些数据集上训练(例如,说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模型移植到Keras.
在移植过程中,我陷入了LSTM层.
LSTM网络的Keras实现似乎有三种状态矩阵,而Pytorch实现有四种.
例如,对于具有hidden_layers = 64的双向LSTM,input_size = 512&output size = 128状态参数,如下所示
Keras LSTM的状态参数
[<tf.Variable 'bidirectional_1/forward_lstm_1/kernel:0' shape=(512, 256) dtype=float32_ref>,
<tf.Variable 'bidirectional_1/forward_lstm_1/recurrent_kernel:0' shape=(64, 256) dtype=float32_ref>,
<tf.Variable 'bidirectional_1/forward_lstm_1/bias:0' shape=(256,) dtype=float32_ref>,
<tf.Variable 'bidirectional_1/backward_lstm_1/kernel:0' shape=(512, 256) dtype=float32_ref>,
<tf.Variable 'bidirectional_1/backward_lstm_1/recurrent_kernel:0' shape=(64, 256) dtype=float32_ref>,
<tf.Variable 'bidirectional_1/backward_lstm_1/bias:0' shape=(256,) dtype=float32_ref>]
Run Code Online (Sandbox Code Playgroud)
PyTorch LSTM的状态参数
['rnn.0.rnn.weight_ih_l0', torch.Size([256, 512])],
['rnn.0.rnn.weight_hh_l0', torch.Size([256, 64])],
['rnn.0.rnn.bias_ih_l0', torch.Size([256])],
['rnn.0.rnn.bias_hh_l0', torch.Size([256])],
['rnn.0.rnn.weight_ih_l0_reverse', torch.Size([256, 512])],
['rnn.0.rnn.weight_hh_l0_reverse', torch.Size([256, 64])],
['rnn.0.rnn.bias_ih_l0_reverse', torch.Size([256])],
['rnn.0.rnn.bias_hh_l0_reverse', torch.Size([256])],
Run Code Online (Sandbox Code Playgroud)
我试着查看两个实现的代码,但不能理解太多.
有人可以帮我把PyTorch的4组状态参数转换成Keras的3组状态参数
我正在使用Colaboratory和Pytorch来运行使用不寻常数据集的GAN,该数据集当前存储在本地计算机上。为了访问这些文件,我连接了本地运行时(按照https://research.google.com/colaboratory/local-runtimes.html)。但是,Colaboratory现在现在运行时会使用我自己的 GPU,而以前的运行并没有。我知道这是因为当前运行速度要慢得多,因为它们使用的是我的GTX 1060 6GB而不是Colab的Tesla K80。
我用这个检查了
torch.cuda.get_device_name(0)
当我在本地连接时,它将返回“ GeForce GTX 1060 6G”。即使选择了“编辑”->“笔记本设置”->“硬件加速器”->“ GPU” ,情况也是如此。
但是,当我不在本地连接时,而是使用(默认)“连接到托管的运行时”选项时,
torch.cuda.get_device_name(0)
确实返回“ Tesla K80”。
我无法将数据集上传到云端硬盘,因为它是一个大型图像数据集,并且希望继续使用本地运行时。
如何同时使用本地运行时和Colab出色的Tesla K80?任何帮助将非常感激。
python machine-learning deep-learning pytorch google-colaboratory
我是Pytorch的新手,并不是CNN的专家.我已经用他们提供Tutorial Pytorch的教程做了一个成功的分类器,但我真的不明白我在加载数据时正在做什么.
他们为训练做了一些数据增加和规范化,但是当我尝试修改参数时,代码不起作用.
# Data augmentation and normalization for training
# Just normalization for validation
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}
Run Code Online (Sandbox Code Playgroud)
我是否在扩展我的训练数据集?我没有看到数据扩充.
为什么我修改transforms.RandomResizedCrop(224)的值,数据加载停止工作?
我是否还需要转换测试数据集?
我对他们所做的数据转换有点困惑.
我有TypeError: expected torch.LongTensor (got torch.cuda.FloatTensor)
.
我如何转换torch.cuda.FloatTensor
为torch.LongTensor
?
Traceback (most recent call last):
File "train_v2.py", line 110, in <module>
main()
File "train_v2.py", line 81, in main
model.update(batch)
File "/home/Desktop/squad_vteam/src/model.py", line 131, in update
loss_adv = self.adversarial_loss(batch, loss, self.network.lexicon_encoder.embedding.weight, y)
File "/home/Desktop/squad_vteam/src/model.py", line 94, in adversarial_loss
adv_embedding = torch.LongTensor(adv_embedding)
TypeError: expected torch.LongTensor (got torch.cuda.FloatTensor)
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) 我想实现一个无限循环的Dataset和DataLoader.这是我试过的:
class Infinite(Dataset):
def __len__(self):
return HPARAMS.batch_size
# return 1<<30 # This causes huge memory usage.
def __getitem__(self, idx):
"""Randomly generates one new example."""
return sample_func_to_be_parallelized()
infinite_loader = DataLoader(
dataset=Infinite(),
batch_size=HPARAMS.batch_size,
num_workers=16,
worker_init_fn=lambda worker_id: np.random.seed(worker_id),
)
while True:
for idx, data in enumerate(infinite_loader):
# forward + backward on "data"
Run Code Online (Sandbox Code Playgroud)
如您所见,这里的主要挑战是__len()__
方法.如果我在那里放一个足够大的数字,比如1 << 30,那么在火车循环的第一次迭代中,内存使用的症状就是JUMP TO 10 + GB.过了一会儿,工人们被杀,大概是因为OOM.
如果我在那里放一个小数字,如1或BATCH_SIZE,则会定期复制列车循环中的采样"数据".这不是我想要的,因为我希望在每次迭代时生成和训练新数据.
我猜测过多的内存使用的罪魁祸首是堆栈中的某个地方,一堆东西被缓存.随便看看Python方面的事情,我无法确定在哪里.
有人可以建议什么是我想要实现的最佳方式?(使用DataLoader的并行加载,同时保证每个加载的批次都是全新的.)
我正在与Pytorch进行CNN任务,但它不会学习并不能提高准确性。我与MNIST一起制作了一个版本,因此可以在此处发布。我只是在寻找为什么它不起作用的答案。该体系结构很好,我在Keras中实现了它,经过3个星期,我的准确率超过了92%。注意:我将MNIST重塑为60x60图片,因为这是我的“真实”问题中的图片。
import numpy as np
from PIL import Image
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import DataLoader
from torch.autograd import Variable
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
def resize(pics):
pictures = []
for image in pics:
image = Image.fromarray(image).resize((dim, dim))
image = np.array(image)
pictures.append(image)
return np.array(pictures)
dim = 60
x_train, x_test = resize(x_train), resize(x_test) # because my real problem is in 60x60
x_train = x_train.reshape(-1, 1, …
Run Code Online (Sandbox Code Playgroud)