欢迎光临散文网 会员登陆 & 注册

金融风控-神经网络语音识别模型介绍(附代码)

2023-09-19 12:07 作者:python风控模型  | 我要投稿

前言

在金融风控领域里,逻辑回归,评分卡,集成树算法是信用风险计算的核心算法。

实际上,金融风控领域覆盖面很广。人脸识别和语音识别也有广泛应用。贷前n要素检测和反欺诈部门会应用人脸识别技术。

催收部门会应用到语音识别模型。今天就介绍一下基础的语音识别模型建模,并提供python代码。


今天我们将看到CNN(卷积神经网络)应用于语音识别应用的示例。
我们基于 CNN 深度学习算法的机器学习模型的目标是对一些简单的单词进行分类,从 0 到 9 的数字开始。

为了提取语音的独特特征,我们将首先采用在ASR(自动语音识别)领域使用的语音编码过程,称为梅尔频率倒谱系数或更简单的MFCC。

借助 MFCC 技术,我们将能够将口头说出的每个单词编码为向量序列,每个向量有 13 个值长,代表 MFCC 算法系数。

在我们的例子中,即由个位数表示的单个单词,我们将使用 48 x 13 矩阵对每个单个数字进行编码。

上图显示了MFCC编码过程中涉及的主要模块链:语音信号在时域中被分割成几个具有适当持续时间(通常为 25-40 ms)的帧。

对于每个分段,我们将计算功率谱密度。结果作为一系列部分重叠滤波器(滤波器组)的输入提供,这些滤波器计算与功率谱的不同频率范围相对应的能量谱密度。

每帧获得 26 个系数,由每个滤波器下游的能量谱结果组成。最后将结果通过离散余弦变换或DCT(离散余弦变换)进行处理。

DCT 具有能够通过尽可能最好地使用低频来编码信号特征的特性:这是一个有用的特性,因为我们正在处理语音信号,其主要特性在 300 到 3400 Hz 之间。

最终结果:在此过程结束时,MFCC为我们提供了13 个有用的系数,我们将通过部署一些最佳分类器(在本例中基于CNN)与适当的机器学习算法一起使用。

就训练阶段而言,我们将使用这里提供的名为Free Spoken Digit Dataset的数据集:它是由不同的人根据不同的环境和时间发音从 0 到 9 的数字的大约2000 段录音。

对于我们的分类器,我们将使用具有不同级别的卷积神经网络,如下所示:

现在让我们看看一些代码和性能!
我们可以将一些有用的库导入到我们的 Python Jupyter Notebook 中:

import pandas as pdfrom sklearn.model_selection import train_test_splitimport pickleimport matplotlib.pyplot as pltimport matplotlib.ticker as tickerfrom IPython.display import HTMLimport numpy as npfrom sklearn import preprocessingimport matplotlib.pyplot as pltfrom scipy.io import wavfile as wavimport scipyfrom python_speech_features import mfccfrom python_speech_features import logfbank

import tensorflow as tf

from keras.models import Sequentialfrom keras.layers import Dense, Flatten, Activation, Dropout, LSTMfrom keras.layers import Conv2D, MaxPooling2D, GlobalMaxPooling2Dfrom keras.optimizers import SGDimport os

让我们分析一条随机语音消息,例如“ 0_jackson_0.wav ”文件:

N = sig1.shape[0]L = N / ratef, ax = plt.subplots()ax.plot(np.arange(N) / rate, sig1)ax.set_xlabel(‘Time [s]’)ax.set_ylabel(‘Amplitude [Base-ten signed range (per sample)]’);


出于好奇,现在让我们看看将 MFCC 函数应用于信号的结果:

mfcc_feat = mfcc(sig1,rate,nfft=512)plt.imshow(mfcc_feat[0:20,:])

我们还可以可视化一种频谱图:实际上它是关于信号每个时间帧的 DCT 的 13 个输出……在这里我们可以看到前 20 个。


现在是我们开始认真做事的时候了。
首先,我们将2000个录音文件导入到一个特殊的向量列表中,然后将其进行适当的转换和分离,从而获得用于学习的有用值和用于预测的目标标签:


soundfile = os.listdir(‘/Users/diego/Diego/Xenialab/AI/jupyter/digits’)data=[]for i in soundfile:(rate,sig) = wav.read(‘/Users/diego/Diego/Xenialab/AI/jupyter/digits/’+i)data.append(sig)


#set the independent varsize = 48X=[]for i in range(len(data)):mfcc_feat = mfcc(data[i],rate,nfft=512)mfcc_feat = np.resize(mfcc_feat, (size,13))X.append(mfcc_feat)X = np.array(X)


#set the target labely = [i[0] for i in soundfile]Y = pd.get_dummies(y)

目标标签无非就是2000个录音文件按照发音数字的矩阵值“1”。
让我们看看这个矩阵的前三行:

print(Y[0:3])

  0  1  2  3  4  5  6  7  8  9
0  0  0  0  0  0  1  0  0  0  0
1  0  0  0  1  0  0  0  0  0  0
2  0  0  0  0  1  0  0  0  0  0

因此,前三个加载的录音对应于数字五、三和四。

让我们将目标标签转换成合适的矩阵:

Y = np.array(Y)

我们还可以输出自变量 X 的格式以更好地理解:

print(X.shape)

(2000, 48, 13)

因此,X 由2000 个 48 x 13矩阵组成,对应于使用MFCC函数为每个语音记录提取的特征。

现在是时候使用卷积神经网络来执行学习过程了。我们再看一下:

这种类型的架构还可以用于许多其他应用,包括图像识别和多种分类。在本例中,让我们应用它来实现我们的目标:语音识别。

model = Sequential()

#Convolution layers
model.add(Conv2D(8, (3, 3), activation=’relu’, input_shape=(size, 13,1)))
model.add(Conv2D(8, (3, 3), activation=’relu’))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.1))

#Flatteningmodel.add(Flatten(input_shape=(size, 13,1)))

#1st fully connected Neural Network hidden-layer
model.add(Dense(64))
model.add(Dropout(0.16))
model.add(Activation(‘relu’))

#2nd fully connected Neural Network hidden-layer
model.add(Dense(64))
model.add(Dropout(0.12))
model.add(Activation(‘relu’))

#Output layer
model.add(Dense(10))
model.add(Activation(‘softmax’))
model.summary()

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #  
=================================================================
conv2d_1 (Conv2D)            (None, 46, 11, 8)         80        
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 44, 9, 8)          584      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 22, 4, 8)          0        
_________________________________________________________________
dropout_1 (Dropout)          (None, 22, 4, 8)          0        
_________________________________________________________________
flatten_1 (Flatten)          (None, 704)               0        
_________________________________________________________________
dense_1 (Dense)              (None, 64)                45120    
_________________________________________________________________
dropout_2 (Dropout)          (None, 64)                0        
_________________________________________________________________
activation_1 (Activation)    (None, 64)                0        
_________________________________________________________________
dense_2 (Dense)              (None, 64)                4160      
_________________________________________________________________
dropout_3 (Dropout)          (None, 64)                0        
_________________________________________________________________
activation_2 (Activation)    (None, 64)                0        
_________________________________________________________________
dense_3 (Dense)              (None, 10)                650      
_________________________________________________________________
activation_3 (Activation)    (None, 10)                0        
=================================================================
Total params: 50,594
Trainable params: 50,594
Non-trainable params: 0

现在让我们使用SGD优化器编译模型:


sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss=’binary_crossentropy’,optimizer=sgd,metrics=[‘accuracy’])

我们需要将训练数据和测试数据分开,并使它们具有适当的大小,以便我们的 CNN 网络将其识别为适当的张量:


x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.25)x_train = x_train.reshape(-1, size, 13, 1)x_test = x_test.reshape(-1, size, 13, 1)

让我们拟合模型并评估性能:

history = model.fit(
x_train,
y_train,
epochs=18,
batch_size=32,
validation_split=0.2,
shuffle=True
)

model.evaluate(x_test, y_test, verbose=2)

Train on 1200 samples, validate on 300 samples
Epoch 1/18
1200/1200 [==============================] - 1s 469us/step - loss: 0.3319 - accuracy: 0.8967 - val_loss: 0.2683 - val_accuracy: 0.9070
Epoch 2/18
1200/1200 [==============================] - 0s 256us/step - loss: 0.2534 - accuracy: 0.9066 - val_loss: 0.1943 - val_accuracy: 0.9217
...
...
Epoch 18/18 1200/1200 [==============================] - 0s 254us/step - loss: 0.0444 - accuracy: 0.9837 - val_loss: 0.0425 - val_accuracy: 0.9880
Out[24]:
[0.039418088585138324, 0.9860000610351562]

以下是loss函数(损失)和准确性:

结论:一点也不差!
我们必须对 CNN 的各种参数进行一些研究才能得到这样的结果。

让我们通过预测测试数据集中可用的记录消息之一来尝试推理。

#Print the sound to be predicted
sound_index = 10
y_test[sound_index]

array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0], dtype=uint8)

在这种情况下,数字是六。
这是使用我们的模型做出的预测:

pred = model.predict(x_test[sound_index].reshape(-1,size,13,1))

print(“\n\033[1mPredicted digit sound: %.0f”%pred.argmax(),”\033[0m \n “)
print(“Predicted probability array:”)
print(pred)

Predicted digit sound: 6

Predicted probability array:
[[3.8950305e-02 9.8831032e-04 7.7098295e-02 8.1201904e-02 2.2223364e-03
 4.8808311e-04 6.2295502e-01 1.0375674e-03 1.6901042e-01 6.0477410e-03]]


神经网络语音识别模型就为大家介绍到这里,欢迎各位同学学习python数据科学相关知识《从0到1Python数据科学之旅》,包含多个实战案例,提供数据集和代码下载。

如果有更高需求朋友,例如研究生,博士生论文,企业建模需求,可商务联系up主,我们快速帮你们解决问题,节省大量时间。

版权声明:文章来自公众号(python风控模型),未经许可,不得抄袭。遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。


金融风控-神经网络语音识别模型介绍(附代码)的评论 (共 条)

分享到微博请遵守国家法律