语音情感分析开发者必读之作,一定带来一个解决新方案( 四 )


#model.add((=(3,3),=(2,2)))
#model.add((384,(3,3),=(1,1),='same',='relu',=''))
#model.add((384,(3,3),=(1,1),='same',='relu',=''))
#model.add((256,(3,3),=(1,1),='same',='relu',=''))
#model.add((=(3,3),=(2,2)))
#model.add(())
#model.add(Dense(4096,='relu'))
#model.add((0.5))
#model.add(Dense(4096,='relu'))
#model.add((0.5))
#model.add(Dense(7,=''))
model.()
#编译模型
# adam = .Adam(decay=0.9)
sgd = .SGD(=0.9,lr=0.001,decay=1e-6)
pile(loss='ropy', # pile(loss='ropy', #
=sgd,
=[''])
model.fit(, ,
=,
=,
=True,=1)
# =(,)
model.save()
#评估模型
score = model.(, , =1)
print('Test score:', score[0])
print('Test :', score[1])
训练结果如下所示,训练到时已经接近收敛了,但是似乎还可以再多训练几代,毕竟作者用0.001的学习率训练了300个epoch 。
将训练好的模型的倒数第二层提取出来构建新的模型,并将之前的训练数据再跑一边前馈,得到每个227*227图的4096D向量 。
# 提取模型倒数第二层的4096全连接为输出向量
l = Model(=model.input,=model.[11].)
#以这个model的预测值作为输出
= l.()
五、时域金字塔特征池化
在提取到描述梅尔谱图的特征向量之后,下面要解决的问题是“对不同时间长度的语音信号怎样得到统一长度的特征” 。因为在裁切梅尔谱图的过程中,一个样本能切多少张64×64×3 64\\×64×3的图是由其信号长度决定的,这样我们就可能得到这样两个样本:一个样本持续3s,最终按时间顺序切成10个64×64×3 64\\×64×3的图像,再经过得到10个227×227×3 227\\×227×3的图像,最后经过CNN得到10个4096D的特征向量;另一个样本只有2s,最后得到8个4096D的向量 。这样不定长度的情感特征是没法进行分类和识别的,所以需要进行特征池化 。
论文中用的方法称为时域金字塔匹配(),其实就是一种池化手段,只不过用上了金字塔结构和p参数的学习 。它主要包括两部分:金字塔池化、Lp-Norm的参数p的学习 。
时域金字塔池化的思想非常简单,也易于理解 。读过SPP-Net的可能知道,它借助了空间金字塔池化()的思想 。在这里有必要先介绍一下空域金字塔池化 。
空域金字塔池化是解决不同尺寸的 map提取定长特征向量的算法 。不论 map的尺寸如何,都可以将其分成44的子区域,22的子区域和1*1的区域(就是不分区域),然后在每个区域上做池化,提取一个定长的特征向量,最后将所有层的所有子区域上提取的特征向量都拼起来,就得到最后的定长向量了 。
时域金字塔池化是一样的道理 。如下图:
1)将同一个音频样本的所有特征向量(N×4096D N\×4096D)按时间顺序排列好;
2)将其分成1、2、4等份,对每一等份应用如下公式进行池化,将所有向量拼起来,得到vpL(x)∈R7×4096 v_L^p(x) \in R^{7\times 4096}v
L
p
?
(x)∈R
7×4096
;
3)对vpL(x) v_L^p(x)v
L
p
?
(x)再应用池化规则,得到up(X)∈R4096 u^p(X) \in R^{4096}u
p
(X)∈R
4096
作为最终的全局特征,论文中叫 level ,由于涵盖了整个句子的情感信息,所以我翻译成“话语级特征”;
4)如下的公式中参数p pp的取值有最优解,论文中采用边界费舍尔分析(MFA,)来优化,不是很懂,就没做代码复现 。
下面来看这个公式 。式中X∈RN×4096 X\in R^{N\times 4096}X∈R
N×4096
代表N NN个4096维的向量 。若p=1 p=1p=1则表示对N NN个向量的对应维度上相加再取平均,也就是均值池化;若p=∞ p=\=∞,则表示在向量每一个维度上取最大值,也就是最值池化 。这个公式的理解可以和范数的概念结合起来 。