- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做歌曲流派分类(2类)。对于每首歌曲,我将它们切成小帧(5 秒)以生成 MFCC 作为神经网络的输入特征,并且每个帧都有一个关联的歌曲流派标签。
数据如下所示:
name label feature
....
song_i_frame1 label feature_vector_frame1
song_i_frame2 label feature_vector_frame2
...
song_i_framek label feature_vector_framek
...
我知道我可以随机选择 80% 的歌曲(它们的小帧)作为训练数据,其余的作为测试数据。但现在我写X_train的方式是帧级别的帧,并且biney交叉熵损失函数是在帧级别定义的。我想知道如何自定义损失函数,使其在帧级预测的聚合(例如歌曲的每帧预测的多数票)上最小化。
目前,我拥有的是:
model_19mfcc = Model(input_shape = (X_train19.shape[1], X_train19.shape[2]))
model_19mfcc.compile(loss='binary_crossentropy', optimizer="RMSProp", metrics=["accuracy"])
history_fit = model_19mfcc.fit(X_train19, y_train,validation_split=0.25, batch_size = 1800/50, epochs= 200)
此外,当我将训练和测试数据输入 keras 时,数据的相应 ID(名称)会丢失,将数据(名称、lebel 和特征)保存在单独的 pandas 数据框中并匹配预测keras 是一个好的做法吗?或者还有其他好的选择吗?
提前致谢!
最佳答案
流派分类通常不需要定制的损失函数。可以使用 Multiple Instance Learning 设置将歌曲分为多个预测窗口的组合模型(军用)。
MIL 是一种监督学习方法,其中标签不是在每个独立样本(实例)上,而是在实例的“包”(无序集)上。在您的例子中,实例是 MFCC 功能的每 5 秒窗口,包是整首歌曲。在 Keras 中,我们使用 TimeDistributed 层来为所有窗口执行模型。然后我们使用 GlobalAveragePooling1D 有效地组合结果跨窗口实现平均投票。这比多数投票更容易区分。
下面是一个可运行的示例:
import math
import keras
import librosa
import pandas
import numpy
import sklearn
def window_model(n_bands, n_frames, n_classes, hidden=32):
from keras.layers import Input, Dense, Flatten, Conv2D, MaxPooling2D
out_units = 1 if n_classes == 2 else n_classes
out_activation = 'sigmoid' if n_classes == 2 else 'softmax'
shape = (n_bands, n_frames, 1)
# Basic CNN model
# An MLP could also be used, but may need to reshape on input and output
model = keras.Sequential([
Conv2D(16, (3,3), input_shape=shape),
MaxPooling2D((2,3)),
Conv2D(16, (3,3)),
MaxPooling2D((2,2)),
Flatten(),
Dense(hidden, activation='relu'),
Dense(hidden, activation='relu'),
Dense(out_units, activation=out_activation),
])
return model
def song_model(n_bands, n_frames, n_windows, n_classes=3):
from keras.layers import Input, TimeDistributed, GlobalAveragePooling1D
# Create the frame-wise model, will be reused across all frames
base = window_model(n_bands, n_frames, n_classes)
# GlobalAveragePooling1D expects a 'channel' dimension at end
shape = (n_windows, n_bands, n_frames, 1)
print('Frame model')
base.summary()
model = keras.Sequential([
TimeDistributed(base, input_shape=shape),
GlobalAveragePooling1D(),
])
print('Song model')
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='SGD', metrics=['acc'])
return model
def extract_features(path, sample_rate, n_bands, hop_length, n_frames, window_length, song_length):
# melspectrogram might perform better with CNNs
from librosa.feature import mfcc
# Load a fixed length section of sound
# Might need to pad if some songs are too short
y, sr = librosa.load(path, sr=sample_rate, offset=0, duration=song_length)
assert sr == sample_rate, sr
_song_length = len(y)/sample_rate
assert _song_length == song_length, _song_length
# Split into windows
window_samples = int(sample_rate * window_length)
window_hop = window_samples//2 # use 50% overlap
windows = librosa.util.frame(y, frame_length=window_samples, hop_length=window_hop)
# Calculate features for each window
features = []
for w in range(windows.shape[1]):
win = windows[:, w]
f = mfcc(y=win, sr=sample_rate, n_mfcc=n_bands,
hop_length=hop_length, n_fft=2*hop_length)
f = numpy.expand_dims(f, -1) # add channels dimension
features.append(f)
features = numpy.stack(features)
return features
def main():
# Settings for our model
n_bands = 13 # MFCCs
sample_rate = 22050
hop_length = 512
window_length = 5.0
song_length_max = 1.0*60
n_frames = math.ceil(window_length / (hop_length/sample_rate))
n_windows = math.floor(song_length_max / (window_length/2))-1
model = song_model(n_bands, n_frames, n_windows)
# Generate some example data
ex = librosa.util.example_audio_file()
examples = 8
numpy.random.seed(2)
songs = pandas.DataFrame({
'path': [ex] * examples,
'genre': numpy.random.choice([ 'rock', 'metal', 'blues' ], size=examples),
})
assert len(songs.genre.unique() == 3)
print('Song data')
print(songs)
def get_features(path):
f = extract_features(path, sample_rate, n_bands,
hop_length, n_frames, window_length, song_length_max)
return f
from sklearn.preprocessing import LabelBinarizer
binarizer = LabelBinarizer()
y = binarizer.fit_transform(songs.genre.values)
print('y', y.shape, y)
features = numpy.stack([ get_features(p) for p in songs.path ])
print('features', features.shape)
model.fit(features, y)
if __name__ == '__main__':
main()
该示例输出内部模型摘要和组合模型摘要:
Frame model
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 11, 214, 16) 160
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 71, 16) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 3, 69, 16) 2320
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 1, 34, 16) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 544) 0
_________________________________________________________________
dense_1 (Dense) (None, 32) 17440
_________________________________________________________________
dense_2 (Dense) (None, 32) 1056
_________________________________________________________________
dense_3 (Dense) (None, 3) 99
=================================================================
Total params: 21,075
Trainable params: 21,075
Non-trainable params: 0
_________________________________________________________________
Song model
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
time_distributed_1 (TimeDist (None, 23, 3) 21075
_________________________________________________________________
global_average_pooling1d_1 ( (None, 3) 0
=================================================================
Total params: 21,075
Trainable params: 21,075
Non-trainable params: 0
_________________________________________________________________
以及输入模型的特征向量的形状:
features (8, 23, 13, 216, 1)
8首歌曲,每首23个窗口,13个MFCC频段,每个窗口216帧。第五维大小为 1,让 Keras 高兴......
关于python - keras:如何编写自定义损失函数以将帧级预测聚合到歌曲级预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55272508/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!