当前位置: 首页 > news >正文

卷积神经网络基本概念

文章目录

  • 前言
  • 一、卷积神经网络基础
    • 1.卷积
    • 2.池化


前言

通过今天的学习,我掌握了卷积神经网络的基本概念,包括卷积,池化的相关概念和基本原理。


一、卷积神经网络基础

卷积神经网络(CNN)可以看作是全连接神经网络的特殊形式。常用于对图形图像进行处理。
在这里插入图片描述
在这里插入图片描述
从上图可以看出,CNN在结构上和全连接神经网络十分相似,不同的是,CNN将全连接层替换为了卷积层并且加入了池化层。

接下来,我们从卷积核池化两个概念入手理解CNN。

1.卷积

通过之前的学习,我们可以知道全连接神经网络的网络结构较为复杂,参数量较大,很容易造成过拟合的现象,同时计算开销也比较大。在处理图形图像数据时有较大的局限性。

为了解决这一问题,同时结合图像本身具有的局部不变性(简单理解就是CNN只关心特征而不是特征的位置)特征,设计了CNN。

CNN通过卷积核在图像数据上滑动并提取特征。

卷积是CNN的核心理念,遵循局部连接,权重共享的原则。

  • 局部连接是指每个神经元仅与输入数据的局部区域链接,这样可以极大程度地降低计算成本。
  • 权重共享是指当前层所有神经元都使用同一套权重,即都利用同一个卷积核进行计算,进一步减少了模型的参数。

需要注意的是,卷积核是一个超参数,是人为精心设定的,基于长久的经验得出。

以下定义了一个简单的二维CNN:

import torch
from torch import nn# 定义输入
input_maxtrix = torch.tensor([[1,2,3],[4,5,6],[7,8,9]
],dtype=torch.float)# 定义卷积核
kernal = torch.tensor([[0,1],[2,3]],dtype=torch.float)# 扩展输入为4维,conv2d要求四维张量
# 包括批次,通道数,高度,宽度
input_tensor = input_maxtrix.view(1,1,3,3)# 创建卷积层
conv_lay = nn.Conv2d(in_channels=1, # 输入通道数out_channels=1, # 输出通道数kernel_size=2, # 核大小stride=1, # 步长padding=0, # 是否边缘填充bias=False # 禁用偏置)conv_lay.weight.data  = kernal.view(1,1,2,2)output_maxtrix = conv_lay(input_tensor)# 降维
output_maxtrix = output_maxtrix.squeeze().detach()print(output_maxtrix)

tips:Conv2d要求输入数据的维度为4,需要结合实际情况和最后输出的要求灵活进行维度变换。

2.池化

池化是一种减少特征图维度,降低输出复杂度的技术,原理是通过卷积核对特征图进行操作(如提取最大值或平均值),进而实现特征图的降维。

需要注意的是,池化操作中的卷积核是没有核值的,常见的池化操作有:最大值池化,平均值池化。两种方法顾名思义就是取卷积核中的最大值或平均值。

在卷积后添加池化操作,我们就可以得到一个基本的CNN结构。

import torch
from torch import nn
import numpy as np# 定义输入
matrix_np = np.array([[[[1.0, 0.0, 0.0, 0.0, 1.0],[0.0, 1.0, 0.0, 1.0, 0.0],[0.0, 0.0, 1.0, 0.0, 0.0],[0.0, 1.0, 0.0, 1.0, 0.0],[1.0, 0.0, 0.0, 0.0, 1.0]]]]).astype(np.float32)
# 定义卷积核
kernel = torch.tensor([[0., 0., 1.],[0., 1., 0.],[1., 0., 0.]
], dtype=torch.float32)
# 转换为Tensor
input_data = torch.from_numpy(matrix_np)
# 构建卷积层
conv_layer = nn.Conv2d(in_channels=1, out_channels=1, stride=1, kernel_size=3, padding=1)
# 扩展维度
conv_layer.weight.data = kernel.view(1, 1, 3, 3)
# 对输入数据进行卷积操作
output_data1 = conv_layer(input_data)
# 输出结果
# print(torch.round(output_data1))
# 定义池化层
max_pool_layer = nn.MaxPool2d(kernel_size=2,stride=3,
)
output_data2 = max_pool_layer(output_data1)print(torch.round(output_data2))

THE END

http://www.dtcms.com/a/291274.html

相关文章:

  • 深度学习之参数初始化和损失函数(四)
  • 深入解析MIPI C-PHY (二)C-PHY三线魔术:如何用6种“符号舞步”榨干每一滴带宽?
  • 设计模式六:工厂模式(Factory Pattern)
  • C语言:20250721笔记
  • 在 Conda 中删除环境及所有安装的库
  • 《使用 IDEA 部署 Docker 应用指南》
  • Linux-rpm和yum
  • Shell脚本编程:从入门到精通的实战指南
  • 从零开始:用Python库轻松搭建智能AI代理
  • Djoser 详解
  • 深度学习中的数据增强:从理论到实践
  • hot100回归复习(算法总结1-38)
  • 力扣面试150(35/150)
  • 【安全篇 / 反病毒】(7.6) ❀ 01. 查杀HTTPS加密网站病毒 ❀ FortiGate 防火墙
  • Excel函数 —— XLOOKUP 双向查找
  • Linux find命令:强大的文件搜索工具
  • 计算机发展史:电子管时代的辉煌与局限
  • 无人机浆叶安装顺序
  • 【算法基础】二分查找
  • 源码编译安装boost库,以及卸载boost库
  • 插值法的使用
  • Js进阶案例合集
  • iostat的使用说明
  • 基于深度学习的图像分类:使用ResNet实现高效分类
  • (10)机器学习小白入门 YOLOv:YOLOv8-cls 模型评估实操
  • G7打卡——Semi-Supervised GAN
  • numpy库的基础知识
  • 【VASP】机器学习势概述
  • 5G/4G PHY SoC:RNS802,适用于集成和分解的小型蜂窝 RAN 架构。
  • 在github上搭建自己主页