上采样中常用方法

1、Upsampling(上采样)

上采样概念:上采样指的是任何可以让图像变成更高分辨率的技术。简单来说就是把一张小图片放大。
对于这种上采样(up-sampling)操作,目前有着一些常见插值方法进行处理:

  1. 最近邻插值(Nearest neighbor interpolation)
  2. 双线性插值(Bi-Linear interpolation)

最近邻插值(Nearest neighbor interpolation)

最邻插值法是最简单的灰度值插值,也称作零阶插值。就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。计算简单,但不够精确。

例如,下图中我们已知4个像素的灰度值(i,j),(i+1,j),(i,j+1),(i+1,j+1)

在这里插入图片描述

现在我们有个一待求点(i+u,j+v)(其中u,v为0到1之间的小数),如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。

最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

双线性插值法

先简单讲一下线性插值法:已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值(反过来也是一样,略):
在这里插入图片描述
上面公式还是相对好理解的,如果没看明白简单画一个XY坐标系就清楚了,我在就省略了。

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。见下图:

在这里插入图片描述
现在假设有一个函数 f(x,y),我们想要得到点P(x0,y0)的值,而我们又已知Q11(x1,y1),Q12(x1,y2),Q21(x2,y1)以及Q22(x2,y2)四个点的关于函数 f 函数值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来是对上图中红色框中公式的推导,剩下公式的推导都是同样的一个方法,在本文中就省略了。

首先为了方便理解,先画出坐标轴,因为 f 是关于x,y的函数,所以需要画出三个轴。
在这里插入图片描述

有了直观的理解之后,我们从y轴负半轴看向正半轴,提出 f 轴和x轴来处理。
在这里插入图片描述
其中上图中的 2 式可以通过相似三角形的知识获得。

反卷积

反卷积又称为转置卷积(Transposed Convolution)和部分跨越卷积(Fractionally-strided Convolution)。
如果我们想要我们的网络可以学习到最好地上采样的方法,我们这个时候就可以采用转置卷积。这个方法不会使用预先定义的插值方法,它具有可以学习的参数。

卷积操作

让我们回顾下卷积操作是怎么工作的,并且我们将会从一个小例子中直观的感受卷积操作。假设我们有一个4 × 4的矩阵,我们将在这个矩阵上应用3 × 3的卷积核,并且不添加任何填充(padding),步进参数(stride)设置为1,就像下图所示,输出为一个2 × 2的矩阵。

在这里插入图片描述
这个卷积操作在输入矩阵和卷积核中,对每个元素的乘积进行相加。因为我们没有任何填充和使用1为步进,因此我们只能对这个操作进行4次,因此我们的输出矩阵尺寸为2×2。
在这里插入图片描述
这种卷积操作使得输入值和输出值之间存在有位置上的连接关系,举例来说,输入矩阵左上方的值将会影响到输出矩阵的左上方的值。更具体而言,3×3的卷积核是用来连接输入矩阵中的9个值,并且将其转变为输出矩阵的一个值的。一个卷积操作是一个多对一(many-to-one)的映射关系。让我们记住这个,我们接下来将会用得着。

反向操作

现在,假设我们想要反过来操作。我们想要将输入矩阵中的一个值映射到输出矩阵的9个值,这将是一个一对多(one-to-many)的映射关系。这个就像是卷积操作的反操作,其核心观点就是用转置卷积。举个例子,我们对一个2 × 2的矩阵进行上采样为4 × 4的矩阵。这个操作将会维护一个1对应9的映射关系。
在这里插入图片描述
因此就结论而言,卷积操作是多对一,而转置卷积操作是一对多,如下图所示,每一个“对”而言,都需要维护一个权值。

在这里插入图片描述
但是我们将如何具体操作呢?为了接下来的讨论,我们需要定义一个卷积矩阵(convolution matrix)和相应的转置卷积矩阵(transposed convolution matrix)。

卷积矩阵

一个卷积操作我们可以将其转化为矩阵的相乘。这个表示很简单,就是将卷积核重新排列为一个普通矩阵。如下图就是原始的卷积核:
在这里插入图片描述
我们对这个3 × 3的卷积核进行重新排列,得到了下面这个4 × 16的卷积矩阵:

在这里插入图片描述
这个便是卷积矩阵了,这个矩阵的每一行都定义了一个卷积操作,与没有进行转化前的卷积操作是完全一致的。下图将会更加直观地告诉你这个重排列是怎么进行的。每一个卷积矩阵的行都是通过重新排列卷积核的元素,并且添加0补充(zero padding)进行的。

在这里插入图片描述
对卷积核进行转化之后,接下来就是对特征图进行转化,使其能够与卷积矩阵进行向量乘法。如下图,我们将输入矩阵4 × 4摊平(flatten)为一个列向量,形状为16 × 1。

在这里插入图片描述
我们可以将这个4 × 16的卷积矩阵和1 × 16的输入列向量进行矩阵乘法,这样我们就得到了输出列向量。
在这里插入图片描述
这个输出的4 × 1的矩阵可以重新塑性为一个2 × 2的矩阵,而这个矩阵正是和我们一开始通过传统的卷积操作得到的一模一样。
在这里插入图片描述
简单来说,这个卷积矩阵除了重新排列卷积核的权重之外就没有啥了,然后卷积操作可以通过表示为卷积矩阵和输入矩阵的列向量形式的矩阵乘积形式进行表达。

所以各位发现了吗,关键点就在于这个卷积矩阵,你可以从16(4 × 4)到4(2 × 2)因为这个卷积矩阵尺寸正是4 × 16的,然后呢,如果你有一个16 × 4的矩阵,你就可以从4(2 × 2)到16(4 × 4)了,这不就是一个上采样的操作吗?啊哈!让我们继续吧!

转置卷积矩阵

我们想要从4(2 × 2)到16(4 × 4),因此我们使用了一个16 × 4的矩阵,但是还有一件事情需要注意,我们是想要维护一个1到9的映射关系。

假设我们转置这个卷积矩阵C (4 ×16)变为CT (16 × 4)。我们可以对CT和列向量(4 × 1)进行矩阵乘法,从而生成一个16 × 1的输出矩阵。这个转置矩阵正是将一个元素映射到了9个元素。
在这里插入图片描述
这个输出可以塑形为 (4×4) 的矩阵:
在这里插入图片描述
我们只是对小矩阵(2×2)进行上采样为一个更大尺寸的矩阵(4×4)。这个转置卷积矩阵维护了一个1个元素到9个元素的映射关系,因为这个关系正表现在了其转置卷积元素上。

需要注意的是:这里的转置卷积矩阵的参数,不一定从原始的卷积矩阵中简单转置得到的,也可以随机初始化,因为上文就已经提到反卷积是可以进行权值更新的。转置这个操作只是提供了转置卷积矩阵的形状而已。

总结

从本质来说,转置卷积不是一个卷积,但是我们可以将其看成卷积,并且当成卷积这样去用。我们通过在输入矩阵中的元素之间插入0进行补充,从而实现尺寸上采样,然后通过普通的卷积操作就可以产生和转置卷积相同的效果了。你在一些文章中将会发现他们都是这样解释转置卷积的,但是这个因为在卷积操作之前需要通过添加0进行上采样,因此是比较低效率的。

在此附加一张填充0之后进行卷积操作的反卷积图片,通过这种方法也能够达到反卷积效果。
在这里插入图片描述

需要注意的是,转置卷积会导致生成图像中出现棋盘效应(checkerboard artifacts),棋盘效应就留到下篇博文中介绍吧。

本博文参考于以下文章:
图像的插值算法之最近邻插值:https://blog.csdn.net/linqianbi/article/details/78593724
三十分钟理解:线性插值,双线性插值Bilinear Interpolation算法:https://blog.csdn.net/xbinworld/article/details/65660665
一文搞懂反卷积,转置卷积:https://blog.csdn.net/LoseInVain/article/details/81098502

### 常见的上采样方法及其应用场景 在机器学习和数据分析领域,特别是在处理不平衡数据集时,上采样是一种常见的技术。以下是几种常用上采样方法以及它们的应用场景。 #### 1. 随机过采样 (Random Over-Sampling) 随机过采样是最简单的上采样方法之一,它通过重复少数类样本直到达到所需的平衡比例来增加少数类的数量。这种方法简单易行,但在某些情况下可能导致模型过度拟合,因为相同的样本被多次使用[^5]。 ```python from imblearn.over_sampling import RandomOverSampler ros = RandomOverSampler(random_state=42) X_resampled, y_resampled = ros.fit_resample(X, y) ``` #### 2. 合成少数类过采样技术 (SMOTE) 合成少数类过采样技术(Synthetic Minority Over-sampling Technique, SMOTE)通过在少数类样本附近生成新样本而不是简单复制现有样本来进行上采样。这有助于减少由随机过采样引起的过度拟合风险[^6]。 ```python from imblearn.over_sampling import SMOTE smote = SMOTE(random_state=42) X_smote, y_smote = smote.fit_resample(X, y) ``` #### 3. 边界线SMOTE (Borderline-SMOTE) 边界线SMOTE是对SMOTE的一种改进版本,专注于仅对那些靠近决策边界的少数类实例进行增强。这样可以进一步降低噪声的影响并提高分类性能[^7]。 ```python from imblearn.over_sampling import BorderlineSMOTE bsmote = BorderlineSMOTE(random_state=42) X_bsmote, y_bsmote = bsmote.fit_resample(X, y) ``` #### 4. 自适应合成抽样 (ADASYN) 自适应合成抽样(Adaptive Synthetic Sampling Approach, ADASYN)类似于SMOTE,但它会根据每个少数类样本周围的多数类邻居数量动态调整生成的新样本数。这意味着更难区分的区域会被赋予更多的注意力[^8]。 ```python from imblearn.over_sampling import ADASYN adasyn = ADASYN(random_state=42) X_ada, y_ada = adasyn.fit_resample(X, y) ``` #### 应用场景分析 - **金融欺诈检测**: 使用SMOTE或ADASYN可以帮助识别稀有的欺诈行为模式。 - **医疗诊断**: 对于罕见疾病的数据集,采用适当的方法如边界线SMOTE可能改善预测准确性。 - **客户流失预测**: 当保留客户的成本较高而流失率较低时,合理运用上述任一方法均能有效提升建模效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值