【Python · PyTorch】卷积神经网络(基础概念)
【Python · PyTorch】卷积神经网络 CNN(基础概念)
- 0. 生物学相似性
- 1. 概念
- 1.1 定义
- 1.2 优势
- 1.2.1 权重共享
- 1.2.2 局部连接
- 1.2.3 层次结构
- 1.3 结构
- 1.4 数据预处理
- 1.4.1 标签编码
- ① One-Hot编码 / 独热编码
- ② Word Embedding / 词嵌入
- 1.4.2 归一化
- ① Min-Max归一化(最大最小归一化)
- ② Z-Score归一化(标准化 Standardization)
- 2. 基础概念
- 2.2.1 卷积层
- ① 一维卷积
- ② 二维卷积
- 单通道单卷积核
- 单通道多卷积核
- 多通道单卷积核
- 多通道多卷积核
- ③ 互相关
- 2.2.2 辅助操作
- ① 卷积步长
- ② 零填充
- 2.2.3 池化层 / 汇聚层
- ① 最大池化
- ② 平均池化 / 均值池化
- 2.2.4 感受野
- 2.2.5 空洞卷积 / 膨胀卷积
- ① Gridding Effect 现象
- ② 如何设计膨胀系数?
- 2.2.6 可分离卷积
- ① 空间可分离卷积
- ② 深度可分离卷积
- 2.2.7 扁平卷积
- 2.2.8 分组卷积
- 2.2.9 混洗分组卷积
- 2.2.10 上采样 vs 下采样
- ① 上采样
- ② 下采样
- 2.2.11 上采样
- ① 转置卷积
- 微步卷积
- ② 插值
- 最近邻插值
- 双线性插值
- 双三次插值
- ③ 反池化
- 反最大池化
- 反平均池化
- 3. 评估方法
- 3.1 混淆矩阵
- 3.2 精确度
- 3.3 其他指标
0. 生物学相似性
卷积神经网络从猫视觉皮层电生理研究中获得启发,通过仿造生物的视知觉机制来构建模型。卷积网络中卷积核的设定就对应着视觉神经系统中视觉皮层对视觉空间的组织。
视觉皮层细胞从视网膜上的光感受器接收信号,但单个视觉皮层细胞不会接收光感受器的所有信号,而是只接受其所支配的刺激区域,即感受野内的信号。只有感受野内的刺激才能够激活该神经元。多个视觉皮层细胞通过系统地将感受野叠加,完整接收视网膜传递的信号并建立视觉空间 。
卷积神经网络中基于感受野设定的稀疏连接有明确对应的神经科学过程——视觉神经系统中视觉皮层(visual cortex)对视觉空间(visual space)的组织 。视觉皮层细胞从视网膜上的光感受器接收信号,但单个视觉皮层细胞不会接收光感受器的所有信号,而是只接受其所支配的刺激区域,即感受野内的信号。只有感受野内的刺激才能够激活该神经元。多个视觉皮层细胞通过系统地将感受野叠加完整接收视网膜传递的信号并建立视觉空间。
事实上机器学习的“感受野”一词即来自其对应的生物学研究。卷积神经网络中的权重共享的性质在生物学中没有明确证据,但在对与大脑学习密切相关的目标传播(target-propagation, TP)和反馈调整(feedback alignment, FA) 机制的研究中,权重共享提升了学习效果 。
1. 概念
1.1 定义
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。
卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)” 。
应用领域:计算机视觉、音频识别
1.2 优势
1.2.1 权重共享
使用相同的权重参数对输入数据进行处理,从而减少模型的参数数量,降低计算复杂度,并提高模型的泛化能力;在卷积神经网络中主要体现在卷积核 (过滤器)。
在卷积神经网络中,权值共享是指在卷积层中,同一个卷积核在不同位置上的权值是相同的,这样可以大大减少模型参数,提高模型泛化能力。
权值/权重独立与CNN的权重共享不同:
1.2.2 局部连接
在卷积神经网络中,局部连接是指在卷积层中,每个卷积核只与输入数据的一部分进行卷积运算,而不是与整个输入数据进行卷积运算,这样可以提取出局部特征,增强模型的特征提取能力。
用类比卷积神经网络的方式描述全连接:
1.2.3 层次结构
卷积神经网络是一种包含卷积计算且具有深度结构的前馈神经网络,其所包含的层次结构如下:
输入层:接收原始图像数据或其他类型的网格结构数据。
卷积层:卷积层是CNN的核心,通过卷积操作提取输入数据的局部特征。每个卷积核可以提取一种特定的特征,多个卷积核可以并行工作以提取不同类型的特征。卷积操作通过滤波器对局部输入数据进行内积计算,滤波器在数据窗口上滑动,计算每个局部数据的输出。
激活层:激活层用于提升网络的非线性能力,通常跟在卷积层之后,其能够解决梯度消失问题、加快收敛速度。
池化层:池化层对卷积层的输出进行下采样 (降维),以减少参数数量并提高计算效率。
全连接层:全连接层负责将前面层提取的特征综合起来,用于分类或回归等任务。全连接层的每个神经元都与前一层的所有神经元相连。
BatchNorm层:BN层通过规范化手段将每层神经网络的输入值的分布强行拉回到均值为0,方差为1的标准正态分布,以加快训练速度并减小图像之间的绝对差异。
1.3 结构
输入层:输入接收数据集,处理原始图像数据。
卷积层:通过卷积操作提取图像特征,卷积操作使用滤波器 (卷积核) 对图像的局部区域进行内积运算,提取特征。
激活层:对卷积层的输出应用非线性激活函数,引入非线性以增强网络的表达能力。
池化层:通过下采样减少数据的维度和参数数量,通常有两种方式:最大池化和平均池化。
全连接层:在网络的最后部分,将前面的特征图展平后进行分类/回归任务。
1.4 数据预处理
1.4.1 标签编码
① One-Hot编码 / 独热编码
One-Hot编码 / 独热编码:一种常用于机器学习中的特征编码方式,主要用于处理分类数据。它的基本思想是将分类变量转换为机器学习算法易于处理的形式。
-
例如:MNIST数据集共有10个分类结果,若利用独热编码其可表示为:
↓ 编码下标 \ 分类结果 → 0 1 2 3 4 5 6 7 8 9 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 3 0 0 0 1 0 0 0 0 0 0 4 0 0 0 0 1 0 0 0 0 0 5 0 0 0 0 0 1 0 0 0 0 6 0 0 0 0 0 0 1 0 0 0 7 0 0 0 0 0 0 0 1 0 0 8 0 0 0 0 0 0 0 0 1 0 9 0 0 0 0 0 0 0 0 0 1
用途
- 更易于表示分类
- 适用于多种算法
② Word Embedding / 词嵌入
Word Embedding / 词嵌入:一种自然语言处理机器学习任务中常用的特征编码方式,便于机器学习算法读取文本信息并理解相关内容。通过词嵌入将单词转变为在预定义的向量空间中的实数向量,每个单词都映射到一个向量。
目的:通过数字替代字母,从而便于程序进行运算,还可完成词语间相似度、词语间关联等计算。而独热编码无法胜任此项工作,故利用词嵌入实现。
常见的词嵌入模型:EmbeddingLayer算法、Word2Vec模型、Glove模型、FastText模型
举例:“猫”对应的向量为 a ⃗ = [ 0.1 0.2 0.3 ] \vec{a}=\begin{bmatrix}0.1\\0.2 \\ 0.3\end{bmatrix} a= 0.10.20.3 ,“虎”对应的向量为 b ⃗ = [ 0.2 0.2 0.4 ] \vec{b}=\begin{bmatrix}0.2\\0.2\\0.4\end{bmatrix} b= 0.20.20.4 ,“鹰”对应的映射为 c ⃗ = [ − 0.4 − 0.5 − 0.2 ] \vec{c}=\begin{bmatrix}-0.4\\-0.5\\ -0.2\end{bmatrix} c= −0.4−0.5−0.2
计算 猫&虎、猫&鹰 间的余弦相似度,余弦相似度公式如下:
c o s < a ⃗ , b ⃗ > = a ⃗ ⋅ b ⃗ ∣ ∣ a ⃗ ∣ ∣ ∣ ∣ b ⃗ ∣ ∣ cos\left<\vec{a},\vec{b}\right>=\frac{\vec{a}\cdot\vec{b}}{||\vec{a}||\space||\vec{b}||} cos⟨a,b⟩=∣∣a∣∣ ∣∣b∣∣a⋅b
余弦相似度的取值范围为 [ − 1 , 1 ] [-1,1] [−1,1],当两个向量的夹角为180°时,余弦相似度为-1。
余弦相似度衡量的是两个向量之间的夹角,其值的符号表示向量之间的方向关系,数值的大小表示它们的相似程度。
当两个向量的夹角为0度时,即完全重合,余弦相似度为1;当两个向量的夹角为90度时,即正交或无关,余弦相似度为0;当两个向量的夹角为180度时,即完全相反,余弦相似度为-1。
计算过程:
import torch
import torch.nn as nna = torch.tensor([0.1, 0.2, 0.3], dtype=torch.float)
b = torch.tensor([0.2, 0.2, 0.4], dtype=torch.float)
c = torch.tensor([-0.4, -0.5, -0.2], dtype=torch.float)# 计算两个余弦值的余弦相似度
cos = nn.CosineSimilarity(dim=0, eps=1e-6)output1 = cos(a, b)
output2 = cos(a, c)
output1, output2
计算结果:
(tensor(0.9820), tensor(-0.7968))
由此可得出结论:猫与虎更接近,猫与鹰完全相反。
1.4.2 归一化
归一化:归一化是一种常见的数据预处理技术,用于将数据转换为统一的比例范围,以消除不同变量之间的量纲差异
用途
- 消除量纲差异:消除单位差异
- 避免权重不平衡:避免因数值范围差异大引起的权重不平衡问题
- 加速模型收敛
① Min-Max归一化(最大最小归一化)
将数据线性地映射至一个区间(例如:[0,1] 或 [-1,1])
x ∗ = x − M i n ( x ) M a x ( x ) − M i n ( x ) x^*=\frac{x-Min(x)}{Max(x)-Min(x)} x∗=Max(x)−Min(x)x−Min(x)
其中, x x x是原始数据, x ∗ x^* x∗是归一化后数据。
x # 评估器导入
from sklearn.preprocessing import MinMaxScaler#评估器实例化
scaler = MinMaxScaler() # 评估器实例化:默认映射[0.1]区间
scaler = scaler.fit(data) # 计算min(x)、max(x)
# scaler = MinMaxScaler(feature_range=[5,10]) # 映射至除[0.1]其他区间
result = scaler.transform(data)
② Z-Score归一化(标准化 Standardization)
将数据映射至 均值为0 标准差为1 的标准正态分布的一个区间。
x ∗ = x − μ σ x^*=\frac{x-\mu}{\sigma} x∗=σx−μ
其中, x x x是原始数据, x ∗ x^* x∗是标准化后的数据, μ \mu μ是原始数据的均值, σ \sigma σ是原始数据的标准差。
# 评估器导入
from sklearn.preprocessing import StandardScaler# 评估器实例化
scaler = StandardScaler()
scaler.fit(data)
scaler.transform(X)
2. 基础概念
2.2.1 卷积层
卷积(Convolution),分析数学中的一种运算。在信号或图像处理中,经常使用一维或二维卷积。
卷积运算是卷积神经网络的核心,它通过在音频/图像上滑动卷积核,计算核与图像的局部区域的点积,从而形成 特征图(Feature Map)。
卷积运算捕捉了图像的局部关联并保留了图像的空间关系,卷积神经网络依靠卷积运算实现图像平移不变性。
卷积意义
卷积数学公式:
∫ 0 t f ( x ) g ( t − x ) d x \int^t_0f(x)g(t-x)dx ∫0tf(x)g(t−x)dx
在卷积运算中,可理解为 瞬时行为的持续性后果,可类比蝴蝶效应。
在图像识别领域中, f ( ⋅ ) f(·) f(⋅)等同于图像, g ( ⋅ ) g(·) g(⋅)等同于卷积核,通过卷积运算可求得周围像素对中间像素的影响程度,或被扫描区域对卷积核/过滤器过滤的响应程度。滑动过程中所遇两者外形越相似,则卷积得到的响应越高。卷积神经网络中,卷积核实际上在提取某种局部特征,图片中与该卷积核过滤所需 越相似的区域响应越高。
卷积 三种意义:
- 一个系统 + 输入不稳定 + 输出稳定 + 用卷积求系统存量
- 输入不稳定:输入数据存在差异(如 x x x和 x \mathscr{x} x)
- 输出稳定:变化趋势稳定
- 用卷积求系统存量:求变化后的系统总存量,这一过程持续故采用积分形式
- 周围像素点如何影响中间像素点
- 周围像素点与中间像素点共同构成局部特征
- 通过神经网络对局部特征进行归纳识别从而得出分类/预测结果
- 对周围位置的试探
- 过滤器过滤保留有用特征,交由神经网络判断结果
在图像识别领域中,像素为离散点,故将积分更换为求和,两种维度卷积情况如后文所示。
① 一维卷积
一维卷积一般用于 音频/时序数据 的处理,一维卷积公式如下:
y t = ∑ k = 1 K w k x t − k + 1 y_t=\sum^{K}_{k=1}w_kx_{t-k+1} yt=k=1∑Kwkxt−k+1
其中: x t − k + 1 x_{t-k+1} xt−k+1表示输入的信号序列, w k w_k wk表示 滤波器 (卷积核), y t y_t yt表示输出。
向量形式:
y = w ∗ x \boldsymbol{y}=\boldsymbol{w} \ast \boldsymbol{x} y=w∗x
其中: w \boldsymbol{w} w和 x \boldsymbol{x} x分别为滤波器和输入信号的向量形式, ∗ \ast ∗表示卷积运算, y \boldsymbol{y} y表示输出。
② 二维卷积
二维卷积一般用于 图像/视频数据 的处理,二维卷积公式如下:
y i j = ∑ u = 1 U ∑ v = 1 V w u v x i − u + 1 , j − v + 1 y_{ij}=\sum^{U}_{u=1}\sum^{V}_{v=1}w_{uv}x_{i-u+1,j-v+1} yij=u=1∑Uv=1∑Vwuvxi−u+1,j−v+1
矩阵形式:
Y = W ∗ X \boldsymbol{Y}=\boldsymbol{W} \ast \boldsymbol{X} Y=W∗X
其中: W \boldsymbol{W} W和 X \boldsymbol{X} X分别为滤波器和输入信号的矩阵形式, ∗ \ast ∗表示卷积运算, Y \boldsymbol{Y} Y表示输出。
单通道单卷积核
卷积也可以拥有偏置,这种单一卷积核的情况称为单通道单卷积核。
单通道多卷积核
某些情况下,可使用多个卷积核完成不同类型特征的提取。
卷积核可以认为是具有识别某一类元素(特征)的能力,而对于一些复杂结构的数据来说仅仅只是通过一类特征来进行辨识往往是不够的,因此,通常来说我们都会通过多个不同的卷积核来对输入进行特征提取得到多个特征图,然再输入到后续的网络中进行后续任务。
多通道单卷积核
多通道的单卷积核天生针对每个通道进行操作,所以实际上还是视作单个卷积核。
RGB合成示意图
多通道多卷积核
多通道也可以利用多卷积核针对不同通道分别提取多种不同种类的特征。
③ 互相关
**互相关 (Cross-Correlation) **→ 不翻转卷积:用滑动窗口的点积 → 衡量两个序列的相关性
它与卷积的区别仅仅在于是否翻转:翻转指所有维度颠倒次序 → 即旋转180°(二维 → 上下颠倒+左右颠倒)
y i j = ∑ u = 1 U ∑ v = 1 V w u v x i + u − 1 , j + v − 1 y_{ij}=\sum^{U}_{u=1}\sum^{V}_{v=1}w_{uv}x_{i+u-1,j+v-1} yij=u=1∑Uv=1∑Vwuvxi+u−1,j+v−1
矩阵形式:
Y = W ⊗ X = r o t 180 ( W ) ∗ X \begin{equation} \begin{aligned} Y &= \boldsymbol{W} \otimes \boldsymbol{X} \\ &= rot180(\boldsymbol{W}) \ast \boldsymbol{X} \end{aligned} \end{equation} Y=W⊗X=rot180(W)∗X
2.2.2 辅助操作
① 卷积步长
卷积步长:卷积核每次扫描间距,一般用字母 k k k或 K K K表示。
一维情况
卷积步长 s = 2 s=2 s=2
二维情况
卷积步长 s = 2 s=2 s=2
② 零填充
零填充:为原始输入特征周围填充若干圈零元素,一般用字母 p p p或P表示。
卷积类型:
- 窄卷积 (Narrow Convolution):步长 s = 1 s=1 s=1,两端不补零 p = 0 p=0 p=0,卷积后输出长度为 m − k + 1 m-k+1 m−k+1。
- 宽卷积 (Wide Convolution):步长 s = 1 s=1 s=1,两端补零 p = k − 1 p=k-1 p=k−1,卷积后输出长度为 m + k − 1 m+k-1 m+k−1。
- 等宽卷积 (Equal-Width Convolution):步长 s = 1 s=1 s=1,两端补零 p = k − 1 2 ,卷积后输出长度为 p=\frac{k-1}{2},卷积后输出长度为 p=2k−1,卷积后输出长度为m。
2.2.3 池化层 / 汇聚层
池化层 (Pooling Layer):又称汇聚层
**池化 (Pooling):**属于下采样(Down Sampling)
作用:特征筛选 → 减少特征数量 → 减少后续层参数数量
① 最大池化
最大池化 (Maximum Pooling):取区域内所有神经元最大激活值
② 平均池化 / 均值池化
平均池化 (Mean Pooling):取区域内所有神经元激活值均值
2.2.4 感受野
感受野 (Receptive Field):卷积神经网络每一层输出的特征图 (Feature Map) 上的像素点在输入图片上映射的区域大小。
生物学 - 感受野 :视觉皮层细胞从视网膜上的光感受器接收信号,但单个视觉皮层细胞不会接收光感受器的所有信号,而是只接受其所支配的刺激区域,即感受野内的信号。只有感受野内的刺激才能够激活该神经元。多个视觉皮层细胞通过系统地将感受野叠加,完整接收视网膜传递的信号并建立视觉空间 。
感受野计算公式:
l k = l k − 1 + [ ( f k − 1 ) ∗ ∏ i = 0 k − 1 s i ] l_k=l_{k-1}+[(f_k-1) \ast \prod^{k-1}_{i=0}s_i] lk=lk−1+[(fk−1)∗i=0∏k−1si]
其中 , l k − 1 l_{k-1} lk−1为第 k − 1 k − 1 k−1层对应的感受野大小, f k f_k fk为第 k k k层卷积层的卷积核大小 / 第 k k k层池化层的池化尺寸大小, s i s_i si为步长stride。
感受野绘制工具 (开源)(作者:WZMIAOMIAO)
该工具代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormapdef dilated_conv_one_pixel(center: (int, int),feature_map: np.ndarray,k: int = 3,r: int = 1,v: int = 1):"""膨胀卷积核中心在指定坐标center处时,统计哪些像素被利用到,并在利用到的像素位置处加上增量vArgs:center: 膨胀卷积核中心的坐标feature_map: 记录每个像素使用次数的特征图k: 膨胀卷积核的kernel大小r: 膨胀卷积的dilation ratev: 使用次数增量"""assert divmod(3, 2)[1] == 1# left-top: (x, y)left_top = (center[0] - ((k - 1) // 2) * r, center[1] - ((k - 1) // 2) * r)for i in range(k):for j in range(k):feature_map[left_top[1] + i * r][left_top[0] + j * r] += vdef dilated_conv_all_map(dilated_map: np.ndarray,k: int = 3,r: int = 1):"""根据输出特征矩阵中哪些像素被使用以及使用次数,配合膨胀卷积k和r计算输入特征矩阵哪些像素被使用以及使用次数Args:dilated_map: 记录输出特征矩阵中每个像素被使用次数的特征图k: 膨胀卷积核的kernel大小r: 膨胀卷积的dilation rate"""new_map = np.zeros_like(dilated_map)for i in range(dilated_map.shape[0]):for j in range(dilated_map.shape[1]):if dilated_map[i][j] > 0:dilated_conv_one_pixel((j, i), new_map, k=k, r=r, v=dilated_map[i][j])return new_mapdef plot_map(matrix: np.ndarray):plt.figure()c_list = ['white', 'blue', 'red']new_cmp = LinearSegmentedColormap.from_list('chaos', c_list)plt.imshow(matrix, cmap=new_cmp)ax = plt.gca()ax.set_xticks(np.arange(-0.5, matrix.shape[1], 1), minor=True)ax.set_yticks(np.arange(-0.5, matrix.shape[0], 1), minor=True)# 显示color barplt.colorbar()# 在图中标注数量thresh = 5for x in range(matrix.shape[1]):for y in range(matrix.shape[0]):# 注意这里的matrix[y, x]不是matrix[x, y]info = int(matrix[y, x])ax.text(x, y, info,verticalalignment='center',horizontalalignment='center',color="white" if info > thresh else "black")ax.grid(which='minor', color='black', linestyle='-', linewidth=1.5)plt.show()plt.close()def main():# bottom to topdilated_rates = [1, 2, 3]# init feature mapsize = 31m = np.zeros(shape=(size, size), dtype=np.int32)center = size // 2m[center][center] = 1# print(m)# plot_map(m)for index, dilated_r in enumerate(dilated_rates[::-1]):new_map = dilated_conv_all_map(m, r=dilated_r)m = new_mapprint(m)plot_map(m)if __name__ == '__main__':main()
2.2.5 空洞卷积 / 膨胀卷积
空洞卷积 (Atrous Convolution) / 膨胀卷积 (Dilated Convolution)
作用:增大感受野、保持原输入特征图W、H(Padding后)
卷积神经网络 - 4个核心参数:
- 卷积间隙 (膨胀因子 / 膨胀系数) r r r
- 卷积核大小 k k k
- 填充 p p p
- 步长 s s s
空洞卷积 在语义分割中的应用:
- 图片下采样提取后再上采样还原尺寸
- 下采样倍率不能过大,VGG maxpooling丢失细节信息/目标,上采样无法还原
- maxpooling层去除得到特征图感受野变小,影响后面的卷积层
- 此时需要用到膨胀卷积:既能增加感受野、输入输出矩阵高宽不发生改变
① Gridding Effect 现象
Gridding Effect 现象:感受野间存在不连续间隔
实验一
r 1 = 2 , r 2 = 2 , r 3 = 2 ; k = 3 r_1=2,\space r_2=2,\space r_3=2;\space k=3 r1=2, r2=2, r3=2; k=3
像素利用热度:累加计算L4利用L1像素的次数
r r r相同 → 连续堆叠3层:L4利用L1像素数据并非连续 / 存在间隔 → 丢失细节信息 → 出现 Grid Effect
实验二
r 1 = 1 , r 2 = 1 , r 3 = 1 ; k = 3 r_1=1,\space r_2=1,\space r_3=1;\space k=3 r1=1, r2=1, r3=1; k=3
感受野:累加计算 L4 利用 L1(原始图像) 像素的次数,即为其连续时所能覆盖的大小
该实验中 感受野大小: R F ( R e c e p t i v e F i e l d ) = 7 × 7 RF(Receptive Field) = 7 \times 7 RF(ReceptiveField)=7×7
普通卷积: r = 1 r=1 r=1相同 → 连续堆叠3层:L4利用L1像素数据连续 → 感受野较小
实验三
r 1 = 1 , r 2 = 2 , r 3 = 3 ; k = 3 r_1=1,\space r_2=2,\space r_3=3;\space k=3 r1=1, r2=2, r3=3; k=3
该实验中 感受野大小: R F ( R e c e p t i v e F i e l d ) = 13 × 13 RF(Receptive Field) = 13 \times 13 RF(ReceptiveField)=13×13
r r r相异 → 连续堆叠3层:L4利用L1像素数据连续 → 避免 Grid Effect → 感受野大
结论:当卷积核大小相同时,为空洞卷积设置合适的膨胀系数可增大感受野。
② 如何设计膨胀系数?
论文链接
将上述选取 r r r值过程连续,假设连续堆叠 n n n 个 k × k k \times k k×k 膨胀卷积。
Hybrid Dilated Convolution (HDC) 问题目标:通过一系列堆叠膨胀卷积,最终形成覆盖底层无孔洞方形区域;最终目标 M 2 ≤ K M_2 \le K M2≤K。
若给出待验证的膨胀系数 r ⃗ = [ r 1 , r 2 , … , r n ] \vec{r}=[r_1,r_2,\dots,r_n] r=[r1,r2,…,rn],令 M n = r n M_n=r_n Mn=rn,则从第 n n n层系数一次计算至第 1 1 1层:
M i = m a x [ M i + 1 − 2 r i , M i + 1 − 2 ( M i + 1 − r i ) , r i ] M_i=max[M_{i+1}-2r_i,M_{i+1}-2(M_{i+1}-r_i),r_i] Mi=max[Mi+1−2ri,Mi+1−2(Mi+1−ri),ri]
其中: M M M为第 i i i层两非零元素距离最大值, r i r_i ri为需验证的第 i i i层膨胀系数。
选值一
r 1 = 1 , r 2 = 2 , r 3 = 5 ; k = 3 r_1=1,\space r_2=2,\space r_3=5;\space k=3 r1=1, r2=2, r3=5; k=3
令 M 3 = r 3 = 5 M_3=r_3=5 M3=r3=5,则:
M 2 = m a x [ 5 − 4 , 5 − 2 ( 5 − 2 ) , 2 ] = 2 M 1 = m a x [ 2 − 2 , 2 − 2 ( 2 − 2 ) , 1 ] = 1 \begin{equation} \begin{aligned} M_2 &= max[5-4,5-2(5-2),2]=2 \\ M_1 &= max[2-2,2-2(2-2),1]=1 \end{aligned} \end{equation} M2M1=max[5−4,5−2(5−2),2]=2=max[2−2,2−2(2−2),1]=1
此时:满足条件 M 2 ≤ k M_2 \le k M2≤k,故不存在Grid Effect现象。
选值二
r 1 = 1 , r 2 = 2 , r 3 = 9 ; k = 3 r_1=1,\space r_2=2,\space r_3=9;\space k=3 r1=1, r2=2, r3=9; k=3
令 M 3 = r 3 = 9 M_3=r_3=9 M3=r3=9,则:
M 2 = m a x [ 9 − 4 , 9 − 2 ( 9 − 2 ) , 2 ] = 5 M 1 = m a x [ 5 − 2 , 5 − 2 ( 5 − 2 ) , 1 ] = 3 \begin{equation} \begin{aligned} M_2 &= max[9-4,9-2(9-2),2]=5 \\ M_1 &= max[5-2,5-2(5-2),1]=3 \end{aligned} \end{equation} M2M1=max[9−4,9−2(9−2),2]=5=max[5−2,5−2(5−2),1]=3
此时:不满足条件 M 2 ≤ k M_2 \le k M2≤k,故存在Grid Effect现象。
原因:我们希望高层特征图利用底层所有像素, M 1 M_1 M1在 M 2 − 2 r 1 M_2-2r_1 M2−2r1、 M 2 − 2 ( M 2 − r 1 ) M_2-2(M_2-r_1) M2−2(M2−r1)和 r 1 r_1 r1中取最大,第1层 M 1 = 1 M_1=1 M1=1时无间隙,则 r 1 r_1 r1必须 = 1 =1 =1,倘若 r 1 > 1 r_1>1 r1>1,则 M 1 > 1 M_1>1 M1>1 会出现间隙。
公约数大于1,也会出现 Grid Effect问题,即每层的利用区域未能实现 “交错”。
结论:公约数不能大于1,否则会出现 Grid Effect问题。
选值三(公约数2大于1)
r 1 = 2 , r 2 = 4 , r 3 = 8 ; k = 3 r_1=2,\space r_2=4,\space r_3=8;\space k=3 r1=2, r2=4, r3=8; k=3
令 M 3 = r 3 = 8 M_3=r_3=8 M3=r3=8,则:
M 2 = m a x [ 8 − 8 , 8 − 2 ( 8 − 4 ) , 8 ] = 8 M 1 = m a x [ 4 − 2 , 4 − 2 ( 4 − 2 ) , 2 ] = 2 \begin{equation} \begin{aligned} M_2 &= max[8-8,8-2(8-4),8]=8 \\ M_1 &= max[4-2,4-2(4-2),2]=2 \end{aligned} \end{equation} M2M1=max[8−8,8−2(8−4),8]=8=max[4−2,4−2(4−2),2]=2
此时:不满足条件 M 2 ≤ k M_2 \le k M2≤k,故存在Grid Effect现象。
文章推荐可使用诸如 [ 1 , 2 , 3 , 1 , 2 , 3 ] [1,2,3,1,2,3] [1,2,3,1,2,3]的锯齿结构设计。下图是是否使用准则训练效果的对比情况,可以看出使用准则效果明显优于未使用准则。
2.2.6 可分离卷积
可分离卷积 (Separable Convolutions):包括 空间可分离卷积(Spatially Separable Convolutions) 和 深度可分离卷积(depthwise separable convolution)。
① 空间可分离卷积
空间可分离卷积 (Spatially Separable Convolutions):将卷积核分解为两项独立的核分别进行操作。
利用向量乘法,将3×3卷积核分解为如下两个小卷积核:
[ − 1 0 1 − 2 0 2 − 1 0 1 ] = [ 1 2 1 ] ⋅ [ − 1 0 1 ] \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \\ \end{bmatrix}= \begin{bmatrix} 1 \\ 2 \\ 1 \\ \end{bmatrix} \cdot \begin{bmatrix} -1 & 0 & 1 \end{bmatrix} −1−2−1000121 = 121 ⋅[−101]
计算流程:先用 3 × 1 3\times1 3×1的卷积核作横向扫描计算,再用 1 × 3 1\times3 1×3的卷积核作纵向扫描计算,最后得到结果,其计算量相较于标准卷积更小。
② 深度可分离卷积
深度可分离卷积 (Depthwise Separable Convolutions):由深度卷积和 1 × 1 1\times1 1×1卷积组成。
深度可分卷积(depthwise separable convolution)是卷积神经网络中对标准的卷积计算进行改进所得到的算法,其通过拆分空间维度和通道(深度)维度的相关性,减少了卷积计算所需要的参数个数,并在一些研究中被证实提升了卷积核参数的使用效率。
深度可分卷积的原型可认为来自于卷积神经网络中的Inception模块,其卷积计算分为两部分,首先对通道(深度)分别进行空间卷积(depthwise convolution),并对输出进行拼接,随后使用单位卷积核进行通道卷积(pointwise convolution)以得到特征图。
在应用方面,深度可分卷积被用于微型神经网络的搭建,也被用于大规模卷积神经网络的结构优化。使用深度可分卷积的深度学习算法包括Xception和MobileNet。
第一步:深度卷积
以彩色图像为例,使用3个卷积核分别对输入层的3个通道作卷积计算,再堆叠在一起。
第二步: 1 × 1 1\times1 1×1卷积
1 × 1 1\times1 1×1卷积可以得到只有1个通道的结果,将 1 × 1 1\times1 1×1卷积过程重复多次。
2.2.7 扁平卷积
扁平卷积 (Flattened convolutions):将标准卷积核拆分为3个 1 × 1 1\times1 1×1的卷积核,再分别对输入层进行卷积计算。
2.2.8 分组卷积
分组卷积 (Grouped Convolution):2012年AlexNet论文中最先提出的概念,当时以解决GPU显存不足问题为目的,将卷积分组后放到两个GPU并行执行。
在分组卷积中,卷积核被分成不同的组,每组负责对相应的输入层进行卷积计算,最后再进行合并。
2.2.9 混洗分组卷积
在分组卷积中,卷积核被分成多个组后,输入层卷积计算的结果仍按照原先的顺序进行合并组合,这就阻碍了模型在训练期间特征信息在通道组之间流动,同时还削弱了特征表示。
而 混洗分组卷积 (Shuffled Grouped Convolution) 将分组卷积后的计算结果混合交叉在一起输出。
如下图,在第一层分组卷积 (GConv1) 计算后,得到的特征图先进行拆组,再混合交叉,形成新的结果输入到第二层分组卷积 (GConv2)中。
2.2.10 上采样 vs 下采样
① 上采样
上采样:将低分辨率的图像或特征图放大到原始分辨率的过程。
计算机视觉中,上采样用于图像分割、目标检测和图像生成等任务,可帮助提高模型的准确性和性能。
常见的上采样方法:转置卷积、双线性插值/最近邻插值等。
其中:双线性插值/最近邻插值是较简单的上采样方法,转置卷积则专用于卷积神经网络。
② 下采样
下采样:将高分辨率的图像或特征图缩小到较低分辨率的过程。
计算机视觉中,下采样用于图像分类、目标检测和图像分割等任务,可帮助减少计算量和内存消耗,加快模型训练及推理速度。
作用:一是减少计算量,防止过拟合
二是增大感受野,使得后面的卷积核能够学到更加全局的信息。
常见的下采样方法:卷积操作、平均池化/最大池化等。
其中:池化操作是一种常用的下采样方法,卷积操作也可实现下采样 ( 步长卷积 / 空洞卷积 )
2.2.11 上采样
常见的上采样方法:转置卷积、双线性插值/最近邻插值等。
① 转置卷积
转置卷积 (Transposed Convolution):即 分数步长卷积 (Fractionally-strided Convolution) / 反卷积 (Deconvolution),一种上采样方法,可增大图像的尺寸。转置卷积不是卷积的逆运算,而是通过特定的操作来恢复图像的原始尺寸。
微步卷积
微步卷积 (Fractionally-Strided Convolution): “步长” < 1 <1 <1 的 转置卷积
实现方式:间隙填充 → 在输入特征间插入0 → 间接减少步长
转置卷积默认参数 s = 1 s=1 s=1,参数 s > 1 s > 1 s>1时则转置卷积称为步长为 1 s \frac{1}{s} s1微步卷积,需在输入特征间插入 s − 1 s − 1 s−1行列的0元素使其移动速度变慢。
运算步骤:
- 间隙 填充:在输入特征图元素间填充 s − 1 s-1 s−1行、 s − 1 s-1 s−1列的 0元素
- 四周 填充:在输入特征图四周填充 k − p − 1 k-p-1 k−p−1行、 k − p − 1 k-p-1 k−p−1列的 0元素
- 转置卷积核:将卷积核参数 上下+左右翻转
- 卷积操作:做正常卷积运算
参数一
当 s = 1 , p = 0 , k = 3 s=1,\space p=0,\space k=3 s=1, p=0, k=3 时,执行如下图所示的 转置卷积。
经计算 s − 1 = 0 s-1=0 s−1=0、 k − p − 1 = 2 k-p-1=2 k−p−1=2,故间隙不填充0元素,四周填充2行列0元素。
随后将卷积核参数上下左右翻转,在此基础继续作 步长1 且 填充0 的 正常卷积运算。
参数二
当 s = 2 , p = 0 , k = 3 s=2,\space p=0,\space k=3 s=2, p=0, k=3 时,执行如下图所示的 微步卷积。
经计算 s − 1 = 1 s-1=1 s−1=1、 k − p − 1 = 2 k-p-1=2 k−p−1=2,故间隙填充1行列0元素,四周填充2行列0元素。
随后将卷积核参数上下左右翻转,在此基础继续作 步长1 且 填充0 的 正常卷积运算。
参数三
当 s = 2 , p = 1 , k = 3 s=2,\space p=1,\space k=3 s=2, p=1, k=3 时,执行如下图所示的 微步卷积。
经计算 s − 1 = 1 s-1=1 s−1=1、 k − p − 1 = 1 k-p-1=1 k−p−1=1,故间隙填充1行列0元素,四周填充1行列0元素。
随后将卷积核参数上下左右翻转,在此基础继续作 步长1 且 填充0 的 正常卷积运算。
Pytorch 中 2D转置卷积 实现:
import tortch.nn as nn# 函数参数:in_channels, out_channels, kernel_size, stride, padding, output_padding, dilation, groups
# in_channels: 输入图像特征尺寸
# out_channels: 转置卷积后输出图像特征尺寸
# kernel_size: 转置卷积核尺寸
# stride: 步长 默认值1
# padding: 填充 默认值0 【dilation * (kernel_size - 1) - padding zero-padding will be added to both sides of each dimension in the input. Default: 0】
# bias: 偏置 默认值True
# dilation: 膨胀卷积
nn.ConvTranspose2d()
转置卷积的应用场景
- 无监督学习:用于找到一组核和特征图,以重建图片。
- CNN可视化:将CNN中的特征图还原到像素空间,观察特定的特征图对哪些图案敏感。
- 上采样:在像素级预测任务中,如图像分割和图像生成中,通过上采样还原到原始图片尺寸。
由下图可见,转置卷积增大了图像的尺寸。
② 插值
插值:利用已知数据估计未知位置数值。
最近邻插值
最近邻插值 (Nearest Neighbor Interpolation):对于未知位置,直接采用与它最邻近的像素点的值为其赋值,即缩放前后等比填充。
前提假设:在一个连续变量的空间中,一个点的值可以由离它最近的已知点来估计,其在图像处理中被应用于图像的缩放。
双线性插值
双线性插值 (Bilinear Interpolation):不仅可实现图像缩放;其本质是利用参考周围元素按坐标进行双向线性计算后插值。
坐标转换公式:
s r c X = d s t X ∗ ( s r c W i d t h / d s t W i d t h ) s r c Y = d s t Y ∗ ( s r c H e i g h t / d s t H e i g h t ) srcX=dstX* (srcWidth/dstWidth) \\ srcY = dstY * (srcHeight/dstHeight) srcX=dstX∗(srcWidth/dstWidth)srcY=dstY∗(srcHeight/dstHeight)
其中, s r c X srcX srcX表示原图插值临时坐标, d s t X dstX dstX表示新图坐标, s r c H e i g h t srcHeight srcHeight、 s r c W i d t h srcWidth srcWidth 分别表示原图长宽, d s t H e i g h t dstHeight dstHeight、 d s t W i d t h dstWidth dstWidth 分别表示目标长宽。
双线性插值就是做两次线性变换,先在X轴上做一次线性变换,求出每一行的R点, f ( ⋅ ) f(·) f(⋅)表示对应坐标所在数值:
f ( R 1 ) ≈ x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 12 ) W h e r e R 1 = f ( x , y 1 ) f ( R 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) W h e r e R 1 = f ( x , y 2 ) f(R_1) \approx \frac{x_2-x}{x_2-x_1}f(Q_{11})+\frac{x-x_1}{x_2-x_1}f(Q_{12}) \space\space\space\space Where \space R_1=f(x,y_1) \\ f(R_2) \approx \frac{x_2-x}{x_2-x_1}f(Q_{12})+\frac{x-x_1}{x_2-x_1}f(Q_{22}) \space\space\space\space Where \space R_1=f(x,y_2) f(R1)≈x2−x1x2−xf(Q11)+x2−x1x−x1f(Q12) Where R1=f(x,y1)f(R2)≈x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22) Where R1=f(x,y2)
再通过一次线性变换求出在该区域中的P点:
f ( P ) ≈ y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) f(P) \approx \frac{y_2-y}{y_2-y_1}f(R_1)+\frac{y-y_1}{y_2-y_1}f(R_2) f(P)≈y2−y1y2−yf(R1)+y2−y1y−y1f(R2)
整合所有公式,可得以下计算公式:
f ( x , y ) ≈ ( x 2 − x ) ( y 2 − y ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 11 ) + ( x − x 1 ) ( y 2 − y ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 21 ) + ( x 2 − x ) ( y − y 1 ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 12 ) + ( x − x 1 ) ( y − y 1 ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 22 ) f(x,y) \approx \frac{(x_2-x)(y_2-y)}{(x_2-x_1)(y_2-y_1)}f(Q_{11})+\frac{(x-x_1)(y_2-y)}{(x_2-x_1)(y_2-y_1)}f(Q_{21})+\frac{(x_2-x)(y-y_1)}{(x_2-x_1)(y_2-y_1)}f(Q_{12})+\frac{(x-x_1)(y-y_1)}{(x_2-x_1)(y_2-y_1)}f(Q_{22}) f(x,y)≈(x2−x1)(y2−y1)(x2−x)(y2−y)f(Q11)+(x2−x1)(y2−y1)(x−x1)(y2−y)f(Q21)+(x2−x1)(y2−y1)(x2−x)(y−y1)f(Q12)+(x2−x1)(y2−y1)(x−x1)(y−y1)f(Q22)
如果计算出的点在f中是边缘点,则使用单线性插值,如果不是边缘点,则使用双线性插值。
双三次插值
双三次插值 (Bicubic Interpolation)
Bicubic函数公式:
W ( d ) = { ( a + 2 ) ∣ d ∣ 3 − ( a + 3 ) ∣ d ∣ 2 + 1 f o r ∣ d ∣ ≤ 1 a ∣ d ∣ 3 − 5 a ∣ d ∣ 2 + 8 a ∣ d ∣ − 4 a f o r 1 < ∣ d ∣ < 2 0 o t h e r w i s e W(d)= \begin{equation} \left\{ \begin{array}{ll} (a+2)|d|^3-(a+3)|d|^2+1 & for \space |d| \le 1 \\ a|d|^3-5a|d|^2+8a|d|-4a & for \space 1 \lt|d| \lt 2 \\ 0 & otherwise \end{array} \right. \end{equation} W(d)=⎩ ⎨ ⎧(a+2)∣d∣3−(a+3)∣d∣2+1a∣d∣3−5a∣d∣2+8a∣d∣−4a0for ∣d∣≤1for 1<∣d∣<2otherwise
函数图像如下所示:
假设存在以下图像,需在 P P P点插值。
根据坐标转换公式,求得点P坐标,并将其分割为整数部分和小数部分。
假设 P P P的坐标为 P ( x + u , y + v ) P(x+u,y+v) P(x+u,y+v),其中 x , y x,y x,y分别表示整数部分, u , v u,v u,v分别表示小数部分。
可得到如图所示的最近16个像素的位置,用 a ( i , j ) ( i , j = 0 , 1 , 2 , 3 ) a(i,j)\space \space(i,j=0,1,2,3) a(i,j) (i,j=0,1,2,3) 来表示。
求出BiCubic函数中的参数d,从而获得上面所说的16个像素所对应的权重W(d)。
BiCubic基函数是一元函数,而图像是二维图像,故将像素点的行与列分开计算。
BiCubic函数中的参数 d d d表示该像素点到 P P P点的距离。
例如: ( 0 , 0 ) (0,0) (0,0)距离 P ( x + u , y + v ) P(x+u,y+v) P(x+u,y+v)的距离为 ( 1 + u , 1 + v ) (1+u,1+v) (1+u,1+v),因此a00的横坐标权重 i 0 = W ( 1 + u ) i_0=W(1+u) i0=W(1+u),纵坐标权重 j 0 = W ( 1 + v ) j_0=W(1+v) j0=W(1+v), ( 0 , 0 ) (0,0) (0,0)对 B ( X , Y ) B(X,Y) B(X,Y)的贡献值为: Q 00 ∗ i 0 ∗ j 0 Q_{00} * i_0* j_0 Q00∗i0∗j0。
因此,横坐标权重分别为 W ( 1 + u ) W(1+u) W(1+u), W ( u ) W(u) W(u), W ( 1 − u ) W(1-u) W(1−u), W ( 2 − u ) W(2-u) W(2−u);纵坐标权重分别为 W ( 1 + v ) W(1+v) W(1+v), W ( v ) W(v) W(v), W ( 1 − v ) W(1-v) W(1−v), W ( 2 − v ) W(2-v) W(2−v)。
B ( X , Y ) B(X,Y) B(X,Y)像素值为:
B ( X , Y ) = ∑ i = 0 3 ∑ j = 0 3 a i j × W ( i ) × W ( j ) B(X,Y)=\sum^{3}_{i=0}\sum^{3}_{j=0}a_{ij}\times W(i)\times W(j) B(X,Y)=i=0∑3j=0∑3aij×W(i)×W(j)
③ 反池化
反池化 (Unpooling):池化 (Pooling) 的逆操作,包括 反最大池化 和 反平均池化。
在池化过程中,数据被压缩以减少维度,而在反池化过程中,数据通过恢复被压缩的数据来增加维度。
反池化并不能完全恢复原始数据,它只恢复主要信息,并舍去部分信息。
反最大池化
在池化过程中记录最大激活值的坐标位置,最大反池化时,将最大激活值所在位置坐标值激活,其他的值设置为0。
反平均池化
先还原成原来的大小,再将池化结果中的每个值都填入其对应原始数据区域中相应位置即可。
3. 评估方法
3.1 混淆矩阵
展示模型在各个类别上的预测正确与预测错误的数量,非常直观地反映模型在各类别上的性能,以帮助改进模型。
3.2 精确度
总的正确预测数除以总的预测数。
- 注意:在类别不平衡的情况下,精确度不是唯一的评估标准。
3.3 其他指标
- 召回率 (Recall)
- 精确率 (Precision)
- F1 分数 (F1 Score):精确率和召回率的调和平均。
相关文章:
【Python · PyTorch】卷积神经网络(基础概念)
【Python PyTorch】卷积神经网络 CNN(基础概念) 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…...
Spring Framework 路径遍历漏洞复现(CVE-2024-38819)
hu0x01 产品描述: Spring Framework 是一个功能强大的 Java 应用程序框架,旨在提供高效且可扩展的开发环境。它结合了轻量级的容器和依赖注入功能,提供了一种使用 POJO 进行容器配置和面向切面的编程的简单方法,以及一组用于AOP的模块。0x02 漏洞描述: Spring Framework 存…...
心法利器[122] | 算法面试的八股和非八股讨论
心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2023年新的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2023年文章合集来袭,更…...
实操给自助触摸一体机接入大模型语音交互
本文以CSK6 大模型开发板串口触摸屏为例,实操讲解触摸一体机怎样快速增加大模型语音交互功能,使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音,将语音数据传输…...
AJAX家政系统自营+多商家家政系统服务小程序PHP+Uniapp
一款同城预约、上门服务、到店核销家政系统,用户端、服务端、门店端各端相互依赖又相互独立,支持选择项目、选择服务人员、选择门店多种下单方式,支持上门服务和到店核销两种服务方式,支持自营和多商家联营两种运营模式࿰…...
LiveData源码研究
LiveData 源码分析 前言 用过MVVM的大概知道LiveData可以感知组件的生命周期,当页面活跃时,更新页面数据, 当页面处于非活跃状态,它又会暂停更新,还能自动注册和注销观测者,能有效避免内存泄漏和不必要的…...
Root软件学习
一、命令行输入下方命令打开root文件 root filename.root 二、在root命令行下输入.help查看root下可用的指令 .help输入.q是退出root命令行 .q 三、输入下方指令查看当前打开的root文件的目录 .ls 四、打印Hits树下的内容(print) 方框里是各种树文…...
研发文档管理系统:国内外9大选择比较
文章主要对比了9款国内外研发文档管理系统:1.PingCode; 2. Worktile; 3. 飞书; 4. 石墨文档; 5. 腾讯文档; 6. 蓝湖; 7. Confluence; 8. Notion; 9. Slab。 在企业研发过…...
centos 7.9 freeswitch1.10.9环境搭建
亲测版本centos 7.9系统–》 freeswitch1.10.9 一、下载插件 yum install -y git alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel libdb4-devel e2fsprogs-devel erlang flite-devel g722_1-devel gcc-c++ gdbm-devel gnutls-devel ilbc2...
嵌入式驱动开发详解17(CAN驱动开发)
文章目录 前言CAN简介CAN收发器CAN协议讲解电气特性传输协议数据帧遥控帧错误帧过载帧帧间隔 同步矫正 CAN控制器CAN控制器模式CAN接收器CAN波特率 CAN设备树分析CAN测试后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发,但是由于部分模块的驱动框架过于复…...
探索 Janus-1.3B:一个统一的 Any-to-Any 多模态理解与生成模型
随着多模态技术的不断发展,越来越多的模型被提出以解决跨文本与图像等多种数据类型的任务。Janus-1.3B 是由 DeepSeek 推出的一个革命性的模型,它通过解耦视觉编码并采用统一的 Transformer 架构,带来了一个高度灵活的 any-to-any 多模态框架…...
黑马头条day01 微服务搭建
1.请求调用流程 如http://localhost:8803/static/js/2.0195d7180dc783c3fe99.js这种静态资源,采用http的发送到本地8803端口的静态资源请求,而nginx配置的监听8801、8802、8803,所以请求走到nginx,nginx的admin配置文件 upstream…...
AI辅助编程工具对比:Cursor AI、Windsurf AI 和 GitHub Copilot
功能和特性 1. Cursor AI 基于VS Code构建,集成了GPT-4等多个AI模型,提供高级智能支持。支持AI代码补全、错误修正以及通过自然语言执行命令。具备多文件编辑和上下文理解能力,能够在复杂项目中提供跨文件的智能建议。提供标签功能…...
【Qt】qt安装
在工作一年之后,还是想做一个Qt的教程,遥想研一刚刚接触Qt,从0到1学习,没有什么参考书籍,网上的资料也不多,幸好Qt官方文档写得好,加上自己肯研究,才堪堪入门。 现在我想自己写一个…...
课设项目十:智能手电筒(使用金沙滩51单片机)
00 题目介绍 功能: 硬件设置: 使用51单片机连接光敏传感器、LED灯和手电筒开关按钮。 环境感知: 实时监测周围光照强度。 LED控制: 根据光照强度自动控制LED灯的开关。 手动控制: 提供手电筒开关按钮,…...
Oracle中COUNT函数对NULL和空字符串的处理方式
Oracle中,使用COUNT函数的时候,COUNT()和COUNT(null)得到的结果都是0,也就是说,如果我们COUNT中选择的那列属性中为null的或者的那行是不会被计数的。MySQL中count(null)效果和Oracle中一样,但是count()能正常计数。 在…...
OpenHarmony和OpenVela的技术创新以及两者对比
两款有名的国内开源操作系统,OpenHarmony,OpenVela都非常的优秀。本文对二者的创新进行一个简要的介绍和对比。 一、OpenHarmony OpenHarmony具有诸多有特点的技术突破和重要贡献,以下是一些主要方面: 架构设计创新 分层架构…...
Windows常用命令
该篇文章是博主不断从工作中总结而来,会持续不断更新 文件和目录管理命令 列出指定目录中的文件和子目录:dir 路径 更改当前工作目录:cd 路径 创建新目录:mkdir 目录名 删除空目录:rmdir 目录名 删除指定文件…...
牛客网 SQL2查询多列
SQL2查询多列 select device_id,gender,age,university //查询哪些字段 from user_profile //从哪个表中查找 每日问题 C 中面向对象编程如何处理异常? 在C中,面向对象编程(OOP)处理异常主要通过异常处理机制来实现。C 提供了…...
容器,网络基础
小结: 1、利用网桥和虚拟网卡 2、利用Veth Pair虚拟设备,一个网卡可以直接出现在另外一个网卡中 一个Linux容器能看见的“网络栈”,实际上是被隔离在它自己的Network Namespace当中的 “网络栈”,就包括了:网卡&#…...
Treap树堆【东北大学oj数据结构8-4】C++
题面 二叉搜索树会因为插入的数据的值可能变得不平衡,搜索/插入/删除操作的效率变得低效。例如,如果依次插入 n 个升序的数据,则树将看起来像一个列表,其高度将为 n,并且查询时间变得很长。一个解决策略是随意打乱要插…...
基于STM32的智电表系统课题设计思路:python友好界面、ADC、UART串口、数据分析
1. 项目选题与需求分析 1.1 选题背景和动机 随着社会的快速发展,电力的消耗不断增加,如何高效管理和监测用电成为了一个重要的课题。传统的电表只能提供简单的用电计量,无法满足现代家庭和工业对用电数据实时监控、远程控制及数据分析的需求…...
博弈论1:拿走游戏(take-away game)
假设你和小红打赌,玩“拿走游戏”,输的人请对方吃饭.... 你们面前有21个筹码,放成一堆;每轮你或者小红可以从筹码堆中拿走1个/2个/3个;第一轮你先拿,第二轮小红拿,你们两个人交替进行;拿走筹码堆…...
【人工智能解读】神经网络(CNN)的特点及其应用场景器学习(Machine Learning, ML)的基本概念
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点
Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点 一、引言 在当今的分布式系统开发领域,Spring Cloud和Spring Cloud Alibaba都是极为重要的框架。它们为构建大规模、高可用、分布式的应用系统提供了丰富的工具和组件。本文将深入探讨Spring C…...
Java 泛型
1. 泛型 (1) 泛型:定义类、接口、方法时,同事声明了一个或多个类型变量(如<E>),称为泛型类、泛型接口、泛型方法、它们统称为泛型。可以在编译阶段约束要操作的数据类型 public static void main(String[] args) {//没加泛型 可以放任何…...
CentOS7 搭建 MQTT(mosquitto)环境并收发数据
零:说在前面 最近在研究物联网相关内容,需要接收 Modbus 协议的数据。上游数据源提出由对方整合数据后使用 MQTT 协议将数据发送过来,因此需要了解一下什么是 MQTT。 首先,它是一个类似 kafka 的“发布/订阅”模式的消息框架&…...
操作系统课后习题2.2节
操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度,这个是由CPU的设计和它的硬件来决定的,具体的调度算法是不能提高CPU的效率的; 第3题 互斥性: 指的是进程之间的同步互斥关系,进程是一个动态的过程&#…...
Mac Goland dlv 升级
Mac Goland dlv 升级 问题表现 WARNING: undefined behavior - version of Delve is too old for Go version 1.22.1 (maximum supported version 1.21)查看当前Goland dlv 版本 ☁ ~ /Applications/GoLand.app/Contents/plugins/go-plugin/lib/dlv/mac/dlv version Delve…...
vue使用pdfh5.js插件,显示pdf文件白屏
pdfh5,展示文件白屏,无报错 实现效果图解决方法(降版本)排查问题过程发现问题查找问题根源1、代码写错了?2、预览文件流的问题?3、pdfh5插件更新了,我的依赖包没更新?4、真相大白 彩蛋 实现效果图 解决方法…...
【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )
文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…...
[Unity Shader] 【游戏开发】【图形渲染】Unity Shader的种类2-顶点/片元着色器与固定函数着色器的选择与应用
Unity 提供了不同种类的 Shader,每种 Shader 有其独特的优势和适用场景。在所有类型的 Shader 中,顶点/片元着色器(Vertex/Fragment Shader)与固定函数着色器(Fixed Function Shader)是两种重要的着色器类型。尽管它们具有不同的编写方式和用途,理解其差异与应用场景,对…...
Unity 动画曲线研究(Dotween插件)
动画的曲线的介绍 动画曲线(Animation Curve)是一种用于描述动画属性值随时间变化的图形工具。 我们可以通过给自己的动画片段设定不同的动画曲线,使动画效果具有不同表现力。 常见的动画曲线设定有: 线性(Linear&…...
适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)
目录 一、前期准备所需环境配置 1.1. 虚拟环境创建 1.2 下载yolov8源码,在pycharm中进行配置 1.2.1 下载源码 1.2.2 在pycharm终端中配置conda 1.3 在pycharm的terminal中激活虚拟环境 1.4 安装requirements.txt中的相关包 1.5 pip安装其他包 1.6 预训练…...
Linux中输入和输出基本过程
1.文件内核级缓冲区 前面在如何理解Linux一切皆文件的特点中提到为了保证在Linux中所有进程访问文件时的方式趋近相 同,在f ile 结构体中存在一个 files_operations 结构体指针,对应的结构体保存所有文件操作的函 数指针(这个结构体也被称为…...
二、FIFO缓存
FIFO缓存 1.FIFO缓存介绍2.FIFO缓存实现3.FIFO缓存总结 1.FIFO缓存介绍 FIFO(First-In-First-Out)缓存 是一种简单的缓存淘汰策略,它基于先进先出的原则来管理数据。当缓存达到容量限制并需要淘汰元素时,最先进入缓存的元素会被移…...
Linux_挂载nas
1、安装挂载nas必要的服务 yum -y install nfs-utils rpcbind 2、挂载nas sudo mount -t nfs -o vers3,nolock,prototcp,noresvport <NAS-IP>:/path/to/shared /yourNasPath mount 命令详解: -t :文件系统类型 ,这里指定的挂载类…...
uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…...
现代密码学总结(上篇)
现代密码学总结 (v.1.0.0版本)之后会更新内容 基本说明: ∙ \bullet ∙如果 A A A是随机算法, y ← A ( x ) y\leftarrow A(x) y←A(x)表示输入为 x x x ,通过均匀选择 的随机带运行 A A A,并且将输出赋给 y y y。 ∙ \bullet …...
按照字幕拆解视频实战
1. 基本实现思路 字幕文件处理: 提取字幕内容和时间戳(如 SRT 文件格式)。解析字幕中的开始时间和结束时间。 视频切割: 使用字幕的时间戳,剪辑对应时间段的视频。每段字幕对应一个子视频。 输出子视频: …...
2.11.静态链表
一.静态链表的基本概念: 1.上图说明:索引为0处是头结点,头结点不存储数据,但存储下一个结点的数组下标,本例中头结点里存储的下一个结点的数组下标为2,即索引为2的结点为头结点后的第一个结点,以…...
分页查询在数据库中的好处
分页查询在数据库中的好处主要体现在以下几个方面: 提高性能: 减少数据传输:分页查询只返回请求的页面数据,而不是整个数据集,这减少了网络传输的数据量,降低了网络延迟和带宽消耗。减少内存使用࿱…...
电子应用设计方案-54:智能AI人工智能机器人系统方案设计
智能 AI 人工智能机器人系统方案设计 一、引言 随着人工智能技术的快速发展,智能 AI 机器人在各个领域的应用越来越广泛。本方案旨在设计一个功能强大、智能高效、交互友好的人工智能机器人系统,以满足不同场景下的用户需求。 二、系统概述 1. 系统目标…...
μC/OS-Ⅱ源码学习(6)---事件标志组
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 本文进一步解析事件模型中,事件标志…...
ASP.NET|日常开发中读写TXT文本详解
ASP.NET|日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET|日常开发中…...
《C 语言向量运算:点亮人工智能几何计算之路》
在人工智能蓬勃发展的时代,数学运算作为其坚实的基石发挥着不可替代的作用。而向量的点积与叉积运算,更是在人工智能的几何计算领域有着独特且关键的地位。今天,就让我们一同深入探讨如何在 C 语言中实现向量的点积、叉积运算,并领…...
HarmonyOS 获取进程相关的信息process 常用的几个方法
获取进程相关的信息,提供进程管理的相关功能。 process 1. EventListener 2. isIsolatedProcess 3. is64Bit 4. getStartRealtime 5. getPastCpuTime 导入模块 import { process } from kit.ArkTS; 属性 名称类型可读可写说明uidnumber是否进程的用户标识。…...
Linux 权限管理实践:精确控制用户对 systemctl 和 journalctl 命令的使用
前言 在 Linux 系统管理中,精确控制用户对特定命令的访问权限是一项关键的安全实践。使用 systemctl 和 journalctl 命令时,不当的权限设置可能会导致不必要的风险。本篇博客将详细讨论如何通过 sudoers 文件和 Polkit 策略为不同用户配置 systemctl 和…...
图像处理之滤波
中值滤波、均值滤波、高斯滤波和双边滤波是常见的图像处理技术,主要用于去噪和图像平滑。低通滤波和高通滤波用于处理图像中的频率成分。它们的主要区别在于它们所允许通过的频率范围。滤波、卷积、去噪、模糊、提取特征是一个意思。 卷积就是两个矩阵的乘法&#…...
html基础-认识html
1.什么是html html是浏览器可以识别的的标记语言,我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…...