如何在Pytorch Lightning中使用numpy数据集

如何在Pytorch Lightning中使用numpy数据集,numpy,machine-learning,pytorch-lightning,Numpy,Machine Learning,Pytorch Lightning,我想使用NumPy创建一个数据集,然后想训练和测试一个简单的模型,比如“线性或逻辑” 我正在努力学习Pytorch Lightning。我发现我们可以使用NumPy数据集,并且可以使用均匀分布。作为一个新来者,我还没有完全了解,我怎么能做到呢 我的代码如下 import numpy as np import pytorch_lightning as pl from torch.utils.data import random_split, DataLoader, TensorDataset

我想使用
NumPy
创建一个数据集,然后想训练和测试一个简单的模型,比如“线性或逻辑”

我正在努力学习
Pytorch Lightning
。我发现我们可以使用NumPy数据集,并且可以使用均匀分布。作为一个新来者,我还没有完全了解,我怎么能做到呢

我的代码如下

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和b作为特征
c
作为
标签或目标变量
]


现在,如何将数据集传递到“训练和验证方法”中?

此代码将返回标签y和a,b作为500个随机示例合并到X中的两个特征

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

只是你必须返回火炬张量

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()

您可以使用以下代码从
prepare\u 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\u split()

拆分数据集,我想您不是在创建类的实例,最后写:obj=DataModuleClass(),然后调用obj.prepare\u data(),谢谢它能工作。现在,如果我想使用
a和b
作为功能,那么我如何才能告诉方法这两个是功能,而
c
是目标?很抱歉,我没有理解你,你能解释一下你想用这三个变量a、b执行什么功能吗,cI希望使用
a和b
作为培训模型的功能,并使用
c
作为目标变量。我还将
a和b
转换为张量。现在,我必须合并它们吗?因为,我们可以传递2个变量,比如
sklearnadamodule(X,y)
,其中,
X
是所有特征变量,
y
是目标。请看,pytorch中的训练使用张量,而在上述数据中,numpy数组正在创建,因此,我建议您阅读Pytork培训指南,它可以帮助您学习Pytork及其工作的基础知识,您可以看到:谢谢。在准备数据集之后,我还需要在
训练
验证
方法中传递它们。比如说,我在我的
prepare\u data()
中有
training\u dataset=TensorDataset(self.x\u train\u tensor,self.y\u train\u tensor)
,我想把它们传递到
train\u dataloader()
。我该怎么做?我已经根据你的答案编辑了我的代码,但我仍在努力解决这个问题。