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

Comments | NOTHING