PyTorch快速入门


Conda 创建环境

conda create -n pythorch python=3.12

Conda 激活环境

conda activate pythorch

DataLoader

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)

# 测试数据中第一个图片及target
img, target = test_data[0]
print(img)
print(target)

writer = SummaryWriter('dataloader')
step = 0
for data in test_loader:
    imgs, targets = data
    writer.add_images("test_data", imgs, step)
    step = step + 1
writer.close()

nn.Module

import torch
from torch import nn
class CH3COOH(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, input):
        output = input + 1
        return output


c = CH3COOH()
x = torch.tensor(1.0)
output = c(x)
print(output)

卷积操作

import torch
import torch.nn.functional as F
input = torch.tensor([[1, 2, 0, 3, 1],
                      [0, 1, 2, 3, 1],
                      [1, 2, 1, 0, 0],
                      [5, 2, 3, 1, 1],
                      [2, 1, 0, 1, 1]])
kernel = torch.tensor([[1, 2, 1],
                       [0, 1, 0],
                       [2, 1, 0]])

input = torch.reshape(input, [1, 1, 5, 5])
kernel = torch.reshape(kernel, [1, 1, 3, 3])

output = F.conv2d(input, kernel, stride=1)
print(output)

output2 = F.conv2d(input, kernel, stride=2)
print(output2)

output3 = F.conv2d(input, kernel, stride=1, padding=1)
print(output3)

卷积层

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter


class NNOne(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)

    def forward(self, x):
        output = self.conv1(x)
        return output


test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(test_data, batch_size=64, shuffle=True)

nnOne = NNOne()
writer = SummaryWriter(log_dir='./logs')
step = 0
for data in test_loader:
    imgs, targets = data
    output = nnOne(imgs)
    output = torch.reshape(output, (-1, 3, 30, 30))
    writer.add_images("NNOne_input", imgs, step)
    writer.add_images("NNOne_output", output, step)
    step = step + 1
    # print(imgs.shape)
    # print(output.shape)

最大池化

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

input = torch.tensor([[1, 2, 0, 3, 1],
                      [0, 1, 2, 3, 1],
                      [1, 2, 1, 0, 0],
                      [5, 2, 3, 1, 1],
                      [2, 1, 0, 1, 1]], dtype=torch.float32)

input = torch.reshape(input, (-1, 1, 5, 5))

test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(test_data, batch_size=64, shuffle=True)

writer = SummaryWriter(log_dir='./maxpoolLogs')


class NNMaxPool(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool = nn.MaxPool2d(kernel_size=3, ceil_mode=True)

    def forward(self, x):
        return self.maxpool(x)


model = NNMaxPool()
output = model(input)
print(output)
step = 0
for data in test_loader:
    images, targets = data
    output = model(images)
    writer.add_images("input", images, step)
    writer.add_images("output", output, step)
    step = step + 1


writer.close()

线性激活

import torchvision
from torch import nn
from torch.nn import ReLU
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.relu = ReLU()
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        return self.sigmoid(x)


test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(test_data, batch_size=64, shuffle=True)

writer = SummaryWriter(log_dir='./relu_logs')

model = Net()
step = 0
for data in test_loader:
    images, targets = data
    outputs = model(images)
    writer.add_images("relu_input", images, step)
    writer.add_images("relu_output", outputs, step)
    step = step + 1

writer.close()

线性层

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

test_data = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(test_data, batch_size=64, drop_last=True)

writer = SummaryWriter(log_dir='./liner_logs')


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.liner = nn.Linear(196608, 10)

    def forward(self, x):
        return self.liner(x)


model = Net()
step = 0
for data in test_loader:
    images, targets = data
    outputs = torch.reshape(images, (1, 1, 1, -1))
    #outputs = torch.flatten(images)
    outputs = model(outputs)
    writer.add_images("input", images, step)
    writer.add_images("output", outputs, step)
    step = step + 1
    print(outputs)
writer.close()

损失

import torch
from torch.nn import L1Loss

input = torch.tensor([1, 2, 3], dtype=torch.float32)
target = torch.tensor([1, 2, 5], dtype=torch.float32)

input = torch.reshape(input, (1, 1, 1, 3))
target = torch.reshape(target, (1, 1, 1, 3))

loss = L1Loss()
result = loss(input, target)
print(result)

模型保存与加载

import torch
import torchvision.models

vgg16 = torchvision.models.vgg16(weights=None)
torch.save(vgg16,"vgg16.pth")
model = torch.load('vgg16.pth', weights_only=False)
print(model)

# 官方推荐
torch.save(vgg16.state_dict(),"vgg16_state_dict.pth")
model = torchvision.models.vgg16(weights=None)
model.load_state_dict(torch.load("vgg16_state_dict.pth"))
print(model)

创建神经网络moximport torch

from torch import nn
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(3, 32, 5, 1, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, 1, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, 1, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64 * 4 * 4, 64),
            nn.Linear(64, 10)
        )

    def forward(self, x):
        return self.model(x)


if __name__ == '__main__':
    input = torch.ones((64, 3, 32, 32))
    model = Net()
    output = model(input)
    print(output.shape)

模型训练

import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

from Net import Net
import torch

# 准备数据集
data_train = torchvision.datasets.CIFAR10(root='./dataset', train=True, download=True,
                                          transform=torchvision.transforms.ToTensor())
data_test = torchvision.datasets.CIFAR10(root='./dataset', train=False, download=True,
                                         transform=torchvision.transforms.ToTensor())

print(len(data_train))
print(len(data_test))

data_test_loader = DataLoader(data_test, batch_size=64)
data_train_loader = DataLoader(data_train, batch_size=64)

# 实例化模型
net = Net()
net = net.cuda()
# 损失函数
lost_fn = nn.CrossEntropyLoss()
lost_fn = lost_fn.cuda()
# 优化器
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)  # 0.01 = 1e-2 = 1 * 10^-2

# 设置训练网络中的一些参数
total_train_step = 0  # 记录训练的次数
total_test_step = 0  # 记录测试的次数
epoch = 10  # 训练的轮数

writer = SummeryWriter = SummaryWriter(log_dir='train_logs')
net.train()
for i in range(epoch):
    print("第{}轮开始".format(i + 1))
    for data in data_train_loader:
        images, targets = data
        images = images.cuda()
        targets = targets.cuda()
        outputs = net(images)
        loss = lost_fn(outputs, targets)
        # 优化器 优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_train_step += 1
        if total_train_step % 100 == 0:
            print("训练次数 {},Loss {}".format(total_train_step, loss))
            writer.add_scalar("train_loss", loss, total_train_step)

    total_test_loss = 0
    total_correct = 0
    with torch.no_grad():
        for data in data_test_loader:
            images, targets = data
            images = images.cuda()
            targets = targets.cuda()
            outputs = net(images)
            loss = lost_fn(outputs, targets)
            total_test_loss += loss.item()
            correct = (outputs.argmax(1) == targets).sum()
            total_correct += correct
    print("整体测试集上的Loss {}".format(total_test_loss))
    print("整体测试集上的正确率 {}".format(total_correct / len(data_test)))
    writer.add_scalar("test_loss", total_test_loss, total_test_step)
    writer.add_scalar("test_correct", total_correct / len(data_test), total_test_step)
    total_test_step += 1
    # 模型保存
    # torch.save(net.state_dict(),"net_{}.pth".format(total_test_step))

writer.close()

声明:冰醋酸|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - PyTorch快速入门


一切随缘