【实验练习】基于BP神经网络的语音特征信号分类(Python实现) 内容原创

题目

采用BP神经网络方法完成数据的分类

数据集

四份文件data1.data, data2.data, data3.data, data4.data,分别表示4组(500×25)的语音数据,每组数有25维,第1维为类别标识,后24维为语音特征信号。4组语音信号可用1,2,3,4来进行标识。

要求

训练集:随机选取1500组数据作为训练数据。

测试集:剩余500组数据作为测试数据。

根据BP神经网络建立数据分类模型实现语音信号的分类。

评价指标:对BP神经网络分类结果的正确率进行讨论。

# -*- coding: utf-8 -*- #
"""
@Project    :NIR-Mathematical-Modeling-Tool 
@File       :main.py 
@Author     :ZAY
@Time       :2023/6/4 15:44
@Annotation : " "
"""

if __name__ == "__main__":

    store_path = './/model//BPNet.pt'
    txt_path = './/Result//BPNet.txt'

    # 下载四类语音信号
    c1 = scio.loadmat('.//Data//data1.mat')
    c2 = scio.loadmat('.//Data//data2.mat')
    c3 = scio.loadmat('.//Data//data3.mat')
    c4 = scio.loadmat('.//Data//data4.mat')

    # print(type(c1)) # <class 'dict'>
    c1 = c1.get('c1')
    c2 = c2.get('c2')
    c3 = c3.get('c3')
    c4 = c4.get('c4')

    c1 = np.array(c1)
    c1 = np.array(c1)
    c1 = np.array(c1)
    c1 = np.array(c1)
    # print(c1.shape) # (500, 25)

    # scio.savemat(New_path, {'A': a, b}) # 以字典的形式保存

    # 四个特征信号矩阵合成一个矩阵
    data = np.vstack((c1[:, :], c2[:, :])) # 按垂直方向(行顺序)堆叠数组构成一个新的数组
    data = np.vstack((data[:, :], c3[:, :]))
    data = np.vstack((data[:, :], c4[:, :]))
    # print(data.shape) # (2000, 25)

    # 从1到2000间随机排序
    k = np.random.rand(2000)
    n = np.argsort(k) # 将k中的元素从小到大排列,提取其在排列前对应的index(索引)输出。
    print(n)

    # 输入输出数据
    input_data = data[:, 1:25]
    output_data = data[:, 0]
    # output_data = np.expand_dims(output_data,axis = 1)
    # print(output_data.shape) # (2000, 1)
    # print(output_data)

    # 把输出label从[1,2,3,4]变成[0,1,2,3]
    for i in range(2000):
        output_data[i] = output_data[i] - 1

    # 把输出从1维变成4维
    # output = np.zeros((2000, 4))
    # for i in range(2000):
    #     if output_data[i] == 1:
    #         output[i, :] = [1, 0, 0, 0]
    #     elif output_data[i] == 2:
    #         output[i, :] = [0, 1, 0, 0]
    #     elif output_data[i] == 3:
    #         output[i, :] = [0, 0, 1, 0]
    #     elif output_data[i] == 4:
    #         output[i, :] = [0, 0, 0, 1]

    output = output_data

    # 随机提取1500个样本为训练样本,500个样本为预测样本
    input_train = input_data[n[:1400], :]
    output_train = output[n[:1400]]
    input_val = input_data[n[1400:1500], :]
    output_val = output[n[1400:1500]]
    input_test = input_data[n[1500:], :]
    output_test = output[n[1500:]]

    # print(input_train.shape) # (1400, 24)
    # print(output_train.shape) # (1400, 1)
    # print(input_val.shape) # (100, 24)
    # print(output_val.shape) # (100, 1)
    # print(input_test.shape) # (500, 24)
    # print(output_test.shape) # (500, 1)

    # 升维用于其他网络 例如CNN
    # input_train = input_train[:, np.newaxis, :]
    # input_val = input_val[:, np.newaxis, :]
    # 输入数据归一化
    # inputn, inputps = MapMinMaxApplier.mapminmax(input_train)  # #默认为-1,1

    cal_ds = MyDataset(input_train, output_train)  # TrainSet TensorData
    val_ds = MyDataset(input_val, output_val)  # TestSet TensorData
    test_ds = MyDataset(input_test, output_test)

    modeltrian(path=store_path, data_train = cal_ds, data_test = val_ds)  

    modeltest(path=store_path, data_test = test_ds, txt_path = txt_path)

BPNet 网络

# -*- coding: utf-8 -*- #
"""
@Project    :NIR-Mathematical-Modeling-Tool 
@File       :BPNet.py 
@Author     :ZAY
@Time       :2023/6/4 15:56
@Annotation : " "
"""

import torch
import torch.nn as nn


class BPNet(nn.Module):
    def __init__(self):
        super(BPNet, self).__init__()
        self.fc1 = nn.Sequential(
            nn.Linear(24, 96),
            nn.ReLU()
        )
        # self.fc2 = nn.Sequential(
        #     nn.Linear(100, 50),
        #     nn.Sigmoid()
        # )

        self.predict = nn.Linear(96, 4)
        self.act = nn.ReLU()

    def forward(self, x):
        x = self.act(self.predict(self.fc1(x)))
        return x


# net = BPNet()
# print(net)

测试结果

DATE:_2023-06-05_18-33-10, TEST:Acc= 0.8661, train_time = 0:00:08.596997, test_time = 0:00:00.006983
当前模型参数量: 0.002788 M

实验数据和完整代码请私信 

猜你喜欢

转载自blog.csdn.net/Next_SummerAgain/article/details/131056320
今日推荐