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

2023-11-14

【系列文章】

【深度解析→博文总结】李宏毅机器学习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) 的相关文章

随机推荐

  • MATLAB求矩阵最大、最小值

    矩阵求最大 最小值用max min函数 max A min A 返回行向量 求每列最大 最小值 max A B min A B 返回一个A B中比较大 较小元素组成的矩阵 max A dim min A dim dim 1 比较A的列 di
  • PowerOJ 2543: 赛场布置

    题目链接 对于每个点 它可以选择男或者女 如果要加上的贡献 那么相邻的一定得是异性才可以 所以 对相邻的 我们可以考虑成 然后 我们对于点坐标的的奇偶性分别讨论即可 当然 还需要考虑的贡献 然后就是全选减去最少割去的即可 include
  • iOS面试题(2.类变量的@protected,@private,@public,@package声明各有什么含义)拓展:常用框架和第三方框架

    2 类变量的 protected private public package声明各有什么含义 private 作用范围只能在自身类 protected 作用范围在自身类和继承自己的子类 默认 public 作用范围最大 可以在任何地方被访
  • nginx匹配以XXX结尾的

    匹配以do结尾的所有文件 如http 192 168 126 168 8080 delivery transportPlanData do startRelease 2019 07 06 endRelease 2019 07 06 sear
  • 初识Composer

    文章目录 依赖管理工具Composer 参考 1 简介 2 安装Composer 3 声明和安装依赖 4 自动加载 5 模块仓库 依赖管理工具Composer 参考 Composer 中文网 Packagist 中国全量镜像官方 地址htt
  • cygwin的git vscode中的使用

    背景 需要用到cygwin 编辑器是vscode 版本 vscode 版本1 55 cygwin版本2 11 2 1 cygcheck c cygwin cygwin的git2 17 cygcheck c git vscode报错 open
  • 算法篇-------贪心2

    文章目录 题目1 活动选择 题目2 无重叠区间 题目3 最多可以参加的会议数目 题目4 去除重复字母 题目5 移掉K位数字 题目6 拼接最大数 题目1 活动选择 有n个需要在同一天使用同一个教室的活动a1 a2 an 教室同一时刻只能由一个
  • linux指令_龙红云

    一 基础指令 1 ls指令 ls 列出当前目录下的所有文件 文件夹的名字 ls root 列出root下的所有文件 文件夹的名字 ls l 以详细列表的形式展示 ls la ls a 显示所有文件 文件夹 包含了隐藏文件 文件夹 ls lh
  • Spring学习总结

    因为是学习总结 所以参考了很多资料做的博客 如果有侵权 请联系我 写的不对的欢迎指出 Spring 开源的轻量级框架 Spring核心 IOC 控制反转控 制反转还有一个名字叫做DI Dependency Injection 中文意思叫依赖
  • Python轻量级Web框架Flask(9)——图书馆项目

    1 项目要求 创建一个项目 用来说明出版社 书籍和作者的关系 作者和书籍之间的关系 1对多 一本书由一个作者完成 一本书可以有多个创作者 出版社和书籍之间的关系 多对多 一个出版社可以出版多本书 一本书可以由多个出版社出版 要求 1 在书籍
  • React项目开发常用API

    记录一下React项目开发常用API 作为后续开发的参考 路由配置 配置文件形式 router index js import React lazy Suspense from react Suspense配合lazy实现懒加载 const
  • Golang 微框架 Gin 简介

    框架一直是敏捷开发中的利器 能让开发者很快的上手并做出应用 甚至有的时候 脱离了框架 一些开发者都不会写程序了 成长总不会一蹴而就 从写出程序获取成就感 再到精通框架 快速构造应用 当这些方面都得心应手的时候 可以尝试改造一些框架 或是自己
  • element-ui的table动态渲染表头

  • ruoyi管理系统+微信小程序登录解决

    原料 ruoyi管理系统项目模板 基于springboot 微信小程序项目 阿里云服务器 有域名 有ssl证书 阿里云服务器的ssl证书可以买一个仅限一年免费的那个证书 注意事项 1 微信小程序调用云服务器接口需要https csdn ne
  • Android:usb转232串口通信

    准备工作 首先得adb进入盒子root模式 将 dev ttys1这个文件改为777 使得所有用户可操作 adb root adb remount adb shell 进入设备的root模式 执行 chmod 777 dev ttys1 执
  • 项目 谷粒学院Day16-18

    Day 16 07 13 统计分析模块 后台 准备工作 创建统计表 创建service statistics模块 使用代码生成器生成代码 创建启动类 SpringBootApplication ComponentScan basePacka
  • 《Hadoop权威指南》书摘-HDFS概述

    转载请注明出处 独立博客 http wangnan tech 简书 http www jianshu com u 244399b1d776 知乎 https zhuanlan zhihu com c 121958856 设计 超大文件 已经
  • pthread_cond_timedwait

    pthread cond timedwait pthread cond signal
  • Keepalived的权值问题(priority与weight)

    在Keepalived集群中 其实并没有严格意义上的主 备节点 虽然可以在Keepalived配置文件中设置 state 选项为 MASTER 状态 但是这并不意味着此节点一直就是Master角色 控制节点角色的是Keepalived配置文
  • 【深度解析→博文总结】李宏毅机器学习2023作业02Classification(Framewise Phoneme Prediction)

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