Div*_*oML 3 numpy pytorch pytorch-dataloader
我正在尝试使用 pytorch 在 GPU 上运行神经网络,并且我的数据有一些不寻常的形状,因此我使用 Dataset 和 DataLoader 来生成数据批次。我的代码在 CPU 上运行良好,但我对何时是将数据放到 GPU 上的正确时机有点困惑:
batch.to("cuda")DataLoader 生成的每个批次吗?__getitem()___方法中返回 numpy 数组的数据集,或者将 numpy 数组转换为 pytorch 张量并编写返回 pytorch 张量的数据集。一种方法优于另一种方法吗?让我澄清一件事。通过模型传递数据时,您的模型和数据(特定批次)必须位于同一设备上。要自动化您的代码以在 GPU 和非 GPU 环境中工作,您可以使用此行。
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
Run Code Online (Sandbox Code Playgroud)
因此,如果您希望使用 GPU 进行训练,则必须在训练之前将模型放在 GPU 上。就我个人而言,我更喜欢在创建模型对象时将模型加载到 GPU。[答案3]
model = MyModel().to(device)
Run Code Online (Sandbox Code Playgroud)
然后你还需要将数据放入 GPU 中。一个明显的选择是一次放置所有数据。但我建议反对。因为无论您的数据集有多小,通过一次将一批数据放入 GPU,而不是一次放入整个数据,您总是会获得更好的性能。我知道您在想,将每个批次从 CPU 转移到 GPU 都会有时间延迟。你是对的!
但是,一次放置一个批次将允许您使用更大的批次大小,并且与较小的批次大小和一次加载所有数据相比,较大的批次大小始终会在性能方面获胜。[答案1和2]
for x_data, y_data in train_dataloader:
x_data, y_data = x_data.to(device), y_data.to(device)
Run Code Online (Sandbox Code Playgroud)
最后,关于写入__getitem__,Numpy 数组到 PyTorch 张量将由数据加载器处理,以便您的getitem可以返回 Numpy 数组。但当我看到代码中显式编写的转换时,我感觉很好。它给我一种完整且易于理解的管道的感觉。[答案4]
| 归档时间: |
|
| 查看次数: |
4271 次 |
| 最近记录: |