从0开始深度学习:LeNet卷积神经网络详解与实践
创作时间:
作者:
@小白创作中心
从0开始深度学习:LeNet卷积神经网络详解与实践
引用
CSDN
1.
https://m.blog.csdn.net/m0_53115174/article/details/143608566
LeNet是最早的卷积神经网络之一,由Yann LeCun等人在1990年代提出,并以其名字命名。最初,LeNet被设计用于手写数字识别,最著名的应用是在美国的邮政系统中识别手写邮政编码。LeNet架构的成功证明了卷积神经网络在解决实际问题中的有效性,为后续更复杂、更强大的CNN模型的发展奠定了基础。
LeNet网络结构
LeNet的网络结构如下:
- 两个卷积层,分别使用5x5的卷积核
- 两个平均池化层,步长为2
- 三个全连接层
使用PyTorch实现该结构的代码如下:
import torch
from torch import nn
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)
)
模型训练
为了检测LeNet-5在Fashion-MNIST数据集上的表现,我们使用以下代码进行训练:
import torchvision
from torch.utils import data
from torchvision import transforms, datasets
import matplotlib.pyplot as plt
# 数据预处理
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,)) # 标准化到[-1, 1]区间,加快计算
])
# 加载Fashion-MNIST数据集
train_dataset = datasets.FashionMNIST(root='D:/DL_Data/', train=True, download=False, transform=transform)
test_dataset = datasets.FashionMNIST(root='D:/DL_Data/', train=False, download=False, transform=transform)
train_loader = data.DataLoader(dataset=train_dataset, batch_size=128, shuffle=True)
test_loader = data.DataLoader(dataset=test_dataset, batch_size=128, shuffle=False)
# 训练参数
lr, num_epochs = 0.9, 10
# 训练函数
def train(net, train_iter, test_iter, num_epochs, lr):
def init_weights(m):
if type(m) == nn.Linear or type(m) == nn.Conv2d:
nn.init.xavier_uniform_(m.weight)
net.apply(init_weights)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net.to(device)
optimizer = torch.optim.SGD(net.parameters(), lr=lr)
loss = nn.CrossEntropyLoss()
train_acc_list, test_acc_list = [], []
for epoch in range(num_epochs):
net.train()
for X, y in train_iter:
optimizer.zero_grad()
X, y = X.to(device), y.to(device)
y_hat = net(X)
l = loss(y_hat, y)
l.backward()
optimizer.step()
train_acc = evaluate_acc(net, train_iter, device)
test_acc = evaluate_acc(net, test_iter, device)
train_acc_list.append(train_acc)
test_acc_list.append(test_acc)
print(f"epoch: {epoch+1}, train_acc: {train_acc:.3f}, test_acc: {test_acc:.3f}")
return train_acc_list, test_acc_list
# 评估函数
def evaluate_acc(net, data_iter, device):
net.eval()
metric = [0, 0]
with torch.no_grad():
for X, y in data_iter:
X, y = X.to(device), y.to(device)
y_hat = net(X)
metric[0] += (y_hat.argmax(dim=1) == y).sum().item()
metric[1] += y.numel()
return metric[0] / metric[1]
train_acc_list, test_acc_list = train(net, train_loader, test_loader, num_epochs, lr)
结果分析
训练完成后,我们可以绘制训练和测试准确率的折线图:
epochs = range(1, num_epochs + 1)
plt.plot(epochs, train_acc_list, 'b', label='Training Accuracy')
plt.plot(epochs, test_acc_list, 'r', label='Testing Accuracy')
plt.title('Training and Testing Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
从图像可以看出,准确率还没有稳定,说明还有提升空间,可以添加epoch继续训练以获得更准的分类效果。
热门推荐
数据中心的建设成本分析
歼-35总师“道破天机”,中国的两款六代机,将再一次出人意料
美国关税政策频频"变脸" 跨境电商卖家紧急避险
办迁移证当天能办完吗?不同类型户籍迁移办理指南
房屋买卖合同银行网签:方便快捷的房屋交易方式
红箭鱼饲养技术方法
中美产业角逐白热化,稀土能否力挽狂澜,助中国掌控大局?
宝宝摔倒脑损伤症状及处理方法
污水处理过程中的能源回收
遗产分配不公怎么解决
养殖营业执照注销流程及注意事项
怎么判断过敏性皮炎是否好转
服用异维A酸软胶囊后手部出现红点怎么办?
医疗保险查询的隐私保护措施有哪些?
自闭症儿童的三大核心症状和"五不"行为
浅谈素质教育和创新教育
三者险真的要买100万吗?定损员讲了实话,别再白花钱了
山药的保存期限和储存方法(如何让山药保持最佳状态)
拔牙后服用布洛芬:最佳时间、间隔及注意事项全解析
优秀网页设计作品精选展示及创意灵感分享
显著抑制肿瘤生长转移,国内学者合作开发个性化癌症免疫疗法
市政工程行业前景广阔,就业趋势分析
“人命黑板擦”——埃博拉[疫情科普系列之五]
热水器选购全攻略:冬天想要舒服洗澡,没它真的不行!
田文的最后结局:历史的审视与思考
田文:智谋家政,仁爱养士,薛邑宰相的传奇一生
关于诵读经典,传承文化,赞美祖国的作文
国内这5所985大学就业率下降,背后原因令人深思
易经乾卦第六爻:亢龙有悔的智慧
暴跌三杰:揭秘股市暴跌背后的真相与影响