AI——音乐分类器

目标:输入一首歌曲,自动对歌曲进行分类

 

音乐数据怎么存储呢?

假如做十分类,就用十个文件夹来存储

然后首先要做的事情就是选用分类算法

          分类算法是有监督机器学习,常用的分类算法有 logistics regression,random tree,xgboost,softmax

      然后确定训练数据是什么样的? 假如做十分类,

                       分类对应的 x应该是 m行 n列,y,就是 m行 1列,y的取值为 (0123456789)

     每个分类100条训练的数据的话,X就是 m=1000行

        那么 n 怎么确定呢?怎么确定音乐数据 n 的维度?

   我们必须要把音乐数据转换为计算机可以读懂的数据?

   问题来了,怎么发现音乐文件的特征,怎么组合这些特征?

量化特征。把时间轴的音乐数据转换到频率轴

  基本特征,  隐含特征,  组合特征,

目标泄漏:是指将label y泄漏到x变量中,这样模型是学不到什么的

  如: 将A1-100,B1-100这样的文件名作为x训练数据的一个维度,模型就会只根据文件名来划分

在这里使用 python的 scipy 模块读取音乐文件  

from scipy.io import wavfile

这样的话我们需要使用工具预先将音乐文件转换为 wav 格式的,

           使用

from matplotlib.pyplot import specgram    将音乐画成图的形式

AI——音乐分类器_第1张图片如图意味着,计算机每秒采集到的音乐文件模拟数据点为 2050个数据点,这个音乐数据总共 4410 个点,时长为  4410/2050=0.2 秒

 时长为 9935622/32000=310.4秒

AI——音乐分类器_第2张图片纵坐标为声音大小

这样可以把音乐文件转换为图片保存起来。但是如果用这些图片去训练则是不可取的;

   下面使用傅里叶变换 将时间轴数据转换为频率轴数据;

from scipy import fft       fft 快速傅里叶变换(傅里叶的一种)
FFT是一种数据处理技巧,它可以把time domain上的数据,例如一个音频,拆成一堆基准频率,然后投射到frequency domain上

那么我们x的n取什么好呢?因为音乐是给人听的,所以根据人能听到的频率段决定。然后再根据模型准确率,业务等改变。

傅里叶变换中有正负频率,一般只取正频率 abs(fft(X))

   在20Hz~20kHz整个可听声频率范围内,人耳对300~6000Hz左右的频段特别敏感

这样我们就得到了train-set的 n,可以取 60-1500

然后将音乐文件通过快速傅里叶变换保存为trainset这样就得到了相同维度的x

即:fft(X)[60:1500]   傅里叶变换默认是按照频率从小到大排序

得到trainset之后,就可以使用分类算法了训练模型了,比如使用ovr 模式的logistics regression

最后再将测试数据同样经过相同的傅里叶变换后进行测试

你可能感兴趣的:(AI学习)