[深度学习进阶 - 实操笔记] 语音识别speech_commands数据集

语音识别

训练过程

前几天简单学了下语音识别的基础知识。(语音识别基础知识)理解了深度学习如何处理语音数据,并且识别语音。所以我就尝试着用学习时候的网络(如下)跑Speech-commands数据集。从里面挑了十个语音类别。但是效果并不好。

# 只用到了卷积 对频谱图进行训练
class Net(torch.nn.Module):

    def __init__(self):
        super().__init__()
        self.seq = torch.nn.Sequential(
            torch.nn.Conv2d(1, 4, (1, 3), (1, 2), (0, 1)),
            torch.nn.BatchNorm2d(4),
            torch.nn.ReLU(),
            torch.nn.Conv2d(4, 4, (1, 3), (1, 2), (0, 1)),
            torch.nn.BatchNorm2d(4),
            torch.nn.ReLU(),
            torch.nn.Conv2d(4, 4, (1, 3), (1, 2), (0, 1)),
            torch.nn.BatchNorm2d(4),
            torch.nn.ReLU(),
            torch.nn.Conv2d(4, 8, 7, 2, 1),
            torch.nn.BatchNorm2d(8),
            torch.nn.ReLU(),
            torch.nn.Conv2d(8, 16, 5, 1, 0),
            torch.nn.BatchNorm2d(16),
            torch.nn.ReLU(),
            torch.nn.Conv2d(8, 1, (10, 1)),#输出十个类别
            torch.nn.ReLU(),
        )

    def forward(self, x):
        h = self.seq(x)
        return h.reshape(-1, 10)

主要存在问题:损失降得很慢而且精度不增。(之前训练了2个多小时,精度最高达到59%,损失降至1.0左右就浮动不变)
[深度学习进阶 - 实操笔记] 语音识别speech_commands数据集_第1张图片
于是我再训练过程中把每层网络的权重打印出来。(tensorboard)
发现神经网络的最后一层权重越来越平缓,更新得越来越慢,因此我决定从权重下手。
[深度学习进阶 - 实操笔记] 语音识别speech_commands数据集_第2张图片

改进

可以看到,权重在训练最后,越来越平滑。因此我尝试使用权重初始化。

def weight_init(m):
    if (isinstance(m, nn.Conv2d)):
        nn.init.kaiming_normal_(m.weight)
        if m.bias is not None:
            nn.init.zeros_(m.bias)
    elif (isinstance(m, nn.Linear)):
        nn.init.kaiming_normal_(m.weight)
        if m.bias is not None:
            nn.init.zeros_(m.bias)

但是发现,在其他层上,权重的表现都较好,但是最后一层卷积层仍然存在一样的问题。而且损失仍然下降太慢,精度不增。
[深度学习进阶 - 实操笔记] 语音识别speech_commands数据集_第3张图片
因此,问题肯定出在最后一层。我决定直接把最后一层删去,然后增加一层RNN网络代替。(这里使用LSTM作为最会一层,在加上全连接进行输出)

class Net(torch.nn.Module):

    def __init__(self):
        super().__init__()
        self.seq = torch.nn.Sequential(
            torch.nn.Conv2d(1, 4, (1, 3), (1, 2), (0, 1)),
            torch.nn.BatchNorm2d(4),
            torch.nn.ReLU(),
            torch.nn.Conv2d(4, 4, (1, 3), (1, 2), (0, 1)),
            torch.nn.BatchNorm2d(4),
            torch.nn.ReLU(),
            torch.nn.Conv2d(4, 4, (1, 3), (1, 2), (0, 1)),
            torch.nn.BatchNorm2d(4),
            torch.nn.ReLU(),
            torch.nn.Conv2d(4, 8, 7, 2, 1),
            torch.nn.BatchNorm2d(8),
            torch.nn.ReLU(),
            torch.nn.Conv2d(8, 16, 5, 1, 0),
            torch.nn.BatchNorm2d(16),
            torch.nn.ReLU(),
            #torch.nn.Conv2d(8, 1, (10, 1)),
            #torch.nn.ReLU(),

        )

        self.rnn = nn.LSTM(10 * 16, 128, 2, batch_first=True, bidirectional=False)
        self.output_layer = nn.Linear(128, 10)
        self.apply(weight_init)

    def forward(self, x):
        h = self.seq(x)
        #print(h.shape)
        _n, _c, _h, _w = h.shape
        _x = h.permute(0, 2, 3, 1)
        #print(_x.shape)
        _x = _x.reshape(_n,_h,_w*_c)
        #print(_x.shape)
        h0 = torch.zeros(2 * 1, _n, 128).cuda()  # 初始化反馈值 num_layers * num_directions ,batch, hidden_size
        c0 = torch.zeros(2 * 1, _n, 128).cuda()
        hsn, (hn, cn) = self.rnn(_x, (h0, c0))
        out = self.output_layer(hsn[:, -1, :])

        return out#.reshape(-1, 10)

果然,修改后的效果非常明显。在十种分类上,只训练了50轮次,损失就降至非常低,而且精度基本上可以达到100%。
[深度学习进阶 - 实操笔记] 语音识别speech_commands数据集_第4张图片
然后训练35个分类的话,也就是全部的数据集。精度基本到90以上就增长得非常慢了。最终训练9个小时,精度达到97。
[深度学习进阶 - 实操笔记] 语音识别speech_commands数据集_第5张图片

你可能感兴趣的:(深度学习)