学做凉菜冷菜的网站,手机端网站seo,自己公司做网站,网站开发相关技术发展完成内容#xff1a;
构建CNN并基于MNIST数据集进行训练和测试构建LeNet并基于MNIST数据集进行训练和测试构建AlexNet并基于MNIST数据集进行训练和测试对比了不同网络在MNIST数据集上训练的效果
准备工作
import torch
import torch.nn as nn
import torch.optim as optim
…完成内容
构建CNN并基于MNIST数据集进行训练和测试构建LeNet并基于MNIST数据集进行训练和测试构建AlexNet并基于MNIST数据集进行训练和测试对比了不同网络在MNIST数据集上训练的效果
准备工作
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from tqdm import tqdm
from matplotlib import pyplot as plt
import pandas as pd
from math import pi下载数据加载data_loader
device torch.device(cuda if torch.cuda.is_available() else cpu)
print(fdevice:{device})
batch_size 256transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])# 加载数据(本步建议挂梯子)
train_dataset datasets.MNIST(root./data, trainTrue, transformtransform, downloadTrue)
test_dataset datasets.MNIST(root./data, trainFalse, transformtransform, downloadTrue)# 加载data_loader
train_loader DataLoader(datasettrain_dataset, batch_sizebatch_size, shuffleTrue)
test_loader DataLoader(datasettest_dataset, batch_sizebatch_size, shuffleFalse)results []定义CNN和LeNet通用的训练函数和测试函数
def train(model, train_loader, criterion, optimizer, device):model.train()running_loss 0.0for inputs, labels in train_loader:inputs, labels inputs.to(device), labels.to(device)optimizer.zero_grad()outputs model(inputs)loss criterion(outputs, labels)loss.backward()optimizer.step()running_loss loss.item()return running_loss / len(train_loader)def test(model, test_loader, criterion, device):model.eval()correct 0total 0with torch.no_grad():for inputs, labels in test_loader:inputs, labels inputs.to(device), labels.to(device)outputs model(inputs)_, predicted torch.max(outputs, 1)total labels.size(0)correct (predicted labels).sum().item()accuracy correct / totalreturn accuracy
构建CNN并基于MNIST数据集进行训练和测试
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.features nn.Sequential(nn.Conv2d(1, 16, kernel_size5, padding2),nn.ReLU(),nn.MaxPool2d(kernel_size2))self.classifier nn.Linear(16 * 14 * 14, 10)def forward(self, x):x self.features(x)x x.view(x.size(0), -1)x self.classifier(x)return x
# 展示网络内部结构
X torch.rand(size(1, 1, 28, 28), dtypetorch.float32)
for layer in CNN().features:X layer(X)print(layer.__class__.__name__,output shape: \t,X.shape)网络结构
Conv2d output shape: torch.Size([1, 16, 28, 28])
ReLU output shape: torch.Size([1, 16, 28, 28])
MaxPool2d output shape: torch.Size([1, 16, 14, 14])# 初始化CNN优化器损失函数
model CNN().to(device)
optimizer optim.Adam(model.parameters(), lr0.001)
criterion nn.CrossEntropyLoss()
result []
# 训练网络
num_epochs 5
for epoch in tqdm(range(num_epochs), desctraining, unitepoch):train_loss train(model, train_loader, criterion, optimizer, device)test_acc test(model, test_loader, criterion, device)result.append(test_acc)print(fEpoch {epoch1}/{num_epochs}, Loss: {train_loss:.4f}, Test Accuracy: {test_acc:.4f})
results.append(result)
results LeNet-MNIST
class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.features nn.Sequential(nn.Conv2d(1, 6, kernel_size5, padding2), nn.ReLU(), # 1 6 28 28nn.AvgPool2d(kernel_size2, stride2), # 1 6 14 14nn.Conv2d(6, 16, kernel_size5), nn.ReLU(), # 1 16 10 10nn.AvgPool2d(kernel_size2, stride2), # (1, 16, 5, 5)nn.Flatten(), # (1, 400)nn.Linear(16 * 5 * 5, 120), nn.ReLU(), # (1, 120)nn.Linear(120, 84), nn.ReLU(), # (1, 84)nn.Linear(84, 10) # (1, 10))def forward(self, x):x self.features(x)return x# 展示LeNet网络内部结构
X torch.rand(size(1, 1, 28, 28), dtypetorch.float32)
for layer in LeNet().features:X layer(X)print(layer.__class__.__name__,output shape: \t,X.shape)# 网络结构
Conv2d output shape: torch.Size([1, 6, 28, 28])
ReLU output shape: torch.Size([1, 6, 28, 28])
AvgPool2d output shape: torch.Size([1, 6, 14, 14])
Conv2d output shape: torch.Size([1, 16, 10, 10])
ReLU output shape: torch.Size([1, 16, 10, 10])
AvgPool2d output shape: torch.Size([1, 16, 5, 5])
Flatten output shape: torch.Size([1, 400])
Linear output shape: torch.Size([1, 120])
ReLU output shape: torch.Size([1, 120])
Linear output shape: torch.Size([1, 84])
ReLU output shape: torch.Size([1, 84])
Linear output shape: torch.Size([1, 10])# 初始化CNN优化器损失函数
model LeNet().to(device)
optimizer optim.Adam(model.parameters(), lr0.001)
criterion nn.CrossEntropyLoss()
result []
# 训练模型
num_epochs 5
for epoch in tqdm(range(num_epochs), desctraining, unitepoch):train_loss train(model, train_loader, criterion, optimizer, device)test_acc test(model, test_loader, criterion, device)result.append(test_acc)print(fEpoch {epoch1}/{num_epochs}, Loss: {train_loss:.4f}, Test Accuracy: {test_acc:.4f})
results.append(result)
resultsAlexNet-MNIST
# 定义AlexNet
class AlexNet(nn.Module):def __init__(self, num_classes10):super(AlexNet, self).__init__()self.features nn.Sequential(nn.Conv2d(1, 64, kernel_size11, stride4, padding2),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size3, stride2),nn.Conv2d(64, 192, kernel_size5, padding2),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size3, stride2),nn.Conv2d(192, 384, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(384, 256, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(256, 256, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size3, stride2),)self.avgpool nn.AdaptiveAvgPool2d((6, 6))self.classifier nn.Sequential(nn.Dropout(),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplaceTrue),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplaceTrue),nn.Linear(4096, num_classes),)def forward(self, x):x self.features(x)x self.avgpool(x)x torch.flatten(x, 1)x self.classifier(x)return x# 重新加载数据
transform transforms.Compose([transforms.Resize((227, 227)),transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])
train_dataset datasets.MNIST(root./data, trainTrue, downloadTrue, transformtransform)
test_dataset datasets.MNIST(root./data, trainFalse, downloadTrue, transformtransform)batch_size 64
train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)
test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)# 初始化AlexNet、优化器、损失函数
device torch.device(cuda if torch.cuda.is_available() else cpu)
alexnet AlexNet(num_classes10).to(device)
optimizer optim.Adam(alexnet.parameters(), lr0.001)
criterion nn.CrossEntropyLoss()
result []# 训练
num_epochs 5
for epoch in tqdm(range(num_epochs), desctraining, unitepoch):alexnet.train()for inputs, labels in train_loader:inputs, labels inputs.to(device), labels.to(device)optimizer.zero_grad()outputs alexnet(inputs)loss criterion(outputs, labels)loss.backward()optimizer.step()# 测试alexnet.eval()correct 0total 0with torch.no_grad():for inputs, labels in test_loader:inputs, labels inputs.to(device), labels.to(device)outputs alexnet(inputs)_, predicted torch.max(outputs.data, 1)total labels.size(0)correct (predicted labels).sum().item()accuracy correct / totalresult.append(accuracy)print(fAccuracy on test set: {accuracy * 100:.2f}%)
results.append(result)结果分析
# Set data
df pd.DataFrame(results)
columns [epoch1, epoch2, epoch3, epoch4, epoch5]
df.columns columns
df[Network] [CNN,LeNet, AlexNet]
print(df)
# ------- PART 1: Create background# number of variable
categorieslist(df)[:-1]
N len(categories)# What will be the angle of each axis in the plot? (we divide the plot / number of variable)
angles [n / float(N) * 2 * pi for n in range(N)]
angles angles[:1]# Initialise the spider plot
ax plt.subplot(111, polarTrue)# If you want the first axis to be on top:
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)# Draw one axe per variable add labels
plt.xticks(angles[:-1], categories)# Draw ylabels
ax.set_rlabel_position(0)
plt.yticks([0.925,0.95,0.975], [0.925,0.95,0.975], colorgrey, size7)
plt.ylim(0.9,1)# ------- PART 2: Add plots# Plot each individual each line of the data# Ind1
valuesdf.loc[0].drop(Network).values.flatten().tolist()
values values[:1]
ax.plot(angles, values, linewidth1, linestylesolid, labelCNN)
ax.fill(angles, values, b, alpha0.1)# Ind2
valuesdf.loc[1].drop(Network).values.flatten().tolist()
values values[:1]
ax.plot(angles, values, linewidth1, linestylesolid, labelLeNet)
ax.fill(angles, values, r, alpha0.1)# Ind3
valuesdf.loc[2].drop(Network).values.flatten().tolist()
values values[:1]
ax.plot(angles, values, linewidth1, linestylesolid, labelAlexNet)
ax.fill(angles, values, g, alpha0.1)# Add legend
plt.legend(locupper right, bbox_to_anchor(0.1, 0.1))# Show the graph
plt.show() epoch1 epoch2 epoch3 epoch4 epoch5 Network
0 0.9629 0.9764 0.9818 0.9823 0.9826 CNN
1 0.9461 0.9706 0.9781 0.9810 0.9869 LeNet
2 0.9844 0.9865 0.9887 0.9855 0.9900 AlexNet总体而言 AlexNet效果更好但Alex网络更复杂计算开销更大 CNN网络最简单计算开销最小效果也较好 LeNet效果不如预期按理来说LeNet网络更复杂相较于CNN拟合效果应更好但实际效果有偏差怀疑是epoch较少5个epoch不足以收敛