pytorch_lightning学习总结1

参考文献
https://coderzcolumn.com/tutorials/artificial-intelligence/pytorch-lightning-eliminate-training-loops

import pytorch_lightning as pl

print("PyTorch Lightning Version : {}".format(pl.__version__))
import torch

print("PyTorch Version : {}".format(torch.__version__))

在这里插入图片描述

from sklearn import datasets
from sklearn.model_selection import train_test_split
from torch.utils.data import Dataset

class DigitsDataset(Dataset):
    def __init__(self, train_or_test="train", feat_transform=torch.tensor, target_transform=torch.tensor):
        self.typ = train_or_test

        X, Y = datasets.load_digits(return_X_y=True)

        self.X_train, self.X_test, self.Y_train, self.Y_test = train_test_split(X, Y,
                                                                                train_size=0.8,
                                                                                stratify=Y,
                                                                                random_state=123)
        self.feat_transform = feat_transform
        self.target_transform = target_transform

    def __len__(self):
        return len(self.Y_train) if self.typ == "train" else len(self.Y_test)

    def __getitem__(self, idx):
        if self.typ == "train":
            x, y = self.X_train[idx], self.Y_train[idx]
        else:
            x, y = self.X_test[idx], self.Y_test[idx]

        return self.feat_transform(x), self.target_transform(y)
train_dataset = DigitsDataset("train")
test_dataset = DigitsDataset("test")
from torch.utils.data import DataLoader

train_loader = DataLoader(train_dataset, batch_size=32)
test_loader  = DataLoader(test_dataset,  batch_size=32)
for X_batch, Y_batch in train_loader:
    print(X_batch.shape, Y_batch.shape)
    break

for X_batch, Y_batch in test_loader:
    print(X_batch.shape, Y_batch.shape)
    break

在这里插入图片描述

from torch import nn
from torch.optim import Adam

class DigitsClassifier(pl.LightningModule):
    def __init__(self):
        super().__init__()
        self.model = nn.Sequential(
            nn.Linear(64,16),
            nn.ReLU(),

            nn.Linear(16,32),
            nn.ReLU(),

            nn.Linear(32,10),
            nn.Softmax(dim=-1),
        )

    def forward(self, X_batch):
        preds = self.model(X_batch)
        return preds
classifier = DigitsClassifier()

classifier

在这里插入图片描述

preds = classifier(torch.rand(50,64))

preds.shape

在这里插入图片描述

完整例子

from torch import nn
from torch.optim import Adam

class DigitsClassifier(pl.LightningModule):
    def __init__(self):
        super().__init__()
        self.model = nn.Sequential(
            nn.Linear(64,16),
            nn.ReLU(),

            nn.Linear(16,32),
            nn.ReLU(),

            nn.Linear(32,10),
            nn.Softmax(dim=-1),
        )

        self.crossentropy_loss = nn.CrossEntropyLoss()

    def forward(self, X_batch):
        preds = self.model(X_batch)
        return preds

    def training_step(self, batch, batch_idx):
        X_batch, Y_batch = batch
        preds = self.model(X_batch.float())

        loss_val = self.crossentropy_loss(preds, Y_batch.long())
        self.log("Train Loss : ", loss_val)

        return loss_val

    def validation_step(self, batch, batch_idx):
        X_batch, Y_batch = batch
        preds = self.model(X_batch.float())

        loss_val = self.crossentropy_loss(preds, Y_batch.long())
        self.log("Validation Loss : ", loss_val)

        return loss_val

    def test_step(self, batch, batch_idx):
        X_batch, Y_batch = batch
        preds = self.model(X_batch.float())

        loss_val = self.crossentropy_loss(preds, Y_batch.long())
        self.log("Test Loss : ", loss_val)

        return loss_val

    def predict_step(self, batch, batch_idx,dataloader_idx=0):
        X_batch, Y_batch = batch
        preds = self.model(X_batch.float())

        return preds

    def configure_optimizers(self):
        optimizer = Adam(self.model.parameters(), lr=1e-3)
        return optimizer
train_dataset = DigitsDataset("train")
test_dataset = DigitsDataset("test")
from torch.utils.data import DataLoader

train_loader = DataLoader(train_dataset, batch_size=64, num_workers=0)
test_loader  = DataLoader(test_dataset,  batch_size=64, num_workers=0)
classifier = DigitsClassifier()

#pl.seed_everything(42, workers=True)
trainer = pl.Trainer(max_epochs=30, log_every_n_steps=20) #, deterministic=True)

trainer.fit(classifier, train_loader, test_loader)

在这里插入图片描述

trainer.validate(classifier, test_loader)

在这里插入图片描述

trainer.test(classifier, test_loader)

在这里插入图片描述

preds = trainer.predict(classifier, test_loader)

preds = torch.concat(preds)

preds = preds.argmax(axis=1)

preds[:5]

在这里插入图片描述

Y_test = []
for x,y in test_loader:
    Y_test.append(y)

Y_test = torch.concat(Y_test)

Y_test[:5]

在这里插入图片描述

from sklearn.metrics import accuracy_score

print("Test Accuracy : {:.3f}".format(accuracy_score(preds, Y_test)))

在这里插入图片描述

from sklearn.metrics import classification_report

print("Classification Report : ")
print(classification_report(preds, Y_test))

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值