任务:利用selfatt实现听一段语音,给出说话人,即听音分类
思路:音频序列做self-att信息融合,然后将样本序列平均得到mean vector用来分类
Path(data_dir) / "mapping.json"
json object要求:使用{},是key-value pairs,key必须双引号str
将json object转化为python格式时就变成了python dict
json string是字符串形式的json object,使用json.loads(),json文件使用json.load()
准备dataset:取所有演讲人语音段的长maxlen部分(可能有的语音片段不够长)
dataset[0]:第0个演讲者的第1段音频,dataset[1]:第0个演讲者的第2段音频....dataset[]:所有演讲者的所有音频 (音频,speaker id)
一句话:就是把所有音频都听一遍,不过音频有最大长度,dataloader输出的是pad后的batch
lengths = [trainlen, len(dataset) - trainlen]
trainset, validset = random_split(dataset, lengths)
dataloader只是把dataset中的样本堆叠起来,如果想自定义从dataset中的样本到batch的行为需要使用collate_fn
自定义collate_fn(batch)#batch是dataset[0],[1]这些东西组成的list
mel, speaker = zip(*batch)#将batch list解包,mel是batch中的tensor叠一起形成的tuple,speaker是id叠一起的tuple#mel: (tensor1,tensor2,tensor3....tensor_batchsize)
torch定义tensor的时候不区分(),[],即torch.LongTensor((1,2,3))没有任何问题
pad_sequence:接收多个样本(sequence_length, feature_dim)的tensor 的list
,其中不同tensor的 sequence_length
可能不同,pad_sequence
会对齐 sequence_length
,并在较短的张量后面填充 0,使得所有张量在 sequence_length
维度上具有相同的长度。
(就是把不同时间长度的样本拼成一个batch,要求一样长) 延长,结合
在多个batch/1个epoch的基础上进行validation测试模型,在多次validation后保存最好的val结果对应的model_state ,即ckpt
(1)是int,(1,)才是tuple