【开发日记】Deep speaker之ResCNN Input结构
Deep speaker这篇文章有很多细节没有描述,加上没有官方的源代码,导致要实现很难。
这篇文章主要是写一下ResCNN Input的结构,这个应该是很多人迷惑的地方。
由于一开始没有经验,因此代码是参考github上的开源代码:https://github.com/philipperemy/deep-speaker
因此思路一直被这篇代码的结构给困住了,其实RecCNN的Input和这个开源代码有很大的区别(这是我和论文作者李超博士交流后自己的理解,我觉得还是蛮有把握的)
我的理解,在Keras中,Input的维度应该是 n*f*h*c,其中n是batchsize,f是fbank的频点,h是帧数,是可变的(当然,在同一个batch中,h是一样的),c是通道,一般为3,即静态的fbank,和一阶倒数delta1,以及二阶导数delata2,李说通道的顺序是delta2,delta1,fbank。这样,假设batchsize为96(32个三元组),f为64(论文中),h为256(这个是可变的,这里取256,大概是3s多左右,取256是为了方便描述),那么Input的维度就是96*64*256*3
这里就以96*64*256*3来描述RecCNN的结构,在做卷积是batchsize也可以不考虑,因此Input维度这里取64*256*3。这里的关键是CNN为什么可以用在可变的维度上(比如256这个数是可变的),其实就是全卷积网络的使用加上average pooling。
Layer name |
Structure |
Stride |
Input size |
Output size |
Conv64-s res64 |
5*5, 64 |
2*2 |
64*256*3
|
32*128*64 |
Conv128-s Res128 |
5*5, 128 |
2*2 |
32*128*64 |
16*64*128 |
Conv256-s Res256 |
5*5, 256 |
2*2 |
16*64*128 |
8*32*256 |
Conv512-s Res512 |
5*5, 512 |
2*2 |
8*32*256 |
4*16*512 |
transpose |
|
|
4*16*512 |
4*512*16 |
reshape |
|
|
4*512*16 |
2048*16 |
average |
|
|
2048*16 |
2048*1 |
affine |
2048*512 |
|
2048*1 |
512 |
ln |
|
|
512 |
512 |
也可以参考下图