深度学习中的超参数调优与卷积神经网络基础
1. 超参数调优的思考
在进行超参数调优时,要充分运用自身经验,或者向有经验的人寻求帮助。盲目投入时间和资源去尝试那些已知不会有效的参数组合是没有意义的。例如,花费时间测试极小的学习率,比测试接近 1 的学习率更有价值。因为每一轮网络训练都需要时间,即便结果可能并无用处。
调优的目的并非是得到可能的最佳模型,而是让你了解调优过程是如何运作的。你可以继续尝试不同的优化器(如 Adam),考虑更广泛的参数范围以及更多的参数组合等。
1.1 径向基函数参数 l 的作用
径向基函数的形式为:$K(x_i, x) = e^{-\frac{1}{2\sigma^2} |x - x_i|^2}$,理解参数 l 的作用非常重要。在一些例子中,选择 l = 2,但未说明原因。实际上,l 的取值会对采集函数产生不同影响:
-
l 过小
:采集函数会在已知点周围形成非常狭窄的峰值,使得点之间的方差几乎恒定,算法几乎总是选择点之间的中点。
-
l 过大
:对采集函数有平滑作用,会使方差变小,在某些采集函数中难以使用,例如 l = 5 时,采集函数几乎恒定。
通常,避免 l 取值过小或过大是很好的做法,以保证在已知点之间有平滑变化的方差。典型的取值范围在 1 或 2 左右。
2. 卷积神经网络与循环神经网络简介
传统的全连接网络在许多基础任务(如图像识别、语音识别、时间序列预测等)中表现不佳。而卷积神经网络(CNNs)和循环神经网络(RNNs)是当今常用的先进架构。
2.1 卷积神经网络的核心组件 - 核与滤波器
CNNs 的主要组件之一是滤波器,也称为核,通常是 $n_K \times n_K$ 的方阵,$n_K$ 一般是较小的数,如 3 或 5。下面定义了四种不同的 3×3 滤波器:
-
水平边缘检测核
:$I_H = \begin{bmatrix} 1 & 1 & 1 \ 0 & 0 & 0 \ -1 & -1 & -1 \end{bmatrix}$
-
垂直边缘检测核
:$I_V = \begin{bmatrix} 1 & 0 & -1 \ 1 & 0 & -1 \ 1 & 0 & -1 \end{bmatrix}$
-
亮度急剧变化边缘检测核
:$I_L = \begin{bmatrix} -1 & -1 & -1 \ -1 & 8 & -1 \ -1 & -1 & -1 \end{bmatrix}$
-
图像边缘模糊核
:$I_B = -\frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \ 1 & 1 & 1 \ 1 & 1 & 1 \end{bmatrix}$
2.2 卷积操作
理解 CNNs 的第一步是理解卷积。在神经网络中,卷积是在张量之间进行的操作,输入两个张量,输出一个张量,通常用运算符 ∗ 表示。
2.2.1 相同维度张量的卷积
当两个张量都是 3×3 时,卷积操作的公式为:
$\begin{bmatrix} a_1 & a_2 & a_3 \ a_4 & a_5 & a_6 \ a_7 & a_8 & a_9 \end{bmatrix} * \begin{bmatrix} k_1 & k_2 & k_3 \ k_4 & k_5 & k_6 \ k_7 & k_8 & k_9 \end{bmatrix} = \sum_{i=1}^{9} a_i k_i$
用更典型的矩阵形式表示为:
$\begin{bmatrix} a_{11} & a_{12} & a_{13} \ a_{21} & a_{22} & a_{23} \ a_{31} & a_{32} & a_{33} \end{bmatrix} * \begin{bmatrix} k_{11} & k_{12} & k_{13} \ k_{21} & k_{22} & k_{23} \ k_{31} & k_{32} & k_{33} \end{bmatrix} = \sum_{i=1}^{3} \sum_{j=1}^{3} a_{ij} k_{ij}$
2.2.2 不同维度矩阵的卷积
以一个 4×4 的矩阵 $A$ 和 3×3 的核 $K$ 为例,卷积过程如下:
1. 从矩阵 $A$ 的左上角开始,选择一个 3×3 的区域 $A_1$,进行卷积得到 $B_1$。
2. 将 3×3 区域向右移动一列,选择新的区域 $A_2$,进行卷积得到 $B_2$。
3. 当无法再向右移动时,将区域向下移动一行,从左边开始,选择区域 $A_3$,进行卷积得到 $B_3$。
4. 最后再将区域向右移动一列,选择区域 $A_4$,进行卷积得到 $B_4$。
最终,$B_1$、$B_2$、$B_3$ 和 $B_4$ 构成卷积操作的结果张量 $B$。
2.2.3 步长(Stride)的概念
在上述过程中,每次将 3×3 区域向右移动一列和向下移动一行,这个移动的行数和列数称为步长,通常用 s 表示。例如,s = 2 表示将 3×3 区域向右移动两列和向下移动两行。
卷积操作中,输出矩阵 $B$ 的维度计算公式为:$n_B = \lfloor \frac{n_A - n_K}{s} + 1 \rfloor$,其中 $\lfloor x \rfloor$ 表示 x 的整数部分。
2.3 卷积操作的 Python 实现
以下是一个简单的 Python 函数,用于计算步长 s = 1 时两个矩阵的卷积:
import numpy as np
def conv_2d(A, kernel):
output = np.zeros([A.shape[0]-(kernel.shape[0]-1), A.shape[1]-(kernel.shape[0]-1)])
for row in range(1, A.shape[0]-1):
for column in range(1, A.shape[1]-1):
output[row-1, column-1] = np.tensordot(A[row-1:row+2, column-1:column+2], kernel)
return output
你可以使用以下代码测试这个函数:
A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
K = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(conv_2d(A, K))
2.4 卷积操作示例
2.4.1 创建测试图像
我们创建一个 160×160 像素的棋盘图像作为测试图像,代码如下:
chessboard = np.zeros([8*20, 8*20])
for row in range(0, 8):
for column in range(0, 8):
if ((column + 8*row) % 2 == 1) and (row % 2 == 0):
chessboard[row*20:row*20+20, column*20:column*20+20] = 1
elif ((column + 8*row) % 2 == 0) and (row % 2 == 1):
chessboard[row*20:row*20+20, column*20:column*20+20] = 1
2.4.2 应用不同核进行卷积
- 水平边缘检测 :
edgeh = np.matrix('1 1 1; 0 0 0; -1 -1 -1')
outputh = conv_2d(chessboard, edgeh)
- 垂直边缘检测 :
edgev = np.matrix('1 0 -1; 1 0 -1; 1 0 -1')
outputv = conv_2d(chessboard, edgev)
- 亮度急剧变化边缘检测 :
edgel = np.matrix('-1 -1 -1; -1 8 -1; -1 -1 -1')
outputl = conv_2d(chessboard, edgel)
- 图像边缘模糊 :
edge_blur = -1.0/9.0 * np.matrix('1 1 1; 1 1 1; 1 1 1')
output_blur = conv_2d(chessboard, edge_blur)
通过这些示例,可以看到不同核在卷积操作中的作用。例如,使用核 $I_V$ 对一个具有明显垂直过渡的矩阵进行卷积,可以清晰地检测到过渡位置。
| 核类型 | 作用 | 核矩阵 |
|---|---|---|
| 水平边缘检测核 $I_H$ | 检测水平边缘,判断从亮到暗或反之的过渡 | $\begin{bmatrix} 1 & 1 & 1 \ 0 & 0 & 0 \ -1 & -1 & -1 \end{bmatrix}$ |
| 垂直边缘检测核 $I_V$ | 检测垂直边缘,判断从亮到暗或反之的过渡 | $\begin{bmatrix} 1 & 0 & -1 \ 1 & 0 & -1 \ 1 & 0 & -1 \end{bmatrix}$ |
| 亮度急剧变化边缘检测核 $I_L$ | 检测亮度急剧变化时的边缘 | $\begin{bmatrix} -1 & -1 & -1 \ -1 & 8 & -1 \ -1 & -1 & -1 \end{bmatrix}$ |
| 图像边缘模糊核 $I_B$ | 模糊图像边缘 | $-\frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \ 1 & 1 & 1 \ 1 & 1 & 1 \end{bmatrix}$ |
2.5 卷积操作流程图
graph TD;
A[输入矩阵 A] --> B[选择 3×3 区域];
B --> C[与核 K 进行卷积];
C --> D[得到结果 B1];
D --> E{是否可右移};
E -- 是 --> F[右移一列,选择新区域];
F --> C;
E -- 否 --> G{是否可下移};
G -- 是 --> H[下移一行,从左开始选择区域];
H --> C;
G -- 否 --> I[结束,得到结果张量 B];
综上所述,超参数调优和卷积神经网络的基础操作是深度学习中非常重要的部分。了解这些知识可以帮助你更好地进行模型训练和优化。
3. 边缘检测原理深入分析
3.1 垂直边缘检测示例
为了更深入地理解边缘检测的原理,我们以一个具有明显垂直过渡的矩阵为例。考虑如下矩阵:
ex_mat = np.matrix('10 10 10 10 0 0 0 0; 10 10 10 10 0 0 0 0; 10 10 10 10 0 0 0 0; 10 10 10 10 0 0 0 0; 10 10 10 10 0 0 0 0; 10 10 10 10 0 0 0 0; 10 10 10 10 0 0 0 0; 10 10 10 10 0 0 0 0')
对这个矩阵使用垂直边缘检测核 $I_V$ 进行卷积:
edgev = np.matrix('1 0 -1; 1 0 -1; 1 0 -1')
ex_out = conv_2d(ex_mat, edgev)
得到的结果为:
array([[ 0., 0., 30., 30., 0., 0.],
[ 0., 0., 30., 30., 0., 0.],
[ 0., 0., 30., 30., 0., 0.],
[ 0., 0., 30., 30., 0., 0.],
[ 0., 0., 30., 30., 0., 0.],
[ 0., 0., 30., 30., 0., 0.]])
从结果可以看出,卷积操作清晰地检测到了矩阵中的垂直过渡。当输入矩阵没有明显过渡时,如左上角的区域,卷积结果为 0;而在有明显过渡的区域,卷积结果为非零值。
3.2 边缘检测原理详解
以 $B_{11}$ 和 $B_{13}$ 为例进行分析:
-
$B_{11}$ 的计算
:
在输入矩阵中选择左上角的 3×3 区域,由于该区域内所有值都为 10,没有过渡,所以卷积结果为 0。
$B_{11} = \begin{bmatrix} 10 & 10 & 10 \ 10 & 10 & 10 \ 10 & 10 & 10 \end{bmatrix} * \begin{bmatrix} 1 & 0 & -1 \ 1 & 0 & -1 \ 1 & 0 & -1 \end{bmatrix} = 10\times1 + 10\times0 + 10\times(-1) + 10\times1 + 10\times0 + 10\times(-1) + 10\times1 + 10\times0 + 10\times(-1) = 0$
-
$B_{13}$ 的计算
:
选择包含过渡的 3×3 区域 $\begin{bmatrix} 10 & 10 & 0 \ 10 & 10 & 0 \ 10 & 10 & 0 \end{bmatrix}$,由于该区域存在从 10 到 0 的过渡,卷积结果为 30。
$B_{13} = \begin{bmatrix} 10 & 10 & 0 \ 10 & 10 & 0 \ 10 & 10 & 0 \end{bmatrix} * \begin{bmatrix} 1 & 0 & -1 \ 1 & 0 & -1 \ 1 & 0 & -1 \end{bmatrix} = 10\times1 + 10\times0 + 0\times(-1) + 10\times1 + 10\times0 + 0\times(-1) + 10\times1 + 10\times0 + 0\times(-1) = 30$
当矩阵中存在从大值到小值的过渡时,卷积结果为正值;反之,从小值到大值的过渡,卷积结果为负值。例如,若考虑相反的过渡(从 0 到 10),卷积结果为 -30。
3.3 边缘检测总结
通过上述分析,我们可以总结出边缘检测的原理:当矩阵中存在明显的数值变化时,卷积操作会返回较高的绝对值;而在数值均匀的区域,卷积结果接近 0。不同的核可以检测不同方向和类型的边缘,如水平边缘检测核 $I_H$、垂直边缘检测核 $I_V$ 等。
4. 总结与应用建议
4.1 超参数调优总结
- 超参数调优需要结合经验,避免无效的参数组合。
- 考虑不同的优化器和更广泛的参数范围,以了解调优过程。
- 对于径向基函数中的参数 l,取值应避免过小或过大,典型值在 1 或 2 左右。
4.2 卷积神经网络总结
- 卷积神经网络的核心组件包括核与滤波器,不同的核可以实现不同的功能,如图像边缘检测和模糊。
- 卷积操作是在张量之间进行的,通过移动核在输入矩阵上进行计算,步长决定了核的移动方式。
- 可以使用 Python 实现卷积操作,通过不同的核和输入矩阵进行测试,观察卷积结果。
4.3 应用建议
- 在实际应用中,根据具体任务选择合适的超参数和核。例如,在图像识别任务中,可以使用边缘检测核来提取图像的特征。
- 对于复杂的任务,可以尝试不同的优化器和参数组合,通过实验找到最佳的模型配置。
- 在实现卷积操作时,可以使用现有的深度学习框架(如 TensorFlow),以提高效率和准确性。
4.4 应用步骤表格
| 步骤 | 操作内容 |
|---|---|
| 1 | 确定任务类型,如边缘检测、图像模糊等。 |
| 2 | 选择合适的核,如 $I_H$、$I_V$、$I_L$ 或 $I_B$。 |
| 3 | 准备输入矩阵,如创建测试图像或使用实际图像数据。 |
| 4 | 实现卷积操作,可以使用自定义函数或深度学习框架。 |
| 5 | 分析卷积结果,根据结果调整参数或选择不同的核。 |
4.5 整体流程 mermaid 图
graph LR;
A[超参数调优] --> B[确定调优策略];
B --> C[选择参数范围];
C --> D[进行训练和评估];
D --> E{结果是否满意};
E -- 否 --> C;
E -- 是 --> F[卷积神经网络应用];
F --> G[选择核类型];
G --> H[准备输入矩阵];
H --> I[进行卷积操作];
I --> J[分析结果];
J --> K{是否需要调整};
K -- 是 --> G;
K -- 否 --> L[完成任务];
通过对超参数调优和卷积神经网络基础的学习,我们可以更好地理解深度学习中的关键概念,并将其应用到实际的任务中。不断实践和探索,将有助于我们在深度学习领域取得更好的成果。
超级会员免费看
2万+

被折叠的 条评论
为什么被折叠?



