如何在 Pytorch Lightning 中使用 numpy 数据集
Posted
技术标签:
【中文标题】如何在 Pytorch Lightning 中使用 numpy 数据集【英文标题】:How to use numpy dataset in Pytorch Lightning 【发布时间】:2021-07-29 21:49:53 【问题描述】:我想使用NumPy
制作一个数据集,然后想训练和测试一个简单的模型,例如“线性或逻辑”。
我正在努力学习Pytorch Lightning
。我找到了一个tutorial,我们可以使用 NumPy 数据集并且可以使用均匀分布here。作为一个新人,我没有完全理解,我该怎么做!
我的代码如下
import numpy as np
import pytorch_lightning as pl
from torch.utils.data import random_split, DataLoader, TensorDataset
import torch
from torch.autograd import Variable
from torchvision import transforms
np.random.seed(42)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
class DataModuleClass(pl.LightningDataModule):
def __init__(self):
super().__init__()
self.constant = 2
self.batch_size = 10
self.transform = transforms.Compose([
transforms.ToTensor()
])
def prepare_data(self):
a = np.random.uniform(0, 500, 500)
b = np.random.normal(0, self.constant, len(x))
c = a + b
X = np.transpose(np.array([a, b]))
idx = np.arange(500)
np.random.shuffle(idx)
# Uses foirst 400 random indices for training
train_idx = idx[:400]
# Uses the remaining indices for validation
val_idx = idx[400:]
# Generate train and validation dataset
x_train, y_train = X[train_idx], y[train_idx]
x_val, y_val = X[val_idx], y[val_idx]
# Converting numpy array to Tensor
self.x_train_tensor = torch.from_numpy(x_train).float().to(device)
self.y_train_tensor = torch.from_numpy(y_train).float().to(device)
self.x_val_tensor = torch.from_numpy(x_val).float().to(device)
self.y_val_tensor = torch.from_numpy(y_val).float().to(device)
training_dataset = TensorDataset(self.x_train_tensor, self.y_train_tensor)
validation_dataset = TensorDataset(self.x_val_tensor, self.y_val_tensor)
return training_dataset, validation_dataset
def train_dataloader(self):
training_dataloader = prepare_data() # Most probably this is wrong way!!!
return DataLoader(self.training_dataloader)
def val_dataloader(self):
validation_dataloader = prepare_data() # Most probably this is wrong way!!!
return DataLoader(self.validation_dataloader)
# def test_dataloader(self):
obj = DataModuleClass()
print(obj.prepare_data())
这部分是根据给出的答案完成的[这里,我想把a and b as features
和c
当作label or target variable
。]
现在,如何将数据集传递给`训练和验证方法?
【问题讨论】:
我认为你没有创建类的实例,最后写:obj = DataModuleClass(),然后调用 obj.prepare_data() 谢谢它有效。现在,如果我想使用a, and b
作为特征,那么我怎么能告诉飞蛾这两个是特征而c
是目标?
对不起,我没听明白,你能解释一下你想用这 3 个变量 a、b、c 执行什么功能
我想用a and b
作为训练模型的特征,c
作为目标变量。我还将a, and b
转换为张量。现在,我必须将它们结合起来吗?因为,我们可以传递 2 个变量,例如 SklearnDataModule(X, y)
,其中,X
是所有特征变量,y
是目标。
请看,pytorch 中的训练适用于张量,而在上面的数据中,numpy 数组正在创建,所以我建议您阅读 pytorch 培训指南,它可以帮助您学习 pytorch 的基础知识和它的工作,你可以看到这个:towardsdatascience.com/…
【参考方案1】:
您可以使用以下代码从prepare_data()
或setup()
获取数据。
def prepare_data(self):
a = np.random.uniform(0, 500, 500)
b = np.random.normal(0, self.constant, len(a))
c = a + b
X = np.transpose(np.array([a, b]))
# Converting numpy array to Tensor
self.x_train_tensor = torch.from_numpy(X).float().to(device)
self.y_train_tensor = torch.from_numpy(c).float().to(device)
training_dataset = TensorDataset(self.x_train_tensor, self.y_train_tensor)
self.training_dataset = training_dataset
def setup(self):
data = self.training_dataset
self.train_data, self.val_data = random_split(data, [400, 100])
def train_dataloader(self):
return DataLoader(self.train_data)
def val_dataloader(self):
return DataLoader(self.val_data)
您可以使用random_split()
拆分数据集。
【讨论】:
【参考方案2】:此代码将返回标签为 y 和 a,b 作为 500 个随机示例合并到 X 中的 2 个特征。
import torch
from torch.autograd import Variable
def prepare_data(self):
a = np.random.uniform(0, 500, 500) # random feature 1 x 500
b = np.random.normal(0, 2, len(a)) # random feature 2 x 500
X = np.transpose(np.array([a,b])) # Merging feature 1 and 2 x 500
y = np.random.randint(0,2,len(a)) # random Labels as 0 and 1
X = Variable(torch.from_numpy(X).float()) # Converting numpy array X to Torch tensor with auto_grad enabled
y = Variable(torch.from_numpy(y).float()) # Converting numpy array y to Torch tensor with auto_grad enabled
return X,y
【讨论】:
【参考方案3】:只是你必须返回 torch 张量
import numpy as np
import pytorch_lightning as pl
from torch.utils.data import random_split, DataLoader
class DataModuleClass(pl.LightningDataModule):
def __init__(self):
super().__init__()
self.constant = 2
self.batch_size = 20
self.transform = transforms.Compose([
transforms.ToTensor()
])
def prepare_data(self):
a = np.random.uniform(0, 500, 500)
b = np.random.normal(0, self.constant, len(a))
c = a + b
return torch.from_numpy(a).float(), torch.from_numpy(b).float(), torch.from_numpy(c).float()
【讨论】:
谢谢。准备好数据集后,我还需要在train
和 validation
方法中传递它们。比如说,我的prepare_data()
中有training_dataset = TensorDataset(self.x_train_tensor, self.y_train_tensor)
,我想将它们传递给train_dataloader()
。我该怎么做?
我已根据您的回答编辑了我的代码,但我仍在努力解决问题。以上是关于如何在 Pytorch Lightning 中使用 numpy 数据集的主要内容,如果未能解决你的问题,请参考以下文章
如何从Pytorch 到 Pytorch Lightning | 简要介绍
如何在 PyTorch Lightning 中编写多个训练设置
如何禁用 PyTorch-Lightning 记录器的日志记录?
如何在 PyTorch Lightning 中获得所有时期的逐步验证损失曲线