当前位置:
首页 > Python基础教程 >
-
Python中的pytorch卷积神经网络LeNet
LeNet 是一个经典的卷积神经网络(CNN),由 Yann LeCun 在上世纪90年代开发,用于手写数字识别(如 MNIST 数据集)。尽管它的结构相对简单,但它是现代深度学习和卷积神经网络发展的基础之一。在 PyTorch 中实现 LeNet 是一个很好的练习,可以帮助你理解 CNN 的基本构建块。
下面是一个使用 PyTorch 实现的 LeNet 的基本示例:
请注意,这个 LeNet 的实现是针对灰度图像(单通道)的,如 MNIST 数据集中的图像。如果你的输入图像是彩色的(RGB),你需要将第一个卷积层的输入通道数从 1 改为 3。
此外,这个实现没有包括 LeNet 原始版本中可能包含的一些其他特性,如 Sigmoid 激活函数在输出层的使用(尽管在现代深度学习实践中,Softmax 函数通常与交叉熵损失函数一起使用来替代 Sigmoid+交叉熵的组合)。这个示例使用了 ReLU 激活函数,它在现代 CNN 中更为常见。
下面是一个使用 PyTorch 实现的 LeNet 的基本示例:
import torch
import torch.nn as nn
import torch.nn.functional as F
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
# 第一层卷积层,输入通道数 1(灰度图),输出通道数 6,卷积核大小 5x5
self.conv1 = nn.Conv2d(1, 6, 5)
# 第二层池化层,池化核大小 2x2
self.pool = nn.MaxPool2d(2, 2)
# 第三层卷积层,输入通道数 6(上一层输出),输出通道数 16,卷积核大小 5x5
self.conv2 = nn.Conv2d(6, 16, 5)
# 第四层是全连接层,将卷积层的输出展平后作为输入
# 需要先计算展平后的特征数量:((输入高度-卷积核高度+2*padding)/stride+1) * ((输入宽度-卷积核宽度+2*padding)/stride+1) * 输出通道数
# 对于 MNIST 数据集,输入图像大小为 32x32,经过两层卷积和池化后,大小变为 (32-5+0)/2/2 = 7x7
# 因此,展平后的特征数量为 7*7*16
self.fc1 = nn.Linear(7 * 7 * 16, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10) # 假设是 10 类分类问题,如 MNIST 的 0-9 数字
def forward(self, x):
# 第一层卷积和ReLU激活
x = self.pool(F.relu(self.conv1(x)))
# 第二层卷积和ReLU激活,接着是池化
x = self.pool(F.relu(self.conv2(x)))
# 展平特征图
x = torch.flatten(x, 1)
# 全连接层
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# 实例化模型
net = LeNet()
print(net)
# 假设有一个输入张量 x(模拟一张 32x32 的灰度图像)
# x = torch.randn(1, 1, 32, 32) # 形状为 (batch_size, channels, height, width)
# 输出 = net(x)
# print(output.shape) # 应该是 torch.Size([1, 10]),表示 10 个类别的预测分数
import torch.nn as nn
import torch.nn.functional as F
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
# 第一层卷积层,输入通道数 1(灰度图),输出通道数 6,卷积核大小 5x5
self.conv1 = nn.Conv2d(1, 6, 5)
# 第二层池化层,池化核大小 2x2
self.pool = nn.MaxPool2d(2, 2)
# 第三层卷积层,输入通道数 6(上一层输出),输出通道数 16,卷积核大小 5x5
self.conv2 = nn.Conv2d(6, 16, 5)
# 第四层是全连接层,将卷积层的输出展平后作为输入
# 需要先计算展平后的特征数量:((输入高度-卷积核高度+2*padding)/stride+1) * ((输入宽度-卷积核宽度+2*padding)/stride+1) * 输出通道数
# 对于 MNIST 数据集,输入图像大小为 32x32,经过两层卷积和池化后,大小变为 (32-5+0)/2/2 = 7x7
# 因此,展平后的特征数量为 7*7*16
self.fc1 = nn.Linear(7 * 7 * 16, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10) # 假设是 10 类分类问题,如 MNIST 的 0-9 数字
def forward(self, x):
# 第一层卷积和ReLU激活
x = self.pool(F.relu(self.conv1(x)))
# 第二层卷积和ReLU激活,接着是池化
x = self.pool(F.relu(self.conv2(x)))
# 展平特征图
x = torch.flatten(x, 1)
# 全连接层
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# 实例化模型
net = LeNet()
print(net)
# 假设有一个输入张量 x(模拟一张 32x32 的灰度图像)
# x = torch.randn(1, 1, 32, 32) # 形状为 (batch_size, channels, height, width)
# 输出 = net(x)
# print(output.shape) # 应该是 torch.Size([1, 10]),表示 10 个类别的预测分数
请注意,这个 LeNet 的实现是针对灰度图像(单通道)的,如 MNIST 数据集中的图像。如果你的输入图像是彩色的(RGB),你需要将第一个卷积层的输入通道数从 1 改为 3。
此外,这个实现没有包括 LeNet 原始版本中可能包含的一些其他特性,如 Sigmoid 激活函数在输出层的使用(尽管在现代深度学习实践中,Softmax 函数通常与交叉熵损失函数一起使用来替代 Sigmoid+交叉熵的组合)。这个示例使用了 ReLU 激活函数,它在现代 CNN 中更为常见。
最后,如果你对python语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/Python/python50423.html
栏目列表
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
开启SQLSERVER数据库缓存依赖优化网站性能
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比