keras:如何将帧级预测聚合到歌曲级预测

问题描述 投票:0回答:1

我正在做歌曲类型分类。对于每首歌曲,我将它们切成小帧(5s)以生成频谱图作为神经网络的输入特征,并且每个帧具有相关的歌曲类型标签。

数据如下所示:

   name         label   feature
   ....
   song_i_frame1 label   feature_vector_frame1
   song_i_frame2 label   feature_vector_frame2
   ...
   song_i_framek label   feature_vector_framek
   ...

我可以从Keras获得每帧的预测精度没有问题。但是目前,我不知道如何通过多数投票将预测结果从帧级别汇总到歌曲级别,因为数据输入到keras模型时,它们的名称丢失了。

如何在keras输出中保留每个标签的名称(例如,song_i_frame1),以通过多数表决形成对歌曲的聚合预测。或者,是否还有其他方法可以聚合到歌曲级预测?

我用Google搜索,但无法找到答案,并希望有任何见解。

python tensorflow keras deep-learning audio-processing
1个回答
0
投票

在数据集中,每个标签都可以命名(例如:'rock')。要将其与神经网络一起使用,需要将其转换为整数(例如:2),然后转换为单热编码(例如:[0,0,1])。所以'rock' == 2 == [0,0,1]。您的输出预测将采用这种热编码形式。 [0.1,0.1,0.9]意味着预测了2级,[0.9,0.1,0.1]意味着0级等。为了以可逆的方式做到这一点,使用sklearn.preprocessing.LabelBinarizer

有几种方法可以将帧预测结合到整体预测中。最常见的是,复杂程度递增:

  • 多数投票。
  • 平均/平均投票。

以下是一个例子。

import numpy
from sklearn.preprocessing import LabelBinarizer

labels = [ 'rock', 'jazz', 'blues', 'metal' ] 

binarizer = LabelBinarizer()
y = binarizer.fit_transform(labels)

print('labels\n', '\n'.join(labels))
print('y\n', y)

# Outputs from frame-based classifier. 
# input would be all the frames in one song
# frame_predictions = model.predict(frames)
frame_predictions = numpy.array([
    [ 0.5, 0.2, 0.3, 0.9 ],
    [ 0.9, 0.2, 0.3, 0.3 ],
    [ 0.5, 0.2, 0.3, 0.7 ],
    [ 0.1, 0.2, 0.3, 0.5 ],
    [ 0.9, 0.2, 0.3, 0.4 ],
])

def vote_majority(p):
    voted = numpy.bincount(numpy.argmax(p, axis=1))
    normalized = voted / p.shape[0]
    return normalized

def vote_average(p):
    return numpy.mean(p, axis=0)

maj = vote_majority(frame_predictions)
mean = vote_average(frame_predictions)

genre_maj = binarizer.inverse_transform(numpy.array([maj]))
genre_mean = binarizer.inverse_transform(numpy.array([mean]))
print('majority voting', maj, genre_maj)
print('mean voting', mean, genre_mean)

产量

labels:
 rock
 jazz
 blues
 metal
y:
 [[0 0 0 1]
 [0 1 0 0]
 [1 0 0 0]
 [0 0 1 0]]
majority voting: [0.4 0.  0.  0.6] ['rock']
mean voting: [0.58 0.2  0.3  0.56] ['blues']

人们还可以通过使用在帧方式预测上训练的分类器来执行投票,尽管这不常见并且在输入长度变化时是复杂的。

另一种方法是使用基于帧的分类的GlobalAveragePooling进行多实例学习,一次学习整首歌曲。

© www.soinside.com 2019 - 2024. All rights reserved.