lenet实现

该博客介绍了如何在PyTorch中实现经典的LeNet卷积神经网络,包括网络结构、损失函数、优化器的选择和训练过程。代码展示了如何在训练集和测试集上计算准确率,并提供了训练过程的日志输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import time
import torch
from torch import nn, optim

import sys
sys.path.append("…")
import d2lzh_pytorch as d2l
device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)

class LeNet(nn.Module):
def init(self):
super(LeNet, self).init()
self.conv = nn.Sequential(
nn.Conv2d(1, 6, 5), # in_channels, out_channels, kernel_size
nn.Sigmoid(),
nn.MaxPool2d(2, 2), # kernel_size, stride
nn.Conv2d(6, 16, 5),
nn.Sigmoid(),
nn.MaxPool2d(2, 2)
)
self.fc = nn.Sequential(
nn.Linear(1644, 120),
nn.Sigmoid(),
nn.Linear(120, 84),
nn.Sigmoid(),
nn.Linear(84, 10)
)

def forward(self, img):
    feature = self.conv(img)
    output = self.fc(feature.view(img.shape[0], -1))
    return output

def evaluate_accuracy(data_iter, net, device=None):
if device is None and isinstance(net, torch.nn.Module):
# 如果没指定device就使用net的device
device = list(net.parameters())[0].device
acc_sum, n = 0.0, 0
with torch.no_grad():
for X, y in data_iter:
if isinstance(net, torch.nn.Module):
net.eval() # 评估模式, 这会关闭dropout
acc_sum += (net(X.to(device)).argmax(dim=1) == y.to(device)).float().sum().cpu().item()
net.train() # 改回训练模式
else: # 自定义的模型, 3.13节之后不会用到, 不考虑GPU
if(‘is_training’ in net.code.co_varnames): # 如果有is_training这个参数
# 将is_training设置成False
acc_sum += (net(X, is_training=False).argmax(dim=1) == y).float().sum().item()
else:
acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()
n += y.shape[0]
return acc_sum / n
def train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs):
net = net.to(device)
print("training on ", device)
loss = torch.nn.CrossEntropyLoss()
for epoch in range(num_epochs):
train_l_sum, train_acc_sum, n, batch_count, start = 0.0, 0.0, 0, 0, time.time()
for X, y in train_iter:
X = X.to(device)
y = y.to(device)
y_hat = net(X)
l = loss(y_hat, y)
optimizer.zero_grad()
l.backward()
optimizer.step()
train_l_sum += l.cpu().item()
train_acc_sum += (y_hat.argmax(dim=1) == y).sum().cpu().item()
n += y.shape[0]
batch_count += 1
test_acc = evaluate_accuracy(test_iter, net)
print(‘epoch %d, loss %.4f, train acc %.3f, test acc %.3f, time %.1f sec’
% (epoch + 1, train_l_sum / batch_count, train_acc_sum / n, test_acc, time.time() - start))

### 使用飞桨 (PaddlePaddle) 实现 LeNet 模型进行 MNIST 数据集的手写数字识别 以下是基于 PaddlePaddle 的 LeNet 模型实现 MNIST 手写数字分类的具体方法和代码示例: #### 1. 导入必要的库 为了构建模型,需要导入 PaddlePaddle 及其相关模块。 ```python import paddle from paddle.nn import Layer import paddle.nn.functional as F from paddle.vision.transforms import Compose, Normalize from paddle.metric import Accuracy ``` #### 2. 定义 LeNet 模型结构 LeNet 是一种经典的卷积神经网络架构,适用于简单的图像分类任务。这里定义了一个继承自 `Layer` 类的 LeNet 模型[^3]。 ```python class LeNet(Layer): def __init__(self): super(LeNet, self).__init__() # 卷积层 self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2) self.max_pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=5, stride=1) self.max_pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) # 全连接层 self.fc1 = paddle.nn.Linear(in_features=16*5*5, out_features=120) self.fc2 = paddle.nn.Linear(in_features=120, out_features=84) self.fc3 = paddle.nn.Linear(in_features=84, out_features=10) def forward(self, inputs): x = self.conv1(inputs) x = F.relu(x) x = self.max_pool1(x) x = self.conv2(x) x = F.relu(x) x = self.max_pool2(x) x = paddle.flatten(x, start_axis=1) x = self.fc1(x) x = F.relu(x) x = self.fc2(x) x = F.relu(x) x = self.fc3(x) return x ``` #### 3. 加载 MNIST 数据集并预处理 使用 PaddlePaddle 提供的数据接口加载 MNIST 数据集,并对其进行标准化处理。 ```python transform = Compose([Normalize(mean=[127.5], std=[127.5], data_format='CHW')]) train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform) test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform) ``` #### 4. 创建模型实例并配置优化器 创建 LeNet 模型实例,并设置损失函数、评估指标以及优化算法[^2]。 ```python model = paddle.Model(LeNet()) optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) model.prepare( optim, paddle.nn.CrossEntropyLoss(), Accuracy() ) ``` #### 5. 训练模型 调用 `fit()` 方法对模型进行训练,指定训练轮数(epochs)、批次大小(batch size)以及其他参数。 ```python model.fit(train_dataset, epochs=5, batch_size=64, verbose=1) ``` #### 6. 测试模型性能 利用测试数据集验证模型的表现,计算准确率等评价指标。 ```python eval_result = model.evaluate(test_dataset, batch_size=64, verbose=1) print(f"Evaluation accuracy: {eval_result['acc']}") ``` #### 7. 进行预测 可以使用经过训练后的模型对手写数字图片进行预测[^1]。 ```python image, label = test_dataset[0] image = image.reshape((1,) + image.shape) predict = model.predict(image)[0].argmax() print(f"Predicted digit: {predict}, Ground truth: {label}") ``` 以上即为完整的基于 PaddlePaddle 和 LeNet 模型的 MNIST 数字分类流程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值