# PyTorch之LeNet-5：利用PyTorch实现最经典的LeNet-5卷积神经网络对手写数字图片识别CNN

## 代码设计

#PyTorch：利用PyTorch实现最经典的LeNet卷积神经网络对手写数字进行识别CNN——Jason niu

import torch

import torch.nn as nn

import torch.optim as optim

class LeNet(nn.Module):

def __init__(self):

super(LeNet,self).__init__()

#Conv1 和 Conv2：卷积层，每个层输出在卷积核（小尺寸的权重张量）和同样尺寸输入区域之间的点积；

self.conv1 = nn.Conv2d(1,10,kernel_size=5)

self.conv2 = nn.Conv2d(10,20,kernel_size=5)

self.conv2_drop = nn.Dropout2d()

self.fc1 = nn.Linear(320,50)

self.fc2 = nn.Linear(50,10)

def forward(self,x):

x = F.relu(F.max_pool2d(self.conv1(x),2)) #使用 max 运算执行特定区域的下采样（通常 2x2 像素）；

x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)),2))

x = x.view(-1, 320)

x = F.relu(self.fc1(x))  #修正线性单元函数，使用逐元素的激活函数 max(0,x)；

x = F.dropout(x, training=self.training) #Dropout2D随机将输入张量的所有通道设为零。当特征图具备强相关时，dropout2D 提升特征图之间的独立性；

x = self.fc2(x)

return F.log_softmax(x, dim=1)  #将 Log(Softmax(x)) 函数应用到 n 维输入张量，以使输出在 0 到 1 之间。

#创建 LeNet 类后，创建对象并移至 GPU

model = LeNet()

criterion = nn.CrossEntropyLoss()

optimizer = optim.SGD(model.parameters(),lr = 0.005, momentum = 0.9) #要训练该模型，我们需要使用带动量的 SGD，学习率为 0.01，momentum 为 0.5。

import os

import torch.nn.functional as F

cuda_gpu = torch.cuda.is_available()

def train(model, epoch, criterion, optimizer, data_loader):

model.train()

for batch_idx, (data, target) in enumerate(data_loader):

if cuda_gpu:

data, target = data.cuda(), target.cuda()

model.cuda()

data, target = Variable(data), Variable(target)

output = model(data)

loss = criterion(output, target)

loss.backward()

optimizer.step()

if (batch_idx+1) % 400 == 0:

print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(

100. * (batch_idx+1) / len(data_loader), loss.data[0]))

from torchvision import datasets, transforms

batch_num_size = 64

transforms.ToTensor(),

transforms.Normalize((0.1307,), (0.3081,))

])),

batch_size=batch_num_size, shuffle=True)

datasets.MNIST('data',train=False, transform=transforms.Compose([

transforms.ToTensor(),

transforms.Normalize((0.1307,), (0.3081,))

])),

batch_size=batch_num_size, shuffle=True)

model.eval()

test_loss = 0

correct = 0

if cuda_gpu:

data, target = data.cuda(), target.cuda()

model.cuda()

data, target = Variable(data), Variable(target)

output = model(data)

test_loss += criterion(output, target).data[0]

pred = output.data.max(1)[1] # get the index of the max log-probability

correct += pred.eq(target.data).cpu().sum()

print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(

test_loss, correct, len(data_loader.dataset), 100. * acc))

return (acc, test_loss)

epochs = 5 #仅仅需要 5 个 epoch（一个 epoch 意味着你使用整个训练数据集来更新训练模型的权重），就可以训练出一个相当准确的 LeNet 模型。

#这段代码检查可以确定文件中是否已有预训练好的模型。有则加载；无则训练一个并保存至磁盘。

if (os.path.isfile('pretrained/MNIST_net.t7')):

acc, loss = test(model, 1, criterion, test_loader)

else:

print ('Training model') #打印出该模型的信息。打印函数显示所有层（如 Dropout 被实现为一个单独的层）及其名称和参数。

for epoch in range(1, epochs + 1):

acc, loss = test(model, 1, criterion, test_loader)

torch.save(model.state_dict(), 'pretrained/MNIST_net.t7')

print (type(t.cpu().data))#以使用 .cpu() 方法将张量移至 CPU（或确保它在那里）。

#或当 GPU 可用时（torch.cuda. 可用），使用 .cuda() 方法将张量移至 GPU。你可以看到张量是否在 GPU 上，其类型为 torch.cuda.FloatTensor。

#如果张量在 CPU 上，则其类型为 torch.FloatTensor。

if torch.cuda.is_available():

print ("Cuda is available")

print (type(t.cuda().data))

else:

print ("Cuda is NOT available")

if torch.cuda.is_available():

try:

print(t.data.numpy())

except RuntimeError as e:

"you can't transform a GPU tensor to a numpy nd array, you have to copy your weight tendor to cpu and then get the numpy array"

print(type(t.cpu().data.numpy()))

print(t.cpu().data.numpy().shape)

print(t.cpu().data.numpy())

data = model.conv1.weight.cpu().data.numpy()

print (data.shape)

print (data[:, 0].shape)

kernel_num = data.shape[0]

fig, axes = plt.subplots(ncols=kernel_num, figsize=(2*kernel_num, 2))

for col in range(kernel_num):

axes[col].imshow(data[col, 0, :, :], cmap=plt.cm.gray)

plt.show()

|
15天前
|

PyTorch 中的动态计算图：实现灵活的神经网络架构
【8月更文第27天】PyTorch 是一款流行的深度学习框架，它以其灵活性和易用性而闻名。与 TensorFlow 等其他框架相比，PyTorch 最大的特点之一是支持动态计算图。这意味着开发者可以在运行时定义网络结构，这为构建复杂的模型提供了极大的便利。本文将深入探讨 PyTorch 中动态计算图的工作原理，并通过一些示例代码展示如何利用这一特性来构建灵活的神经网络架构。
35 1
|
3月前
|

【6月更文挑战第14天】本文深度解析卷积神经网络（CNN）的工作原理。CNN由输入层、卷积层、激活函数、池化层、全连接层和输出层构成。卷积层通过滤波器提取特征，激活函数增加非线性，池化层降低维度。全连接层整合特征，输出层根据任务产生预测。CNN通过特征提取、整合、反向传播和优化进行学习。尽管存在计算量大、参数多等问题，但随着技术发展，CNN在计算机视觉领域的潜力将持续增长。
98 3
|
24天前
|

【深度学习】使用PyTorch构建神经网络：深度学习实战指南
154 59
|
2月前
|

**核心程序**: 完整版代码附中文注释，确保清晰理解。 **理论概述**: 利用CNN从视频中学习步态时空特征。 **系统框架**: 1. 数据预处理 2. CNN特征提取 3. 构建CNN模型 4. 训练与优化 5. 识别测试 **CNN原理**: 卷积、池化、激活功能强大特征学习。 **CASIA数据库**: 高质量数据集促进模型鲁棒性。 **结论**: CNN驱动的步态识别展现高精度，潜力巨大，适用于监控和安全领域。
60 27
|
29天前
|

【PyTorch】PyTorch深度学习框架实战（一）：实现你的第一个DNN网络
【PyTorch】PyTorch深度学习框架实战（一）：实现你的第一个DNN网络
72 1
|
29天前
|

AI智能体研发之路-模型篇（五）：pytorch vs tensorflow框架DNN网络结构源码级对比
AI智能体研发之路-模型篇（五）：pytorch vs tensorflow框架DNN网络结构源码级对比
53 1
|
1月前
|

PyTorch代码实现神经网络

64 9
|
13天前
|

【8月更文第29天】深度学习是机器学习的一个分支，它利用多层非线性处理单元（即神经网络）来解决复杂的模式识别问题。PyTorch 是一个强大的深度学习框架，它提供了灵活的 API 和动态计算图，非常适合初学者和研究者使用。
25 0
|
2月前
|

Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
103 19
|
2月前
|

**理论**: 利用CNN自动识别MQAM调制信号，通过学习星座图特征区分16QAM, 64QAM等。CNN从原始数据提取高级特征，优于传统方法。 - **CNN结构**: 自动特征学习机制，适配多种MQAM类型。 - **优化**: 损失函数指导网络参数调整，提升识别准确度。 - **流程**: 大量样本训练+独立测试评估，确保模型泛化能力。 - **展望**: CNN强化无线通信信号处理，未来应用前景广阔。
19 1

DDNS