【深度解析→博文总结】李宏毅机器学习2023作业02Classification(Framewise Phoneme Prediction)

2023-10-29

【系列文章】

【深度解析→博文总结】李宏毅机器学习2023作业01Regression(COVID-19 Cases Prediction)
【深度解析→博文总结】李宏毅机器学习2023作业03CNN(Image Classification)
【深度解析→博文总结】李宏毅机器学习2023作业04Self-attention(Speaker Identification)
【深度解析→博文总结】李宏毅机器学习2023作业05Transformer(Machine Translation)

【简要说明】

1、本次博客总结记录作业02Classification的调参经验,如下图所示,最终本人的模型方案在Public Test和Private Test都达到了Boss Baseline【Public排名第6,分数0.85201>0.83017;Private排名第4,分数0.85240>0.83058】,欢迎入门和深入机器学习知识的朋友们能在评论区多多交流,共同进步。
在这里插入图片描述

2、本人是从事基于深度学习相关研究的一名博士,目前博士在读第5年。深感自己在机器学习/深度学习理论知识实际调参经验方面都不够系统,今年希望能够跟随李宏毅教授的机器学习2023的作业在理论和实践方面都得到提升。
3、本次博文总结主要记录3种模式的方法处理Framewise Phoneme Prediction问题时的调参心得与历程,3种方法的大致架构如下图所示,第1、2种为能够达到Strong Baseline的方法,第3种为能够达到Boss Baseline的方法。
在这里插入图片描述
4、第1种为助教样例代码里的全连接层堆叠的方法,第2种方法为将全连接层(除最后一层)替换为LSTM层提取时序特征,这种方法主要是把最后一层LSTM的最后时刻的隐层特征(Pytorch代码中表示为h_n)输入到全连接层映射到对应类别数,模型输入需要在第1种的助教样例代码里加入Reshape函数进行处理,是Frame-wise Classification的方法,第3种方法与第2种结构相似,不同之处在于是把最后一层LSTM的输出(Pytorch代码中表示为output)输入到全连接层映射到对应类别数,模型输入需要自行整理代码实现数据预处理(即把每一段语音序列切割成等长的子序列用于训练),是Sequence-wise Classification的方法。

【视频分享】

如果在文章上想把Boss Baseline的方法讲明白,那可能需要好几万甚至几十万字,因为可能需要先讲明白前两种方法,加上涉及的领域知识会有点多,字数太多了也不利于阅读。因此,录制了以下3期视频,系统梳理上述3种方法。

【深度解析→视频分享】李宏毅机器学习2023作业02Classification-第一期

【深度解析→视频分享】李宏毅机器学习2023作业02Classification-第二期

【深度解析→视频分享】李宏毅机器学习2023作业02Classification-第三期

【作业详情】

1、【作业简介】李宏毅教授的助教也将作业02Classification进行了详细的介绍,包括:作业内容解读、Kaggle提交介绍、代码调参提示和样例代码详解,视频已搬运至知乎和B站,详情见【知乎】【B站】。
2、【先修视频】:该作业在李宏毅教授课程官网列了五个先修视频(是李宏毅老师2021年的机器学习课程视频,课程网页:https://speech.ee.ntu.edu.tw/~hylee/ml/2021-spring.php),但我个人觉得其视频整理的有点问题,包括2021年的课程网址上整理的也有问题,因为我仔细看过了,认为先修视频应该是共有六个,【建议】按照我整理的顺序进行观看。因为B站上转载视频总是撞车导致无法上传,我只能按顺序整理到知乎上了【先修视频01】【先修视频02】【先修视频03】【先修视频04】【先修视频05】【先修视频06】。
3、【强烈建议】:以上六个先修视频建议在做作业二之前全部认真看一遍,并建议在做作业过程中调参无法继续有效时,返回去反复观看以上六个先修视频,这样是有助于在实践中掌握如何有效调参。作为过来人,本人非常不建议按照所谓打卡的形式对机器学习/深度学习系列的视频进行机械式的观看(哪怕是李宏毅老师这么趣味性的讲解都会容易坚持不下去),务必注意理论知识观看顺序、动手实践作业调参,这样有助于系统掌握机器学习/深度学习。
4、【Boss Baseline先修视频】:在本人的知乎主页还上传了另外7个先修视频,2个是李宏毅老师2020年课程网页的RNN讲解视频(实际录制时间是2017年,最后一次正式出现在课程网址是2020年了),另外5个是之前学习看到过的王树森老师的RNN相关讲解视频。如果想要本次作业达到Boss Baseline的话,建议按顺序过一下这些视频:【先修视频07】【先修视频08】【先修视频09】【先修视频10】【先修视频11】【先修视频12】【先修视频13】。

【调参记录】

【Simple Baseline:0.49798】

1、第1种模式的方法下:直接跑通助教的样例代码,这里concat_nframes在样例代码中为3,即可达到Simple Baseline,下图是我的提交记录截图在这里插入图片描述2、第2种模式的方法下:这里将concat_nframes设置为11了(模型输入需要在第1种的助教样例代码里加入Reshape函数进行处理,其它保持与样例代码一致),即可达到Simple Baseline,下图是我的提交记录截图在这里插入图片描述

【Medium Baseline:0.66440】

1、第1种模式的方法下:修正样例代码错误&concat_nframes设置为11&Epoch数为30&使用Report Question提示的Wider模型(设置hidden_layers = 2,hidden_dim = 1750)即可达到Medium Baseline,下图是我的提交记录截图在这里插入图片描述2、第2种模式的方法下:修正样例代码错误&concat_nframes设置为11&Epoch数为30&使用双向LSTM(模型输入需要在第1种的助教样例代码里加入Reshape函数进行处理,其它保持与样例代码一致),即可达到Medium Baseline,下图是我的提交记录截图在这里插入图片描述

【Stong Baseline:0.74944】

1、第1种模式的方法下:concat_nframes设置为43&Epoch数为3000&设置hidden_layers = 6,hidden_dim = 1750&学习率初始值为1e-3&添加BN和Dropout(设置drop_rate为0.5),即可达到Stong Baseline,下图是我的提交记录截图在这里插入图片描述2、第2种模式的方法下:concat_nframes设置为35&Epoch数为30&使用双向GRU&hidden_layers = 8,hidden_dim = 256&dropout_rate=0.5,(模型输入需要在第1种的助教样例代码里加入Reshape函数进行处理,其它保持与样例代码一致),即可达到Stong Baseline,下图是我的提交记录截图在这里插入图片描述第2种模式的方法对应的核心代码如下:Reshape函数位于Classifier定义中forward()函数的第二行,其它部分均与样例代码保持一致即可。

import torch.nn as nn
import torch


class BasicBlock(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(BasicBlock, self).__init__()

        # TODO: apply batch normalization and dropout for strong baseline.
        # Reference: https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm1d.html (batch normalization)
        #       https://pytorch.org/docs/stable/generated/torch.nn.Dropout.html (dropout)
        self.block = nn.Sequential(
            nn.Linear(input_dim, output_dim),
            nn.ReLU(),
        )

    def forward(self, x):
        x = self.block(x)
        return x


class Classifier(nn.Module):
    def __init__(self, input_dim, output_dim=41, hidden_layers=1, hidden_dim=256, drop_rate=0):
        super(Classifier, self).__init__()
        self.lstm = nn.GRU(input_size=39, hidden_size=hidden_dim, num_layers=hidden_layers, bidirectional=True,
                            batch_first=True, dropout=drop_rate)
        self.fc = nn.Linear(hidden_dim*2, output_dim)

        # self.fc = nn.Sequential(
        #     BasicBlock(input_dim, hidden_dim),
        #     *[BasicBlock(hidden_dim, hidden_dim) for _ in range(hidden_layers)],
        #     nn.Linear(hidden_dim, output_dim)
        # )

    def forward(self, x):
        b = x.shape[0]
        x = x.view(b, -1, 39)  # b,l*hin ==>b,l,hin
        x, h_n = self.lstm(x, None)  # x:b,l,h  h_n:d*num_layer,b,h
        # x = x[:, -1, :]  # final state of final layer  ==>  x:b,h
        x_fd = h_n[-2, :, :]  # forward final state of final layer  ==>  x:b,h
        x_bd = h_n[-1, :, :]  # backward final state of final layer  ==>  x:b,h
        out = self.fc(torch.cat([x_fd, x_bd], dim=-1))
        return out

【Boss Baseline:0.83017】

1、根据验证集的指标看(这次的作业根据计算的验证集的Acc和测试集的Acc进行对比,发现两者基本是相等的,当我没有在验证集上获得大幅提升的更好的结果时,比如0.8,我就没有去进行提交),第1种模式的方法下,我这边预计能调到最佳的结果为0.773左右;第2种模式的方法下,我这边预计能调到最佳的结果为0.789左右。
2、第3种模式的方法下,模型输入需要自行整理代码实现数据预处理(即把每一段语音序列切割成等长的子序列用于训练):切割子序列长度为100&切割步长为40&&Epoch数为300&使用双向GRU&hidden_layers = 10,hidden_dim = 115&dropout_rate=0.4&学习率初始值为1e-3&使用CosineAnnealingLR策略&train_ratio=0.85&使用标签平滑正则化,最终提交结果为0.83205,下图是我的提交记录截图在这里插入图片描述使用3个模型Ensemble策略提交的记录如博客最上方的图所示,结果是0.85201(Public Test排名第6),如果切割子序列长度继续增加、顺着hidden_layers = 10,hidden_dim = 115继续微调模型、Ensemble模型个数再增加一两个,应该可以继续提升分数,当然,如果升级模型采用Transformer的结构,应该分数也会得到进一步提升。

【资源链接】

【2023机器学习】的系列资料包括 视频、课件、代码 等资源已经系统顺序命名并整理到百度网盘:https://pan.baidu.com/s/1-zfs0wn5rccTRVk34YZWaA,提取码:2023。

【写在最后】

【原创&整理不易,我的是文章如果有帮到你,或者你觉得还不错,麻烦点赞&关注支持下(你的支持将是激励我坚持创作的动力之一)】
【通过Strong Baseline和Boss Baseline的完整训练+测试的代码可私信获取】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度解析→博文总结】李宏毅机器学习2023作业02Classification(Framewise Phoneme Prediction) 的相关文章

随机推荐

  • 《统计学习方法》笔记(十三)--EM

    EM本身是一种迭代算法 目的是实现含有隐变量的模型参数的极大似然估计 以及后验分布的众数 EM也可以用来补全缺失的数据集 在此不做重点考虑 算法描述 输入 观测变量数据Y 隐含变量Z 联合分布P Y Z theta 条件分布P Z Y th
  • Python学习路线图(2022年最新版)

    这是我刚开始学习python时的一套学习路线 从入门到上手 一 Python入门 环境搭建 变量 数据类型 二 Python运算符 条件结构 循环结构 三 Python函数 四 做一次综合练习 做一个控制台的员工管理 需求 员工管理系统功能
  • (c语言)static的用法详解

    前言 static是静止的 静态的意思 那它有什么用呢 今天我们来了解了解 1 修饰局部变量 修饰局部变量时 局部变量出了作用域 不销毁 变量生命周期变长 变成整个程序的生命周期 本质上 static修饰局部变量的时候 改变了变量的存储位置
  • vue-oss阿里云上传图片

    先搭建vue框架 配置路由 添加图片上传页面链接 添加图片上传页面 然后进行以下操作 1 首先到阿里云上面开通oss服务 2 安装ali oss包 vue项目根目录下执行命令 npm install ali oss save 安装ali o
  • win10+uefi+gpt安装一键GHOST之后无法重启的快速解决方法(无需重装系统无需修复引导)

    今天装完常用软件后 准备一键备份一下系统 就从一键GOST官网下载安装了一键GHOST 安装完成之后提示不支持UEFI GPT格式系统 但仍可以使用 就没在意 也没卸载 接着就重启电脑试一试 结果就出现了无法进入系统引导的情况 折腾一番BI
  • [Java]生成32位随机字符ID

    生成32位编码 return string public static String getUUID String uuid UUID randomUUID toString trim replaceAll return uuid 自定义规
  • The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received

    我项目错误原因是项目里关于连接数据库有多个 properties文件 没有指定哪一个 就默认执行application properties了 而application properties是生产数据库 我连不上 我的解决办法是这样的在这里
  • Unity官方文档笔记(二)编辑器功能

    一 Preference 1 1 General 属性 功能 Auto Refresh 启用此设置可在资源更改时自动更新资源 Load Previous Project on Startup 启用此设置可在启动时始终加载上一个项目 Comp
  • 【译】在 React Hooks 中使用 useReducer 的几种用例

    原文 How to use useReducer in React Hooks for performance optimization github 的地址 欢迎 star React Hook 出来已经有一段时间了 具体的一些用法以及它
  • 如何确定自己是否适合做程序员?怎样知道自己到底喜不喜欢编程?将来要以此为工作?

    如何确定自己是否适合做程序员 怎样知道自己到底喜不喜欢编程 将来要以此为工作 程序员成长的必备条件 程序员的工作 说到底就是要编出满足需求的程序 如果这项工作你做得好 你就发展得好 所以 程序员的成长 都是围绕着 编出满足需求的程序来展开的
  • 关机对话框字体大小不跟随显示设置变化的修改

    现象描述 设置 显示 显示大小 最大 按电源键的关机 弹出确认框 android 12中原生去掉了关机确认对话框的的显示 但是客户头铁非要显示 询问MTK回答客制代码只能自己解决 只能自己搞定 贴了代码 仅供参考 在ShutdownThre
  • 普通文件下载 + 前端获取后端返回的文件流并下载

    参考资料 前端接受后端文件流并下载的几种方法 ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践 ajax请求二进制流进行处理 ajax异步下载文件 response setHeader 的
  • JavaScript的学习笔记

    JavaScript的学习笔记 学习B站上狂神的视频记录的笔记 1比较运算符 console log 1 1 true 判断的时候值相等 类型不同也是true console log 1 1 false 值相等且类型相同 才为true 2严
  • arcgis 字段计算器 条件赋值_ARCGIS中字段计算器的使用说明

    Field Calculator 工具可以在属性表字段点击右键 选择 Field Calculator 或者Data Management Tools gt fields gt Calculate Field打开 1 基本函数 针对数值型
  • 谷歌开发者工具之功能面板

    Network 面板 用的最多的面板 可查看 Ajax 请求 页面访问时间线等等 Performance 面板 查看JS性能 详情可看我的另一篇文章 如何使用谷歌浏览器开发者工具中的Performance分析网页性能 Rendering 面
  • 华为OD机试 - 恢复数字序列(Python)

    题目描述 对于一个连续正整数组成的序列 可以将其拼接成一个字符串 再将字符串里的部分字符打乱顺序 如序列8 9 10 11 12 拼接成的字符串为89101112 打乱一部分字符后得到90811211 原来的正整数10就被拆成了0和1 现给
  • C#中List常用方法:判断存在、查找、排序

    项目常用List来进行数据操作管理 有一些方法经常百度 所以这里记录下 目录 1 List判断元素是否存在 返回bool 2 List查找 返回对象 3 List排序 4 对象属性打印 5 List 其他方法 1 List判断元素是否存在
  • 程序员的自我修养——链接,装载与库

    章节目录 静态链接 编译和链接 目标文件 静态链接 windows COFF 装载和动态链接 可执行文件的装载与进程 动态链接 Linux共享库的组织 Windows下的动态链接 库与运行库 内存 运行库 系统调用与API 运行库实现 一
  • 【C++入门】引用符&详解

    1 C 的 引用符介绍 1 符号在C语言中表示取地址运算 2 C 对 符号进行拓展 符号新增了引用的用法 3 声明引用时 必须同时对其进行初始化 4 引用声明完毕后 相当于目标变量有两个名称 引用名就相当于变量的别名 操作引号名就相当于操作
  • 【深度解析→博文总结】李宏毅机器学习2023作业02Classification(Framewise Phoneme Prediction)

    文章目录 系列文章 简要说明 视频分享 作业详情 调参记录 Simple Baseline 0 49798 Medium Baseline 0 66440 Stong Baseline 0 74944 Boss Baseline 0 830