我已将 GitHub 存储库克隆到 google colab 中,并尝试使用 PyTorch 的 DataLoader 加载数据。
global gpu, device
if torch.cuda.is_available():
gpu = True
device = 'cuda:0'
torch.set_default_tensor_type('torch.cuda.FloatTensor')
print("Using GPU")
else:
gpu = False
device = 'cpu'
print("Using CPU")
data_transforms = transforms.Compose([
#transforms.Resize(224),
transforms.ToTensor(),
transforms.Normalize([0.3112, 0.2636, 0.2047], [0.2419, 0.1972, 0.1554])
])
train_path = '/content/convLSTM/code/data/train/'
val_path = '/content/convLSTM/code/data/val/'
test_path = '/content/convLSTM/code/data/test/'
train_data = datasets.ImageFolder(root=train_path, transform=data_transforms)
val_data = datasets.ImageFolder(root=val_path, transform=data_transforms)
test_data = datasets.ImageFolder(root=test_path, transform=data_transforms)
train_loader = torch.utils.data.DataLoader(
train_data,
batch_size=18,
num_workers=4,
shuffle=False,
pin_memory=True
)
val_loader = torch.utils.data.DataLoader(
val_data,
batch_size=18, …Run Code Online (Sandbox Code Playgroud) 我正在 Pytorch 中训练图像分类模型,并使用其默认数据加载器来加载我的训练数据。我有一个非常大的训练数据集,因此每个类通常有几千个样本图像。过去我已经用大约 20 万张图像训练过模型,没有出现任何问题。然而我发现,当图像总数超过一百万张时,Pytorch 数据加载器就会卡住。
\n\n我相信当我打电话时代码挂起datasets.ImageFolder(...)。当我按下 Ctrl-C 时,输出始终如下:
Traceback (most recent call last): \xe2\x94\x82\n File "main.py", line 412, in <module> \xe2\x94\x82\n main() \xe2\x94\x82\n File "main.py", line 122, in main \xe2\x94\x82\n run_training(args.group, args.num_classes) \xe2\x94\x82\n File "main.py", line 203, in run_training \xe2\x94\x82\n train_loader = create_dataloader(traindir, tfm.train_trans, shuffle=True) \xe2\x94\x82\n File "main.py", line 236, in create_dataloader \xe2\x94\x82\n dataset = datasets.ImageFolder(directory, trans) \xe2\x94\x82\n File "/home/username/.local/lib/python3.5/site-packages/torchvision/datasets/folder.py", line 209, in __init__ \xe2\x94\x82\n is_valid_file=is_valid_file) \xe2\x94\x82\n File "/home/username/.local/lib/python3.5/site-packages/torchvision/datasets/folder.py", line 94, in __init__ …Run Code Online (Sandbox Code Playgroud) classification computer-vision deep-learning pytorch dataloader
我有一个问题,如何从 pytorch 数据加载器获取批量迭代的总数?
以下是训练的常用代码
for i, batch in enumerate(dataloader):
Run Code Online (Sandbox Code Playgroud)
那么,有没有什么方法可以获取“for循环”的总迭代次数?
在我的 NLP 问题中,总迭代次数不同于 int(n_train_samples/batch_size)...
例如,如果我只截断训练数据 10,000 个样本并将批大小设置为 1024,那么在我的 NLP 问题中会发生 363 次迭代。
我想知道如何获得“for 循环”中的总迭代次数。
谢谢你。
我对 Pytorch 相当陌生(并且从未做过高级编码)。我正在尝试使用 d2l.ai 教科书学习深度学习的基础知识,但在理解数据加载器代码背后的逻辑时遇到困难。我阅读了torch.utils.data 文档,但不确定 DataLoader 类的用途,以及例如我应该将 torch.utils.data.TensorDataset 类与其结合使用时。例如,d2l定义了一个函数:
def load_array(data_arrays, batch_size, is_train=True):
"""Construct a PyTorch data iterator."""
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset, batch_size, shuffle=is_train)
Run Code Online (Sandbox Code Playgroud)
我认为这应该返回一个迭代不同批次的迭代。但是,我不明白 data.TensorDataset 部分的作用(似乎文档页面上列出了很多选项)。此外,文档还说有两种类型的数据集:可迭代数据集和地图样式数据集。在描述前一种类型时,它说
“这种类型的数据集特别适合随机读取成本昂贵甚至不可能的情况,并且批量大小取决于获取的数据。”
“随机读取成本昂贵或不可能”以及批量大小取决于获取的数据意味着什么?谁能举个例子吗?
如果有任何资源可以让像我这样的 CompSci 新手学习这些基础知识,我真的很感激!
非常感谢!
我了解 dataLoader 如何使用简单的键工作:
import DataLoader from 'dataloader';
import myService from './services/service';
export default () => new DataLoader((keys: any) => Promise.all(keys.map((key: string) => myService(key))));
Run Code Online (Sandbox Code Playgroud)
有使用复合键的好模式吗?
如果我需要使用纬度和经度之类的东西调用谷歌地图 api 怎么办?我的密钥需要是纬度和经度的独特组合,并且在调用我的服务时我需要拆分纬度和经度
const key = `${latitude}|${longitude}`;
Run Code Online (Sandbox Code Playgroud)
认为我可以使用映射来查找要根据键传递给我的服务的值,对于这样的用例是否有一个好的模式?
我正在使用 U-Net 并实现 2015 年(U-Net:用于生物医学的卷积网络\n图像分割)和 2019 年(U-Net \xe2\x80\x93 用于细胞计数、检测的深度学习)的论文中描述的加权技术,和形态测量)。在该技术中,存在方差 \xcf\x83 和权重 w_0。我希望,尤其是 \xcf\x83 成为一个可学习的参数,而不是猜测数据集之间哪个值最好。
\n我目前对此的看法是扩展 torch.utils.data.DataLoader ,其中新的init有一个额外的参数接受用户指定/可学习的参数。鉴于 torch.utils.data.DataLoader 的源代码,我不明白 DataLoader 在何处以及如何调用 DataSet 实例并因此传递这些参数。
\n代码方面,在 DataSet 定义中有该函数
\ndef __getitem__(self, index):\nRun Code Online (Sandbox Code Playgroud)\n我可以改变为
\ndef __getitem__(self, index, sigma):\nRun Code Online (Sandbox Code Playgroud)\n并利用更新后的、新学习的\xcf\x83。
\n我的问题是,在训练期间,我迭代训练数据集
\nfor epoch in range( checkpoint[ 'epoch'], num_epochs):\n....\n for ii, ( X, y, y_weight, fname) in enumerate( dataLoader[ phase]):\n …Run Code Online (Sandbox Code Playgroud) 这可能是一个简单的问题,但是如何查看这个标准数据加载器的内容:
from torchtext import datasets
import random
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)
train_data, valid_data = train_data.split(random_state = random.seed(SEED))
Run Code Online (Sandbox Code Playgroud)
我无法使用 .head() 并且:
print(test_data)
Run Code Online (Sandbox Code Playgroud)
只是给了我:
<torchtext.datasets.imdb.IMDB object at 0x7f0b42e8c240>
Run Code Online (Sandbox Code Playgroud)
我可能只是缺少 .values 或 [0] 或类似的东西......
我有一张图,由 4 个矩阵定义:(x节点特征)、y(节点标签)、edge_index(边列表)和edge_attr(边特征)。我想使用这个单一图形在 Pytorch Geometric 中创建一个数据集并执行节点级分类。由于某种原因,仅仅将这 4 个矩阵包装到一个对象中似乎data失败了。
我创建了一个包含属性的数据集:
Data(edge_attr=[3339730, 1], edge_index=[2, 3339730], x=[6911, 50000], y=[6911, 1])
Run Code Online (Sandbox Code Playgroud)
代表一个图。如果我尝试对这个图进行切片,例如:
train_dataset, test_dataset = dataset[:5000], dataset[5000:]
Run Code Online (Sandbox Code Playgroud)
我收到错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-feb278180c99> in <module>
3 # train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size])
4
----> 5 train_dataset, test_dataset = dataset[:5000], dataset[5000:]
6
7 # Create dataloader for training and test dataset.
~/anaconda3/envs/py38/lib/python3.8/site-packages/torch_geometric/data/data.py in __getitem__(self, key)
92 def __getitem__(self, key):
93 r"""Gets …Run Code Online (Sandbox Code Playgroud) 我正在尝试遍历初始化如下的 pytorch 数据加载器:
trainDL = torch.utils.data.DataLoader(X_train,batch_size=BATCH_SIZE,shuffle=True,**kwargs)
因此,我无法执行以下语句,因为我在“枚举”中收到 KeyError:
for batch_idx, (data, _) in enumerate(trainDL):
{stuff}
Run Code Online (Sandbox Code Playgroud)
有没有人知道发生了什么?
编辑:
我得到的错误是:
KeyError Traceback (most recent call last)
~/.local/share/virtualenvs/Pipenv-l_wD1rT4/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
2896 try:
-> 2897 return self._engine.get_loc(key)
2898 except KeyError:
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 40592
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
<ipython-input-63-95142e0748bb> in <module>
----> 1 for batch_idx, (data, _) …Run Code Online (Sandbox Code Playgroud) Pytorch Dataloader 的迭代顺序是否保证相同(在温和条件下)?
例如:
dataloader = DataLoader(my_dataset, batch_size=4,
shuffle=True, num_workers=4)
print("run 1")
for batch in dataloader:
print(batch["index"])
print("run 2")
for batch in dataloader:
print(batch["index"])
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试对其进行测试,但它似乎没有修复,两次运行的顺序相同。有没有办法使订单相同?谢谢
编辑:我也试过做
unlabeled_sampler = data.sampler.SubsetRandomSampler(unlabeled_indices)
unlabeled_dataloader = data.DataLoader(train_dataset,
sampler=unlabeled_sampler, batch_size=args.batch_size, drop_last=False)
Run Code Online (Sandbox Code Playgroud)
然后遍历数据加载器两次,但结果是相同的不确定性。
dataloader ×10
pytorch ×9
python ×4
for-loop ×1
graphql ×1
iterable ×1
javascript ×1
keyerror ×1
python-3.x ×1
torch ×1
typescript ×1