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


在实验中,我没有对参数p pp进行优化,而是直接用均值池化来做的,如果有哪位大佬实现了MFA算法,欢迎在下面交流学习,不胜感激 。另外一个注意的问题是,实验中会遇到某些音频样本切出来的片段(也就是最后映射成的4096维向量)的数量N NN不能被4整除 。为了能使用时域金字塔池化,我将多余的向量丢弃,以满足要求,感兴趣的朋友可以试一下:将最后一个4096向量重复m次;或对前几个向量进行插值m次 ?来进行扩充 。
fp(X)=(1N∑Nj=1∣xj∣p)1p f^p(X)=(\ \sum_{j=1}^{N} \mid x_j \mid^p )^{\}

# 记录每个音频有几个
count = np.zeros((535),np.int16)
for i in range(len()):
count[int([i][0].split('_')[1])] +=1
# 将每个音频的数约化为4的倍数
for i in range(len(count)):
count[i] -= count[i]%4
# 生成一个列表,记录每个属于哪个音频
= []
for i in range(len()):
.(int([i][0].split('_')[1]))
# 生成一个列表,记录535个音频各自的第一个在5944中的位置(内存寻址)
= []
flag = 0
for i in range(len()):
if [i] == flag:
.(i)
flag +=1
# 存储每个的4的整数倍个以及对应分类标签
= []
【语音情感分析开发者必读之作,一定带来一个解决新方案】# 遍历所有 循环535次
for i in range(len(count)):
if i == 247: # count[247]==0
# 只拼一个4096向量
.([[i][0][0],[ [[i]] ]])
if i != 247:
temp = [] # 包含两个元素,标签、若干个4096向量
temp1 = [] # 存储一个的若干4096向量
temp.([i][0][0]) # 字母,情绪标签
# 第i个的第一个在中的地址
= [i]
# 地址偏移量
= 0
for j in range(count[i]): # count[i]储存每个对应多少个
temp1.([+])
+=1 # 地址指针指向第i个的下一个
temp.(temp1)
.(temp)
if i ==0:
print(i)
##########################################
# 特征池化
##########################################
with open('.pkl','rb') as f:
= .load(f)
# 均值池化
= [] # 金字塔第1层特征,535个,
= [] # 金字塔第2层特征,535*2个
= [] # 金字塔第3层特征,535*4个
for i in range(len()):
= np.zeros((4096))
for j in range(len([i][1])):
+= [i][1][j]
/= len([i][1])
.()
= np.zeros((2,4096))
for j in range( int(len([i][1])/2) ):
[0] += [i][1][j]
for j in range( int(len([i][1])/2) ):
[1] += [i][1][j+int(len([i][1])/2)]
if i != 247:
/= int(len([i][1])/2)
if i == 247:
/= len([i][1])
.()
= np.zeros((4,4096))
for j in range( int(len([i][1])/4) ):
[0] += [i][1][j]
for j in range( int(len([i][1])/4) ):
[1] += [i][1][j+int(len([i][1])/4)]
for j in range( int(len([i][1])/4) ):
[2] += [i][1][j+2*int(len([i][1])/4)]
for j in range( int(len([i][1])/4) ):
[3] += [i][1][j+3*int(len([i][1])/4)]
if i != 247:
/= int(len([i][1])/4)
if i == 247:
/= len([i][1])
.()
# 级特征池化
# 均值池化
= np.zeros((535,4096))
for i in range(len()):
[i] += 0.25*[i] + 0.5*[i][0] + 0.5*[i][1] + [i][0] + [i][1] + [i][2] + [i][3]
[i] /= 7
= np.zeros((535))
for i in range(len()):
if [i][0] == 'W':
[i] = 0
if [i][0] == 'L':
[i] = 1
if [i][0] == 'E':
[i] = 2
if [i][0] == 'A':
[i] = 3
if [i][0] == 'F':
[i] = 4
if [i][0] == 'T':
[i] = 5
if [i][0] == 'N':
[i] = 6
六、SVM分类
这一步没什么好说的,对535条样本数据(每一条是4096维向量)进行分类,采用的是-learn的SVM API 。在训练之前,将数据充分混洗(其实对SVM没啥影响,毕竟只是找 ) 。