注:这里主要针对语音识别transformer架构为例进行解释说明
-
dataset函数
Dataset代表自定义数据集方法的抽象类,·负责建立索引到样本的映射,DataLoader负责以特定的方式从数据集中迭代的产生 一个个batch的样本集合。在enumerate过程中实际上是dataloader按照其参数sampler规定的策略调用了其dataset的getitem方法。
dataset(Dataset): 传入的数据集
-
init函数
- 5个基本参数
__init__
方法是构造函数,在创建LibriSpeechDataset
对象时自动执行。data_dir
:数据集的根目录路径(例如train-clean-100
)。transform
:用于对音频数据进行变换的函数或对象,默认为None
。self.file_paths
和self.labels
:分别用于存储所有音频文件的路径和对应的转录文本- for循环
遍历
data_dir
目录中的每个子目录(假设每个子目录是一个说话人 ID,例如19
)。speaker_dir
是说话人的目录路径。如果
speaker_dir
不是一个目录,则跳过该路径。遍历每个说话人目录中的子目录(假设每个子目录是一个录音段 ID,例如
198
)。chapter_dir
是录音段目录路径。如果
chapter_dir
不是一个目录,则跳过。- transcript_file
在每个录音段目录中构建对应的转录文件路径,假设文件名格式为
{speaker_id}-{chapter_id}.trans.txt
。检查
transcript_file
是否存在,如果不存在,则输出警告并跳过该目录。打开并读取
transcript_file
文件。每行表示一个音频文件的 ID 和对应的转录文本,格式为
<file_id> <transcription>
。通过
split(" ", 1)
分割每行,将file_id
和label
(转录文本)分开。构建音频文件的路径
audio_path
(假设音频文件的格式为.flac
)。检查
audio_path
是否存在。如果存在,将音频文件路径添加到self.file_paths
,将对应的转录文本添加到self.labels
。如果音频文件不存在,则输出警告。
-
len函数
__len__
方法返回数据集的样本数,即self.file_paths
的长度。这是Dataset
类的要求之一,用于表示数据集的大小。 -
getitem函数
__getitem__
方法是Dataset
类的另一个必需方法,返回给定索引idx
的样本(音频数据和标签)。file_path
:获取self.file_paths
中索引为idx
的音频文件路径。torchaudio.load(file_path)
:使用torchaudio
加载音频文件,返回音频波形waveform
和采样率sample_rate
。如果提供了
transform
,则对waveform
进行转换(如梅尔频谱转换)。获取对应的标签
label
。返回
waveform
和label
。
总结
这个 LibriSpeechDataset
类用于加载 LibriSpeech 数据集中的音频文件及其对应的文本标签。
__init__
方法会遍历数据集的文件夹结构,找到每个 .flac
音频文件和对应的转录文本。
__len__
返回数据集中样本的数量。
__getitem__
返回指定索引处的音频数据和标签,用于模型的输入和输出。
def get_data_loader(data_dir, batch_size=32, shuffle=True):
# 定义梅尔频谱转换
transform = T.MelSpectrogram(sample_rate=16000, n_mels=64, hop_length=256, win_length=512)
dataset = LibriSpeechDataset(data_dir, transform=transform)
return DataLoader(dataset, batch_size=batch_size, shuffle=shuffle)
当我们通过迭代的方式来取得每一个数据,但是这样很难实现取batch,shuffle或者多线程读取数据,所以pytorch还提供了一个简单的方法来做这件事情,通过torch.utils.data.DataLoader类来定义一个新的迭代器,用来将自定义的数据读取接口的输出或者PyTorch已有的数据读取接口的输入按照batch size封装成Tensor。
get_data_loader
函数的功能是:
- 定义音频数据的梅尔频谱转换。
- 使用
LibriSpeechDataset
加载音频文件和对应标签,并将转换应用到音频波形上。 - 返回一个
DataLoader
对象,用于在训练或测试时以批量形式加载数据。
def get_data_loader
:
- 定义一个函数
get_data_loader
,用于创建 PyTorch 的数据加载器(DataLoader
)。 - 接收以下参数:
data_dir
:字符串,数据集的根目录路径。batch_size
:整数,每个批次加载的数据样本数量,默认为 32。shuffle
:布尔值,是否随机打乱数据样本的顺序,默认为True
。
transform = T.MelSpectrogram(...)
:
- 创建一个梅尔频谱变换对象
transform
,用于将音频波形转换为梅尔频谱图。 T.MelSpectrogram
是torchaudio.transforms
中的一个类,提供了将音频转换为梅尔频谱图的功能。- 参数解释:
sample_rate=16000
:采样率为 16kHz,表示音频每秒采样 16000 次。n_mels=64
:梅尔频谱图的频带数量,设置为 64。hop_length=256
:控制每两帧之间的步长,决定了时间分辨率。win_length=512
:窗口长度,用于短时傅里叶变换 (STFT) 的计算,决定了频率分辨率。
dataset = LibriSpeechDataset(...)
:
- 创建一个
LibriSpeechDataset
对象dataset
,用于加载data_dir
中的音频和标签数据。 LibriSpeechDataset
是自定义的数据集类,它会读取data_dir
中的.flac
音频文件和对应的转录文本。transform=transform
:将前面定义的MelSpectrogram
转换传递给LibriSpeechDataset
,确保每次加载音频时都将其转换为梅尔频谱图。
return DataLoader(...)
:
-
返回一个 PyTorch 的
DataLoader
对象,用于批量加载数据。 -
参数解释:
dataset
:传入刚刚创建的LibriSpeechDataset
对象。batch_size=batch_size
:每个批次加载的数据样本数量。shuffle=shuffle
:是否在每个 epoch 开始时打乱数据顺序。
-
神经网络中的前向过程和反向过程
- 前向过程(Forward Propagation)
前向过程是指数据从输入层流经隐藏层直到输出层的过程。在这个过程中,每一层的神经元根据输入和权重、偏置计算出一个激活值,最终得到预测结果。
- 反向过程(Backward Propagation)
反向过程是神经网络训练的核心,它利用误差反向传播算法来更新模型的参数(权重和偏置),以最小化损失函数。
- 计算损失
- 计算梯度
- 更新参数