李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)
Homework4
Dataset介绍及处理
Dataset introduction
训练数据集metadata.json包括speakers和n_mels,前者表示每个speaker所包含的多条语音信息(每条信息有一个路径feature_path和改条信息的长度mel_len或理解为frame数即可),后者表示滤波器数量,简单理解为特征数即可,由此可知每个.pt语言文件可以表示为大小为mel_len \(\times\) n_mels的矩阵,其中所有文件已规定n_mels为40,不同的是语言信息的长度即mel_len。

测试数据集testdata.json包括n_mels和utterances,其中n_mels和意义前面一样且固定为40,utterance表示一条语音信息,不同的是这里我们不知道这则信息是谁说出来的,任务就是检测这些信息分别是谁说的。

映射文件mapping.json包括两项speaker2id和id2speaker,前者将600个speaker的编号隐射为0-599,后者则是相反的操作。

Dataset procession
正如上面说,尽管“古圣先贤”已经帮我们做好了绝大多数的数据处理操作,但是如果想要批量训练数据那么就需要对每个语音序列的mel_len进行固定,比如在sample code里面固定为128个frame
class myDataset(Dataset):
def __init__(self, data_dir, segment_len=128):
它的具体实现方式如下
def __getitem__(self, index):
feat_path, speaker = self.data[index]
# Load preprocessed mel-spectrogram.
mel = torch.load(os.path.join(self.data_dir, feat_path))
# Segmemt mel-spectrogram into "segment_len" frames.
if len(mel) > self.segment_len:
# Randomly get the starting point of the segment.
start = random.randint(0, len(mel) - self.segment_len)
# Get a segment with "segment_len" frames.
mel = torch.FloatTensor(mel[start:start+self.segment_len])
else:
mel = torch.FloatTensor(mel)
# Turn the speaker id into long for computing loss later.
speaker = torch.FloatTensor([speaker]).long()
return mel, speaker
即从每个语音序列总的frame中抽取连续的128个frame,但是这并不能够保证所有的语音需要都为128个frame,可能某语音序列的frame数原本就小于128,因此还需要另外一道保险即padding。
def collate_batch(batch):
# Process features within a batch.
"""Collate a batch of data."""
mel, speaker = zip(*batch)
# Because we train the model batch by batch, we need to pad the features in the same batch to make their lengths the same.
mel = pad_sequence(mel, batch_first=True, padding_value=-20) # pad log 10^(-20) which is very small value.
# mel: (batch size, length, 40)
return mel, torch.FloatTensor(speaker).long()
def get_dataloader(data_dir, batch_size, n_workers):
"""Generate dataloader"""
dataset = myDataset(data_dir)
speaker_num = dataset.get_speaker_number()
# Split dataset into training dataset and validation dataset
trainlen = int(0.9 * len(dataset))
lengths = [trainlen, len(dataset) - trainlen]
trainset, validset = random_split(dataset, lengths)
train_loader = DataLoader(
trainset,
batch_size=batch_size,
shuffle=True,
drop_last=True,
num_workers=n_workers,
pin_memory=True,
collate_fn=collate_batch,
)
valid_loader = DataLoader(
validset,
batch_size=batch_size,
num_workers=n_workers,
drop_last=True,
pin_memory=True,
collate_fn=collate_batch,
)
return train_loader, valid_loader, speaker_num
在data_loader读取一个batch时,如果仍旧有不同大小的frame,那么就可以通过指定collate_fn=collate_batch对数据进行填充,确保每个batch的frame相同进而进行批量(并行?)计算。
当然你也可以不预先设置frame数为128,仅使用collate_batch,那么就会使这个batch内所有语音序列的frame数自动对齐到最长的frame,但往往会爆显存。
Self-Attention简单介绍
在不考虑Multi-Head Attention以及add &norm的情况下
\(X'=\)Self-Attention\((X, W^q, W^k, W^v, W^l)\) = \(\frac{XW^q(XW^k)^T}{\sqrt{d_k}}XW^vW^l\)
其中\(X, W^q, W^k, W^v, W^l\)维度分别为\(n\times d_{model}, d_{model}\times d_k, d_{model}\times d_k, d_{model}\times d_v, d_v\times d_{model}\),并称\(Q=X\times W^q, K = X\times W^k, V = X\times W^v\)
可知,变化后的\(X'\)与原来\(X\)的维度相同,这一变化过程简称为编码,那么问题来了\(X'\)与\(X\)究竟有何不同?
在变化过程中,我们对\(Q\)和\(K\)做了内积运算,这表示一个查询匹配过程,内积越大则相似度越高,那么匹配所得的权重也就越大(表明越关注这个讯息),之后再和\(V\)运算相当于通过前面的权重及原始\(V\)对新\(X\)的\(V\)做预测,视频给出了很生动的表述。
但是这里我有一疑问,为什么点积运算可以表示关注度?点积可以在一定程度表示两向量的关联性,这一点毫无疑问,但是凭什么关联性越高也意味着关注度(得分)越高呢?
李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)的更多相关文章
- 李宏毅老师机器学习课程笔记_ML Lecture 3-1: Gradient Descent
引言: 这个系列的笔记是台大李宏毅老师机器学习的课程笔记 视频链接(bilibili):李宏毅机器学习(2017) 另外已经有有心的同学做了速记并更新在github上:李宏毅机器学习笔记(LeeML- ...
- 机器学习-Tensorflow之Tensor和Dataset学习
好了,咱们今天终于进入了现阶段机器学习领域内最流行的一个框架啦——TensorFlow.对的,这款由谷歌开发的机器学习框架非常的简单易用并且得到了几乎所有主流的认可,谷歌为了推广它的这个框架甚至单独开 ...
- 李宏毅老师机器学习课程笔记_ML Lecture 2: Where does the error come from?
引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...
- 李宏毅老师机器学习课程笔记_ML Lecture 1: ML Lecture 1: Regression - Demo
引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...
- 李宏毅老师机器学习课程笔记_ML Lecture 1: 回归案例研究
引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...
- 李宏毅老师机器学习课程笔记_ML Lecture 0-2: Why we need to learn machine learning?
引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...
- 李宏毅老师机器学习课程笔记_ML Lecture 0-1: Introduction of Machine Learning
引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...
- Python 机器学习实战 —— 监督学习(上)
前言 近年来AI人工智能成为社会发展趋势,在IT行业引起一波热潮,有关机器学习.深度学习.神经网络等文章多不胜数.从智能家居.自动驾驶.无人机.智能机器人到人造卫星.安防军备,无论是国家级军事设备还是 ...
- z/OS上Dataset 的移动
最近的一个需求,需要把大批量的Dataset移到新的Storage Class,新的Volume中去,刚开始感觉非常头疼.仔细研究后发现这个事情其实很简单.确实符合别人所说,事情的在你真正开始努力之后 ...
- 机器学习之神经网络模型-上(Neural Networks: Representation)
在这篇文章中,我们一起来讨论一种叫作"神经网络"(Neural Network)的机器学习算法,这也是我硕士阶段的研究方向.我们将首先讨论神经网络的表层结构,在之后再具体讨论神经网 ...
随机推荐
- 大数据面试题集锦-Hadoop面试题(五)-优化
你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案.如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料. 1. ...
- STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...
- Netty-介绍-1
Netty介绍和应用场景 要求 已经掌握了 主要技术构成: Java OOP 编程. Java 多线程编程. Java IO 编程 . Java 网络编程. 常用的Java 设计模式(比如 观察者模式 ...
- Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,支持SpringSecurity和JWT认证方式
目录 前言 相关技术简介 OpenAPI Swagger Springfox springdoc swagger2与swagger3常用注解对比 实现步骤 引入maven依赖 修改配置文件 设置api ...
- 关于elementui日期组件 date.getHours() is not a function 等问题
问题 日期控件中,假设当前显示日期为2020-01-01,现在需要修改为2020-01-03:点开日期组件框点击选择其他日期时, 控制台有可能会报错,显示 date.getHours() is n ...
- 记录开发中element树形控件数据应用在页面上的相关问题
业务场景 根据后台返回数据生成角色权限的树形结构.获取节点数据后,当父节点被勾选时,所有的子节点全部被勾选,而实际上后台并没有返回当前父节点的所有子节点的ID,所以应该只有部分子节点被勾选. 下面第一 ...
- PHP的无限极分类
PHP的无限极分类 一.使用数据表 添加from字段 id name parent_id from 1 中国 0 0 2 广东 1 0,1 3 深圳 2 0,1,2 4 龙华 3 0,1,2,3 5 ...
- 使用XAG配置GoldenGate在RAC集群环境中的高可用
背景:本文是根据实际客户测试需求整理,因为客户OGG所在环境只有GI集群,数据库部署在其他位置,所以会有一些差异,但核心思路一致,已完全测试通过,整理出来供大家参考. 1.前期准备 2.创建ACFS文 ...
- UVA11573 Ocean Currents
题目链接 题目 见链接. 题解 知识点:BFS. 这道题显然用BFS,但发现洋流方向会破坏时间的有序性,但注意到洋流时间花费是 \(0\) ,因此只需要用双端队列即可,洋流方向扩展直接放队头,其他方向 ...
- Linux线程 | 创建 终止 回收 分离
一.线程简介 线程是参与系统调度的最小单位.它被包含在进程之中,是进程中的实际运行单位. 一个进程中可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务. 每个线程都有其对应的标识,称为线程 ...