Как использовать набор данных numpy в Pytorch Lightning

Я хочу создать набор данных, используя 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 and b as features и c как label or target variable.]

Теперь, как я могу передать набор данных в метод обучения и проверки?


person Opps_0    schedule 07.05.2021    source источник
comment
Я думаю, что вы не создаете экземпляр класса, в конце напишите: obj = DataModuleClass (), затем вызовите obj.prepare_data ()   -  person KnowledgeGainer    schedule 07.05.2021
comment
Спасибо, это работает. Теперь, если я хочу использовать a, and b в качестве функций, то как я могу сказать, что это 2 функции, а c - цель?   -  person Opps_0    schedule 07.05.2021
comment
Извините, я вас не понял, не могли бы вы объяснить, какие функции вы хотите выполнять с этими 3 переменными, a, b, c   -  person KnowledgeGainer    schedule 07.05.2021
comment
Я хочу использовать a and b в качестве функций для обучения модели и c в качестве целевой переменной. Я также преобразовал a, and b в тензор. Теперь мне нужно их объединить? Потому что мы можем передать 2 переменные, например SklearnDataModule(X, y), где X - это переменная всех функций, а y - цель.   -  person Opps_0    schedule 07.05.2021
comment
Видите ли, обучение в pytorch работает с тензорами, тогда как в приведенных выше данных создаются массивы numpy, поэтому я предлагаю вам пройти через руководство по обучению pytorch, которое может помочь вам в изучении основ pytorch и его работы. Вы можете увидеть это: todatascience.com/   -  person KnowledgeGainer    schedule 07.05.2021
comment
Большое спасибо. Надеюсь, я многому научусь из этого!   -  person Opps_0    schedule 07.05.2021


Ответы (3)


Вы можете получить данные из 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().

person 0Knowledge    schedule 08.05.2021

Этот код вернет вам метку y и a, b как 2 функции из 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
person KnowledgeGainer    schedule 07.05.2021

Просто надо вернуть тензоры факела

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()
person Prajot Kuvalekar    schedule 07.05.2021
comment
Спасибо. После подготовки набора данных мне также нужно передать их в методах train и validation. Скажем, у меня training_dataset = TensorDataset(self.x_train_tensor, self.y_train_tensor) в моем prepare_data(), и я хочу передать их в train_dataloader(). Как я могу это сделать? - person Opps_0; 07.05.2021
comment
Я отредактировал свой код на основе вашего ответа, но все же пытаюсь решить проблему. - person Opps_0; 07.05.2021