import torch
from torch import nn
from torch.utils import data
import torchvision
from torchvision import transforms
'''
这是我自己参考了李沐的代码
和
https://blog.csdn.net/alionsss/article/details/129973035
从而复现的LeNet
'''
# 超参数定义
batch_size = 256
epoch_num = 20
lr = 0.03
if torch.cuda.device_count() >= 1:
device = torch.device(f'cuda:0')
else:
device = torch.device('cpu')
def load():
# 加载数据集
# 这里的root指的是本地目录。
mnist_train = torchvision.datasets.FashionMNIST(
root="data", train=True, transform=transforms.ToTensor(), download=True)
mnist_test = torchvision.datasets.FashionMNIST(
root="data", train=False, transform=transforms.ToTensor(), download=True)
# 将数据集转为特定格式
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=8)
test_iter = data.DataLoader(mnist_test, batch_size, shuffle=False, num_workers=8)
return train_iter, test_iter
def netdefine():
# 网络定义
net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))
# 初始化参数
def init_weights(m):
if type(m) == nn.Linear or type(m) == nn.Conv2d:
nn.init.xavier_uniform_(m.weight)
net.apply(init_weights)
# 模型迁移
net = net.to(device)
return net
def train(net, train_iter):
# optimizer会根据梯度对所有参数进行更新
optimizer = torch.optim.SGD(net.parameters(), lr=0.9)
loss = nn.CrossEntropyLoss()
for epoch in range(0, epoch_num):
net.train()
total = 0
correct = 0
for X, y in train_iter:
# 梯度置零
X, y = X.to(device), y.to(device)
y_hat = net(X)
l = loss(y_hat, y)
# 梯度反向传播,参数更新
optimizer.zero_grad()
l.backward()
optimizer.step()
# 计算准确率
_, pred = torch.max(y_hat, 1)
total += y.size(0)
correct += (pred == y).sum().item()
print(f'epoch = {epoch}, total = {total}, acurrcy = {100 * correct / total}%')
def test(net, test_iter):
net.eval()
with torch.no_grad():
correct = 0
total = 0
for X, y in test_iter:
X = X.to(device)
y = y.to(device)
output = net(X)
_, pred = torch.max(output, 1)
total += y.size(0)
correct += (pred == y).sum().item()
print(f'test,total = {total}, acurrcy = {100 * correct / total}%')
if __name__ == '__main__':
train_iter, test_iter = load()
net = netdefine()
train(net, train_iter)
test(net, test_iter)
import torch
from torch import nn
from torch.utils import data
import torchvision
from torchvision import transforms
'''
这是我自己参考了李沐的代码
复现AlexNet
'''
# 超参数定义
batch_size = 256
epoch_num = 20
lr = 0.03
if torch.cuda.device_count() >= 1:
device = torch.device(f'cuda:0')
else:
device = torch.device('cpu')
def load():
# 加载数据集
# 这里的root指的是本地目录。
mnist_train = torchvision.datasets.FashionMNIST(
root="data", train=True, transform=transforms.Compose([transforms.Resize(224),transforms.ToTensor()]), download=True)
mnist_test = torchvision.datasets.FashionMNIST(
root="data", train=False, transform=transforms.Compose([transforms.Resize(224),transforms.ToTensor()]), download=True)
# 将数据集转为特定格式
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=4)
test_iter = data.DataLoader(mnist_test, batch_size, shuffle=False,num_workers=4)
return train_iter,test_iter
def netdefine():
# 网络定义
net = nn.Sequential(#1*224*224
nn.Conv2d(1, 96, kernel_size=11, stride=4,padding=1), nn.ReLU(),#96*62*62
nn.MaxPool2d(kernel_size=3, stride=2),#96*30*30
nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),#256*29*29
nn.MaxPool2d(kernel_size=3, stride=2),#256*14*14
nn.Conv2d(256, 384, kernel_size=3,padding=1), nn.ReLU(),#384*13*13
nn.Conv2d(384, 384, kernel_size=3,padding=1), nn.ReLU(),#384*12*12
nn.Conv2d(384, 256, kernel_size=3,padding=1), nn.ReLU(),#256*11*11
nn.MaxPool2d(kernel_size=3, stride=2),#256*5*5
nn.Flatten(),
nn.Linear(256 * 5 * 5, 4096), nn.ReLU(),nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),nn.Dropout(p=0.5),
nn.Linear(4096, 10))
# 初始化参数
def init_weights(m):
if type(m) == nn.Linear or type(m) == nn.Conv2d:
nn.init.xavier_uniform_(m.weight)
net.apply(init_weights)
# 模型迁移
net = net.to(device)
return net
def train(net,train_iter):
# optimizer会根据梯度对所有参数进行更新
optimizer = torch.optim.SGD(net.parameters(), lr)
loss = nn.CrossEntropyLoss()
for epoch in range(0,epoch_num):
net.train()
total = 0
correct = 0
for X, y in train_iter:
# 梯度置零
X, y = X.to(device), y.to(device)
y_hat = net(X)
l = loss(y_hat, y)
# 梯度反向传播,参数更新
optimizer.zero_grad()
l.backward()
optimizer.step()
# 计算准确率
_, pred = torch.max(y_hat, 1)
total += y.size(0)
correct += (pred == y).sum().item()
print(f'epoch = {epoch}, total = {total}, acurrcy = {100 * correct / total}%')
def test(net,test_iter):
net.eval()
with torch.no_grad():
correct = 0
total = 0
for X, y in test_iter:
X = X.to(device)
y = y.to(device)
output = net(X)
_, pred = torch.max(output, 1)
total += y.size(0)
correct += (pred == y).sum().item()
print(f'test,total = {total}, acurrcy = {100 * correct / total}%')
if __name__ == '__main__':
train_iter,test_iter = load()
net = netdefine()
train(net,train_iter)
test(net,test_iter)