02基于傅里叶变换的音乐识别
先前我们是把-有特点-的30s给抽取出来了,如果不是可能会带来困难
傅里叶变换
把时间轴上的数据转变为频率轴上的数据
波峰和波谷变换的越快,频率越大
应用:
识别
对于很刺耳的声音还可去噪音
不需要了解公式
在scipy这个模块下面fft函数
#跟先前学的那个....就当复习巩固吧
#准备音乐数据
import numpy as np
from sklearn import linear_model,datasets
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy import fft
from scipy.io import wavfile
#wavfile是读取wav格式的音乐文件 但是他不能读取au格式的,所以转成了,不是简单加了个wav后缀
#无论你的歌是30s还是3min,都是存这个多,占得磁盘的空间也一样
def create_fft(g,n):
#果然不熟悉啊,还在纠结g,g就是参数呀
rad="C:/Users/Michelle/Desktop/data/1215 AI/trainset/"+g+"/converted"+g+"."+str(n).zfill(5)+".au.wav"
#上次做project就是纠结这个类型的怎么写,还是没掌握好知识啊,浪费那么多时间,一个个傻瓜式输入
sample_rate,x=wavfile.read(rad) #这是个元祖,采样率 猜的越多,信息损失越少
fft_features=abs(fft(x)[:1000])#取了1000个hz
sad="C:/Users/Michelle/Desktop/data/1215 AI/trainset/"+g+str(n).zfill(5)+".fft"
#存到某个具体的路径中去 但是后面生成的是fft.npy,不用管
np.save(sad,fft_features)
#create fft
genre_list=["classical","jazz","country","pop","rock","metal"]
for g in genre_list:
#100是序列的index的索引号 0-99
for n in range(100):
create_fft(g,n)
#加载训练数据集,分割训练集和测试集,进行分类器训练
#构造训练集
genre_list=["classical","jazz","country","pop","rock","metal"]
x=[]
y=[]
for g in genre_list:
for n in range(100):
rad="C:/Users/Michelle/Desktop/data/1215 AI/trainset/"+g+'.'+str(n).zfill(5)+".fft"+".npy"
fft_features=np.load(rad)
x.append(fft_features)#1000行特征值
y.append(genre_list.index(g))#就是前面的类别
x=np.array(x)
y=np.array(y)
#sklearn 通常不能读原始list 变成二维数组类型
#使用sklearn来构造两种分类器
from sklearn.linear_model import LogisticRegression
model=LogisticRegression() #创建一个对象
#也可以设定参数
#model=LogisticRegression(multi_class='ovr',solver='sag',max_iter=1000)
model.fit(x,y)
'''
#可以采用python内建的持久性模型 pickle 来保存 scikit的模型
#https://blog.csdn.net/answer3lin/article/details/84791576
import pickle
s=pickle.dumps(clf)#把model传进到clf里面 就可以接着使用这个模型
clf2=pickle.loads(s)
clf2.predict(x[0])
'''
print("Starting read wavfile...")
sample_rate,test=wavfile.read("C:/Users/Michelle/Desktop/data/1215 AI/trainset/sample/heibao-wudizirong-remix.wav")
testdata_fft_features=abs(fft(test))[:1000]
print(sample_rate,testdata_fft_features,len(testdata_fft_features))
type_index=model.predict([testdata_fft_features])[0]
print(type_index)
print(genre_list[type_index])#把上面的index传进来转成具体类型
注意:音乐分为单声道和双声道。因为两个耳朵不一样,会产生立体声的感觉,这个代码是单声道的
04人工神经网络开始
机器学习–拟人
有监督的机器学习
多元线性回归
回归/预测
逻辑回归
分类
神经网络(仿生)
预测
非线性的算法,非线性的算法可以来解决更加复杂的问题
神经网络算法也是后面深度学习的时候的基础
ANN artificial neural network
MLP multiple layer percepton
CNN RNN
Q:神经网络需要考虑的基本要素有哪些?
A:1,激活函数的选择,对应神经元里面的逻辑,两部分,相乘相加和非线性的变化,相乘相加是固定不变的
非线性的变化可以有很多选择,根据效果来
2,网络拓扑结构,处理更加复杂的问题,就需要更多的网络层,就需要每层上面设置更多的人工神经元
3,在去求解神经网络模型的时候,w0…wn,选择什么样优化算法,SGD一样适用!
Q:激活函数有哪些?
A:1,Sigmoid函数,0到1之间 2,Tangent函数,-1到1之间 3,Relu函数,max(0,x)
Q:神经网络算法的隐藏层意义何在?
A:1,如果有隐藏层的话,就多了推理有演绎的能力
2,每多一个隐藏层,推理和演绎的过程更多,考虑的更深入
3,隐藏层的隐藏节点如果比之前的层上面的节点数要多,相当于进行了升维,考虑的因素更多,考虑的更全面
4,隐藏层的隐藏节点如果比之前的层上面的节点数要少,相当于进行了降维,去前面进行了归纳总结
Q:为什么神经网络的神经元那么小
A:因为它本身就是解决某个特定的问题,比如图像,语音等,所以他也不需要那么多
主要参考:
https://blog.csdn.net/illikang/article/details/82019945
隐藏层是为了便于推理和演绎
感觉像是decision tree 一步步判断
#多层感知机(MLP)原理简介
https://www.cnblogs.com/bonelee/p/9092080.html
from sklearn.neural_network import MLPClassifier
x=[[0.,0.],[1.,1.]]#输入层有两个输入节点 x1和x2 x1和x2
y=[0,1]#输出层有两个输出节点
clf=MLPClassifier(solver='sgd',alpha=1e-5,activation="logistic",hidden_layer_sizes=(5,2),max_iter=2000,tol=1e-4)
#tol是阈值,梯度时候小于这个值。连接数w 5X2 左边五个右边两个 5个隐藏层,每个隐藏层有2个节点 (5,4,20)三个隐藏层分别是(100,)一层隐藏层,100个节点
clf.fit(x,y)
predicted_value=clf.predict([[2.,2.],[-1,-2.]])
print(predicted_value)
predicted_proba=clf.predict_proba([[2.,2.],[-1,-2.]])
print(predicted_proba)
print([coef.shape for coef in clf.coefs_])
print([coef for coef in clf.coefs_])
结果
[1 1]
[[0.4281369 0.5718631 ]
[0.42847389 0.57152611]]
[(2, 5), (5, 2), (2, 1)]
#看下面你能发现是 2--5---2的连接方式
2*5 5*2 2*5 矩阵
[array([[-0.36689325, 0.42728148, -0.38030335, 0.52292748, -0.35062165],
[-0.46673022, -0.4280824 , 0.09152046, -0.42497603, -0.41494944]]), array([[-0.08710417, -0.36887777],
[ 0.27390546, 0.03801725],
[-0.07852458, 0.25256175],
[-0.38455056, -0.02148564],
[ 0.1512115 , 0.49742954]]), array([[ 0.67742899],
[-0.26601937]])]
06 后面的是R的concrete分析 5个变量,能看懂但是不大想看先放弃吧