音频样本分类的机器学习探索
在机器学习领域,为了构建有效的模型,我们常常需要尝试不同的技术和方法。下面将围绕音频样本分类这一案例,详细介绍相关的技术尝试和模型优化过程。
初始化、正则化和批量归一化
在处理数据集时,我们已经成功运用了数据增强和Dropout技术。此外,还可以尝试新的初始化策略——He初始化,它通常比Keras默认的Glorot初始化效果更好。同时,也可以应用L2正则化,Keras将其实现为每层的权重衰减。
-
设置初始化算法
:在Conv2D和第一个Dense层中添加
kernel_initializer="he_normal"。 -
添加L2正则化
:在Conv2D和第一个Dense层中添加
kernel_regularizer=keras.regularizers.l2(0.001),其中λ = 0.001,λ是L2正则化的缩放因子。
分别测试这两种方法,训练六个模型后得到的整体准确率如下:
| 正则化方法 | 准确率 |
| — | — |
| He初始化 | 78.5 ± 0.5% |
| L2正则化 | 78.3 ± 0.4% |
从统计角度看,这些结果与之前的结果没有差异,说明在这个特定的小数据集上,这些方法既没有带来好处,也没有造成损害。
批量归一化是机器学习社区广泛使用的一种经过充分测试的技术。它的作用正如其名,对网络层的输入进行归一化,减去每个特征的均值并除以每个特征的标准差。层的输出将归一化后的输入乘以一个常数并加上一个偏移量。其净效果是通过两步过程将输入值映射到新的输出值:先归一化输入,然后应用线性变换得到输出。线性变换的参数在反向传播过程中学习。在推理时,将从数据集中学习到的均值和标准差应用于未知输入。
在Keras中使用批量归一化,只需在网络的卷积层和全连接层之后(以及这些层使用的任何激活函数之后,如ReLU)插入批量归一化层。由于批量归一化与Dropout不能很好地配合使用,因此需要移除Dropout层。以下是相关的模型代码:
from keras.layers import BatchNormalization
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu', input_shape=input_shape))
model.add(BatchNormalization())
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(num_classes, activation='softmax'))
重复训练过程,得到使用批量归一化的整体准确率为75.56 ± 0.59%,明显低于不使用批量归一化但使用Dropout的平均准确率。
混淆矩阵分析
我们的数据集具有一定的挑战性,数据增强和Dropout技术是有效的,但ReLU特定的初始化、L2正则化和批量归一化等方法并没有改善模型性能。这并不意味着这些技术无效,只是它们在这个特定的小数据集上效果不佳。
以下是使用所选架构的一个模型生成的混淆矩阵:
| Class | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| — | — | — | — | — | — | — | — | — | — | — |
| 0 | 85.6 | 0.0 | 0.0 | 5.6 | 0.0 | 0.0 | 0.0 | 5.0 | 0.6 | 3.1 |
| 1 | 0.0 | 97.5 | 1.2 | 0.0 | 0.6 | 0.6 | 0.0 | 0.0 | 0.0 | 0.0 |
| 2 | 0.0 | 13.8 | 72.5 | 0.6 | 0.6 | 3.8 | 6.2 | 0.0 | 0.6 | 1.9 |
| 3 | 25.0 | 0.0 | 0.0 | 68.1 | 0.0 | 2.5 | 0.6 | 0.0 | 2.5 | 1.2 |
| 4 | 0.6 | 0.0 | 0.0 | 0.0 | 84.4 | 6.2 | 5.0 | 3.8 | 0.0 | 0.0 |
| 5 | 0.0 | 0.0 | 0.6 | 0.0 | 0.0 | 94.4 | 4.4 | 0.6 | 0.0 | 0.0 |
| 6 | 0.0 | 0.0 | 1.2 | 0.0 | 0.0 | 10.6 | 88.1 | 0.0 | 0.0 | 0.0 |
| 7 | 9.4 | 0.0 | 0.6 | 0.0 | 15.6 | 1.9 | 0.0 | 63.8 | 7.5 | 1.2 |
| 8 | 18.1 | 1.9 | 0.0 | 5.6 | 0.0 | 1.2 | 2.5 | 6.9 | 55.6 | 8.1 |
| 9 | 7.5 | 0.0 | 8.1 | 0.6 | 0.0 | 0.6 | 0.0 | 1.9 | 10.0 | 71.2 |
表现最差的三个类别是直升机(8)、火(7)和海浪(3)。海浪和直升机最常被误分类为雨(0),而火最常被误分类为时钟(4)和雨。表现最好的类别是公鸡(1)和打喷嚏(5)。这些结果是合理的,因为公鸡的啼鸣声和人的打喷嚏声是独特的声音,很少有其他声音与之相似。而海浪和直升机的声音容易与雨声混淆,火的噼啪声也容易与时钟的滴答声混淆。
集成学习
虽然目前模型的准确率为78.8%,但我们可以尝试集成学习来进一步提高准确率。集成学习的核心思想是将在相同或极其相似的数据集上训练的多个模型的输出进行组合,体现了“群体智慧”的概念。一个模型可能在某些类别或特定类别的输入类型上比另一个模型更擅长,因此它们协同工作可能会得到比单个模型更好的最终结果。
我们将使用之前的机器学习架构,不同的模型是对该架构的单独训练,输入为频谱图。这是一种较弱形式的集成学习,通常集成中的模型彼此差异较大,例如不同的神经网络架构或完全不同类型的模型,如随机森林和k近邻。这里模型之间的差异是由于网络的随机初始化以及训练停止时网络所处的损失景观的不同部分造成的。
集成学习的步骤如下:
1. 使用频谱图数据集训练多个模型(n = 6)。
2. 以某种方式组合这些模型在测试集上的softmax输出。
3. 使用组合后的输出预测分配的类别标签。
我们希望组合各个模型输出后分配的类别标签集优于单独使用模型架构分配的类别标签集。
以下是几种组合模型输出的方法:
-
平均法
:
p0 = np.load("prob_run0.npy")
p1 = np.load("prob_run1.npy")
p2 = np.load("prob_run2.npy")
p3 = np.load("prob_run3.npy")
p4 = np.load("prob_run4.npy")
p5 = np.load("prob_run5.npy")
y_test = np.load("esc10_spect_test_labels.npy")
prob = (p0 + p1 + p2 + p3 + p4 + p5) / 6.0
p = np.argmax(prob, axis=1)
得到的百分比混淆矩阵如下:
| Class | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| — | — | — | — | — | — | — | — | — | — | — |
| 0 | 83.8 | 0.0 | 0.0 | 7.5 | 0.0 | 0.0 | 0.0 | 4.4 | 0.0 | 4.4 |
| 1 | 0.0 | 97.5 | 1.9 | 0.0 | 0.0 | 0.6 | 0.0 | 0.0 | 0.0 | 0.0 |
| 2 | 0.0 | 10.0 | 78.1 | 0.0 | 0.0 | 3.1 | 6.2 | 0.0 | 0.0 | 2.5 |
| 3 | 9.4 | 0.0 | 0.0 | 86.2 | 0.0 | 3.1 | 0.6 | 0.0 | 0.0 | 0.6 |
| 4 | 0.6 | 0.0 | 0.0 | 0.0 | 83.1 | 5.6 | 5.0 | 5.6 | 0.0 | 0.0 |
| 5 | 0.0 | 0.0 | 0.0 | 0.0 | 0.6 | 93.8 | 5.6 | 0.0 | 0.0 | 0.0 |
| 6 | 0.0 | 0.0 | 0.6 | 0.0 | 0.0 | 8.8 | 90.6 | 0.0 | 0.0 | 0.0 |
| 7 | 8.1 | 0.0 | 0.0 | 0.0 | 17.5 | 1.9 | 0.0 | 64.4 | 7.5 | 0.6 |
| 8 | 6.2 | 0.0 | 0.0 | 7.5 | 0.0 | 1.9 | 4.4 | 8.8 | 66.2 | 5.0 |
| 9 | 5.0 | 0.0 | 5.0 | 1.2 | 0.0 | 0.6 | 0.0 | 1.9 | 10.6 | 75.6 |
整体准确率为82.0%,该方法将整体准确率从79%提高到了82%,在类别3(海浪)和类别8(直升机)上的改进最为显著。
- 最大值法 :
p = np.zeros(len(y_test), dtype="uint8")
for i in range(len(y_test)):
t = np.array([p0[i], p1[i], p2[i], p3[i], p4[i], p5[i]])
p[i] = np.argmax(t.reshape(60)) % 10
得到的整体准确率为81.6%。
- 投票法 :
t = np.zeros((6, len(y_test)), dtype="uint32")
t[0, :] = np.argmax(p0, axis=1)
t[1, :] = np.argmax(p1, axis=1)
t[2, :] = np.argmax(p2, axis=1)
t[3, :] = np.argmax(p3, axis=1)
t[4, :] = np.argmax(p4, axis=1)
t[5, :] = np.argmax(p5, axis=1)
p = np.zeros(len(y_test), dtype="uint8")
for i in range(len(y_test)):
q = np.bincount(t[:, i])
p[i] = np.argmax(q)
得到的整体准确率为81.7%。
这三种集成方法都显著提高了模型的准确率,简单地组合模型输出使准确率比单个基础模型提高了约3%,证明了集成技术的实用性。
模型进展与总结
不同模型及其整体准确率的进展如下:
| 模型 | 数据源 | 准确率 |
| — | — | — |
| 高斯朴素贝叶斯 | 1D音频样本 | 28.1% |
| 随机森林(1000棵树) | 1D音频样本 | 34.4% |
| 1D卷积神经网络 | 1D音频样本 | 54.0% |
| 2D卷积神经网络 | 频谱图 | 78.8% |
| 集成(平均法) | 频谱图 | 82.0% |
这个表格展示了现代深度学习的强大力量以及将其与经过验证的经典方法(如集成学习)相结合的实用性。
深入探索机器学习
卷积神经网络的进一步探索
虽然之前对卷积神经网络(CNN)有了一定的了解,但实际上我们只是触及了CNN功能的表面。部分原因是为了让大家掌握基础知识而进行了限制,另一部分原因是我们有意识地决定不依赖GPU进行训练。使用GPU训练复杂模型通常比使用CPU快20到25倍。如果系统中配备了专门为深度学习应用设计的GPU,那么可能性将大大增加。
之前开发的模型规模较小,类似于20世纪90年代LeCun开发的原始LeNet模型。这些模型虽然能说明问题,但在很多情况下效果有限。现代CNN有多种类型和“标准”架构,借助GPU可以探索这些更大的架构。以下是一些值得关注的架构:
- ResNet
- U-Net
- VGG
- DenseNet
- Inception
- AlexNet
- YOLO
幸运的是,之前介绍的Keras工具包支持所有这些架构。其中,ResNet和U-Net似乎特别有用,U-Net用于输入的语义分割,在医学成像领域取得了广泛的成功。要在计算机的电源或硬盘不堪重负之前成功训练这些架构,确实需要GPU。中等至高端的游戏GPU(如NVIDIA的产品)支持较新的CUDA版本,花费不到500美元就可以购买到合适的显卡。关键是要确保计算机能够支持该显卡,其功率要求较高,通常需要600W或更高功率的电源,以及支持双宽PCIe卡的插槽。建议优先考虑GPU的RAM,因为GPU的RAM越多,能支持的模型就越大。
即使不升级系统以配备GPU,也值得研究上述架构,了解它们的独特之处以及额外层的工作原理。更多详细信息可查看Keras文档:keras.io。
强化学习和无监督学习
之前的内容主要涉及监督学习,在机器学习的三个主要分支中,监督学习可能是应用最广泛的。但这并不意味着强化学习和无监督学习不重要。
监督学习就像大家都熟知的Groucho(马克思兄弟之一),但我们不能忽视强化学习和无监督学习这两个分支。强化学习通过智能体与环境的交互来学习最优策略,在游戏、机器人控制等领域有广泛应用。无监督学习则用于发现数据中的模式和结构,如聚类分析、降维等。
通过不断探索这些不同的学习方法和架构,我们可以进一步拓展机器学习的知识和应用能力,为解决更复杂的问题奠定基础。
音频样本分类的机器学习探索
不同学习方法的特点与应用场景
为了更清晰地了解监督学习、强化学习和无监督学习的区别,我们可以通过以下表格进行对比:
| 学习方法 | 特点 | 应用场景 |
| — | — | — |
| 监督学习 | 有明确的输入和对应的输出标签,通过训练数据学习输入与输出之间的映射关系 | 图像分类、语音识别、情感分析等 |
| 强化学习 | 智能体通过与环境交互,根据环境反馈的奖励信号来学习最优策略 | 游戏、机器人控制、自动驾驶等 |
| 无监督学习 | 数据没有明确的标签,通过发现数据中的模式和结构来进行学习 | 聚类分析、降维、异常检测等 |
了解这些不同学习方法的特点和应用场景,有助于我们在面对不同的问题时选择合适的学习方法。例如,如果我们有大量带有标签的音频数据,并且目标是对音频进行分类,那么监督学习可能是一个不错的选择;如果我们想要训练一个智能体来控制音频播放设备,根据用户的反馈来优化播放策略,那么强化学习可能更适合;如果我们想要发现音频数据中的潜在模式,例如将相似的音频聚类在一起,那么无监督学习将发挥作用。
迈向更高水平的机器学习
虽然我们已经对机器学习有了一定的了解,但这仅仅是一个开始。机器学习是一个不断发展和演进的领域,新的技术和方法不断涌现。为了跟上这个领域的发展步伐,我们可以采取以下步骤:
1.
持续学习
:关注机器学习领域的最新研究成果和技术动态,阅读相关的学术论文、博客文章和书籍。可以订阅一些知名的机器学习期刊和会议,如NeurIPS、ICML等,及时了解最新的研究进展。
2.
实践项目
:通过实际项目来应用所学的知识,不断提高自己的实践能力。可以参与开源项目,或者自己动手解决一些实际问题。在实践过程中,遇到问题时查阅相关的文档和资料,不断积累经验。
3.
交流合作
:加入机器学习社区,与其他爱好者和专业人士交流经验和想法。可以参加线下的技术聚会、研讨会,或者在在线社区中参与讨论。与他人合作完成项目,不仅可以学习到他人的经验和技巧,还可以拓宽自己的视野。
未来展望
随着技术的不断进步,机器学习将在更多的领域得到应用。例如,在医疗领域,机器学习可以帮助医生进行疾病诊断和治疗方案的制定;在金融领域,机器学习可以用于风险评估和投资决策;在交通领域,机器学习可以推动自动驾驶技术的发展。
同时,机器学习也面临着一些挑战,如数据隐私、算法偏见等问题。我们需要在享受机器学习带来的便利的同时,关注这些问题,并采取相应的措施来解决它们。
总之,机器学习是一个充满机遇和挑战的领域。通过不断学习和实践,我们可以掌握更多的机器学习知识和技能,为解决实际问题做出贡献。未来,让我们一起探索机器学习的更多可能性,创造更加美好的世界。
graph LR
A[持续学习] --> B[关注最新研究成果]
A --> C[阅读学术论文和书籍]
D[实践项目] --> E[参与开源项目]
D --> F[解决实际问题]
G[交流合作] --> H[加入机器学习社区]
G --> I[参加线下活动]
G --> J[参与在线讨论]
K[机器学习未来应用] --> L[医疗领域]
K --> M[金融领域]
K --> N[交通领域]
O[机器学习挑战] --> P[数据隐私]
O --> Q[算法偏见]
这个流程图展示了迈向更高水平机器学习的步骤、机器学习的未来应用以及面临的挑战,帮助我们更直观地理解相关内容。通过持续学习、实践项目和交流合作,我们可以不断提升自己的能力,应对未来的机遇和挑战。
超级会员免费看
729

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



