PyTorch深度学习实践【刘二大人】之卷积神经网络

news/2025/1/19 22:35:13/

视频地址10.卷积神经网络(基础篇)_哔哩哔哩_bilibili

网络中全部用的线形层串行连接起来,我们叫做全连接网络。输入与输出任意两节点间都有权重,这样的线形层叫做全连接层

卷积神经网络的基本特征,先特征提取再进行分类 

 3通道的图像,与3个卷积核做内积得到3个新的3*3矩阵,并对应位置相加

import torch
import torch
from torchvision import transforms  # 处理数据的一个工具
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F  # 激活函数使用relu
import torch.optim as optim  # 优化器batch_size = 64
transform = transforms.Compose([transforms.ToTensor(),  # 先把图像转化为c*w*h的张量transforms.Normalize((0.1307,), (0.3081,))  # 归一化,里面分别是均值,标准差,把0~255的像素转化为0~1
])train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.convl = torch.nn.Conv2d(1, 10, kernel_size=5)self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)self.pooling = torch.nn.MaxPool2d(2)self.fc = torch.nn.Linear(320, 10)def forward(self, x):# Flatten data from (n, 1, 28, 28) to (n, 784)batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x = F.relu(self.pooling(self.conv2(x)))x = x.view(batch_size, -1)  # flattenx = self.fc(x)return xmodel = Net()
device = torch.device("cuda:O" if torch.cuda.is_available() else "cpu")
model.to(device)  # 将所有模块的参数和缓冲区转换为CUDA张量。
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)  # 冲量设置为0.5来优化训练过程def train(epoch):running_loss = 0.0for batch_idx, data in enumerate(train_loader, 0):inputs, target = datainputs, target = inputs.to(device), target.to(device)  # 将每一步的输入和目标发送给GPU。optimizer.zero_grad()# forward + backward + updateoutputs = model(inputs)loss = criterion(outputs, target)loss.backward()optimizer.step()running_loss += loss.item()  # 用item避免构建计算图if batch_idx % 300 == 299:print('[%d, %5d] loss: %ds. 3f' % (epoch + 1, batch_idx + 1, running_loss / 300))running_loss = 0.0def test():correct = 0total = 0with torch.no_grad():  # 不需要计算梯度for data in test_loader:images, labels = dataimages, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, dim=1)  # 寻找以第一维度的每行最大值,以及最大值下标total += labels.size(0)  # 加上这个批量的总数correct += (predicted == labels).sum().item()  # 计算预测对的数量print('Accuracy on test set: %d %%' % (100 * correct / total))if __name__ == '__main__':for epoch in range(10):train(epoch)test()

 GoogLeNet的Inception模块,思路就是我们不知道多大的卷积核更好,我们就多选择几种卷积核然后concatenate进行沿通道拼接。

下面是此模型的主要代码

import torch
from torch import nn
import torch.nn.functional as Fclass InceptionA(nn.Module):def __init__(self, in_channels):super(InceptionA, self).__init__()self.branch1x1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch5x5_1nn.Conv2d(in_channels, 16, kernel_size=1)self.branch5x5_2 = nn.Conv2d(16, 24, kernel_size=5, padding=2)self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=3, padding=1)self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=3, padding=1)self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=1)def forward(self, x):branch1x1 = self.branchlx1(x)branch5x5 = self.branch5x5_1(x)branch5x5 = self.branch5x5_2(branch5x5)branch3x3 = self.branch3x3_1(x)branch3x3 = self.branch3x3_2(branch3x3)branch3x3 = self.branch3x3_3(branch3x3)branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)branch_pool = self.branch_pool(branch_pool)outputs = [branch1x1, branch5x5, branch3x3, branch_pool]return torch.cat(outputs, dim=1)class Net(nn.Module):def __init_(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=5)self.conv2 = nn.Conv2d(88, 20, kernel_size=5)self.incep1 = InceptionA(in_channels=10)self.incep2 = InceptionA(in_channels=20)self.mp = nn.MaxPool2d(2)self.fc = nn.Linear(1408, 10)def forward(self, x):in_size = x.size(0)x = F.relu(self.mp(self.conv1(x)))x = self.incep1(x)x = F.relu(self.mp(self.conv2(x)))x = self.incep2(x)x = x.view(in_size, -1)x = self.fc(x)return x

 在卷积层数过多时,会出现梯度消失的情况,需要用残差网络来解决这个问题

class ResidualBlock(nn.Module):def __init__(self, channels):super(ResidualBlock, self).__init__()self.channels = channelsself.convl = nn.Conv2d(channels, channels, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)def forward(self, x):y = F.relu(self.conv1(x))y = self.conv2(y)return F.relu(x + y) #把计算值y和原始值x相加

http://www.ppmy.cn/news/1564514.html

相关文章

【Redis】RedisTemplate数据的常用API

1. String 类型操作 set(K key, V value): 设置指定 key 的值。set(K key, V value, long timeout, TimeUnit unit): 设置指定 key 的值,并指定过期时间。get(K key): 获取指定 key 的值。getAndSet(K key, V value):…

分布式项目新选择:Dubbo搭建方案

在当今的数字化时代,构建高性能、可扩展的分布式系统已成为众多企业应对业务增长和技术挑战的关键。Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java RPC框架,为Java开发者提供了一套完善的分布式服务治理方案。本文将详细介绍如何使用Dub…

K8S中Pod控制器之Deployment(Deploy)控制器

Deployment(Deploy)控制器 从Kubernetes 1.2版本开始,引入了Deployment控制器,它提供了一种更高级别的抽象来管理应用的生命周期,包括应用的声明式更新、回滚、暂停和恢复等。Deployment的设计目标是简化应用的部署和扩展,同时提供…

JS宏进阶: 工厂函数与构造函数

一、构造函数 在JavaScript中,构造函数是一种用于创建和初始化对象的特殊函数。构造函数的名字通常以大写字母开头,以区分于普通函数。通过new关键字调用构造函数,可以创建一个新的实例对象,并自动执行构造函数内部的代码来初始化…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点:以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验,避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构:内部上下两排引脚的设计虽然可能不…

深入理解 SQL 中的 DATEDIFF 函数

深入理解 SQL 中的 DATEDIFF 函数 DATEDIFF 函数在 SQL 中是一个用于计算两个日期之间差值的重要工具。不同数据库实现了不同版本的 DATEDIFF,它们在功能和语法上有所不同。本文将详细解析 DATEDIFF 的用法、数据库间差异、复杂场景中的应用,以及替代方…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

Ubuntu创建AndroidStudio快捷启动图标

一、下载linux环境的Anroid studio软件包 下载连接地址: 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 下载的文件为压缩包。进行解压后进入到bin目录下面,显示下面的文件列表 二、创建快捷启动图标 2.1 打开studio 如…