Keras训练和识别实例


keras:一个用python编写的神经网络API,能够以tensorflow、cntk、theano作为后端运行。
 

一、模型训练:


训练文件已上传到了百度云盘:https://pan.baidu.com/s/1Au85kI_oeDjode2hWumUvQ

文件夹名就是里面的语音的标签,语音由很多不同年龄性别的人发音收集而来

取了seven , stop和happy 三个语音类别来进行训练和识别,每个大概2700多个文件。并且分别从三个文件夹中剪切出来100个当做测试集,并每样拿出1个当做后面的试验集

'''
使用案例,训练两个类型的语音,然后测试,对CPU和内存要求不高。内存使用在 1G 左右
'''
import wave
import matplotlib.pyplot as plt
import numpy as np
import os

import keras
from keras.models import Sequential
from keras.layers import Dense



# 加载数据集 和 标签[并返回标签集的处理结果]
def create_datasets():
    wavs=[]
    labels=[] # labels 和 testlabels 这里面存的值都是对应标签的下标,下标对应的名字在labsInd中
    testwavs=[]
    testlabels=[]

    labsInd=[]      ## 训练集标签的名字   0:seven   1:stop   2:happy
    testlabsInd=[]  ## 测试集标签的名字   0:seven   1:stop   2: happy

    path="D:\\wav\\seven\\"
    files = os.listdir(path)
    for i in files:
        # print(i)
        waveData = get_wav_mfcc(path+i)
        # print(waveData)
        wavs.append(waveData)
        if ("seven" in labsInd)==False:
            labsInd.append("seven")
        labels.append(labsInd.index("seven"))

    path="D:\\wav\\stop\\"
    files = os.listdir(path)
    for i in files:
        # print(i)
        waveData = get_wav_mfcc(path+i)
        wavs.append(waveData)
        if ("stop" in labsInd)==False:
            labsInd.append("stop")
        labels.append(labsInd.index("stop"))

    path="D:\\wav\\happy\\"
    files = os.listdir(path)
    for i in files:
        # print(i)
        waveData = get_wav_mfcc(path+i)
        wavs.append(waveData)
        if ("happy" in labsInd)==False:
            labsInd.append("happy")
        labels.append(labsInd.index("happy"))


    # 现在为了测试方便和快速直接写死,后面需要改成自动扫描文件夹和标签的形式
    path="D:\\wav\\test1\\"
    files = os.listdir(path)
    for i in files:
        # print(i)
        waveData = get_wav_mfcc(path+i)
        testwavs.append(waveData)
        if ("seven" in testlabsInd)==False:
            testlabsInd.append("seven")
        testlabels.append(testlabsInd.index("seven"))


    path="D:\\wav\\test2\\"
    files = os.listdir(path)
    for i in files:
        # print(i)
        waveData = get_wav_mfcc(path+i)
        testwavs.append(waveData)
        if ("stop" in testlabsInd)==False:
            testlabsInd.append("stop")
        testlabels.append(testlabsInd.index("stop"))

    path="D:\\wav\\test3\\"
    files = os.listdir(path)
    for i in files:
        # print(i)
        waveData = get_wav_mfcc(path+i)
        testwavs.append(waveData)
        if ("happy" in testlabsInd)==False:
            testlabsInd.append("happy")
        testlabels.append(testlabsInd.index("happy"))

    wavs=np.array(wavs)
    labels=np.array(labels)
    testwavs=np.array(testwavs)
    testlabels=np.array(testlabels)
    return (wavs,labels),(testwavs,testlabels),(labsInd,testlabsInd)


def get_wav_mfcc(wav_path):
    f = wave.open(wav_path,'rb')
    params = f.getparams()
    # print("params:",params)
    nchannels, sampwidth, framerate, nframes = params[:4]
    strData = f.readframes(nframes)#读取音频,字符串格式
    waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为int
    waveData = waveData*1.0/(max(abs(waveData)))#wave幅值归一化
    waveData = np.reshape(waveData,[nframes,nchannels]).T
    f.close()

    # print(waveData)

    # plt.rcParams['savefig.dpi'] = 300 #图片像素
    # plt.rcParams['figure.dpi'] = 300 #分辨率
    # plt.specgram(waveData[0],Fs = framerate, scale_by_freq = True, sides = 'default')
    # plt.ylabel('Frequency(Hz)')
    # plt.xlabel('Time(s)')
    # plt.title('wa')
    # plt.show()

    ### 对音频数据进行长度大小的切割,保证每一个的长度都是一样的【因为训练文件全部是1秒钟长度,16000帧的,所以这里需要把每个语音文件的长度处理成一样的】
    data = list(np.array(waveData[0]))
    # print(len(data))
    while len(data)>16000:
        del data[len(waveData[0])-1]
        del data[0]
    # print(len(data))
    while len(data)<16000:
        data.append(0)
    # print(len(data))

    data=np.array(data)

    # 平方之后,开平方,取正数,值的范围在  0-1  之间
    data = data ** 2
    data = data ** 0.5

    return data


if __name__ == '__main__':
    (wavs,labels),(testwavs,testlabels),(labsInd,testlabsInd) = create_datasets()
    print(wavs.shape,"   ",labels.shape)
    print(testwavs.shape,"   ",testlabels.shape)
    print(labsInd,"  ",testlabsInd)

    # 标签转换为独热码
    labels = keras.utils.to_categorical(labels, 3)
    testlabels = keras.utils.to_categorical(testlabels, 3)
    print(labels[0]) ## 类似 [1. 0. 0]
    print(testlabels[0]) ## 类似 [0. 0. 0]

    print(wavs.shape,"   ",labels.shape)
    print(testwavs.shape,"   ",testlabels.shape)

    # 构建sequential顺序模型,由多个网络层线性堆叠的栈。使用其API可以构建任意的神经网络图。
    model = Sequential()
    #可以简单地使用 .add() 来堆叠模型,Dense(768) 是一个具有 768 个隐藏神经元的全连接层。
    model.add(Dense(768, activation='relu',input_shape=(16000,)))
    model.add(Dense(384, activation='relu'))
    model.add(Dense(96, activation='relu'))
    model.add(Dense(3, activation='softmax'))
    # [编译模型] 配置模型,损失函数采用交叉熵,优化采用Adadelta,将识别准确率作为模型评估
    #如果需要,你还可以进一步地配置你的优化器。Keras的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)
    model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])
    #  validation_data为验证集
    #  批量地在训练数据上进行迭代,以 124 个样本为一个 batch 进行迭代
    model.fit(wavs, labels, batch_size=124, epochs=5, verbose=1, validation_data=(testwavs, testlabels))

    # 开始评估模型效果 # verbose=0为不输出日志信息
    score = model.evaluate(testwavs, testlabels, verbose=0)
    print('Test loss:', score[0])
    print('Test accuracy:', score[1]) # 准确度

    model.save('asr_model_weights.h5') # 保存训练模型

二、测试:

import wave
import numpy as np
import os
from keras.models import load_model



def get_wav_mfcc(wav_path):
    f = wave.open(wav_path,'rb')
    params = f.getparams()
    # print("params:",params)
    nchannels, sampwidth, framerate, nframes = params[:4]
    strData = f.readframes(nframes)#读取音频,字符串格式
    waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为int
    waveData = waveData*1.0/(max(abs(waveData)))#wave幅值归一化
    waveData = np.reshape(waveData,[nframes,nchannels]).T
    f.close()

    ### 对音频数据进行长度大小的切割,保证每一个的长度都是一样的【因为训练文件全部是1秒钟长度,16000帧的,所以这里需要把每个语音文件的长度处理成一样的】
    data = list(np.array(waveData[0]))
    # print(len(data))
    while len(data)>16000:
        del data[len(waveData[0])-1]
        del data[0]
    # print(len(data))
    while len(data)<16000:
        data.append(0)
    # print(len(data))

    data=np.array(data)
    # 平方之后,开平方,取正数,值的范围在  0-1  之间
    data = data ** 2
    data = data ** 0.5
    return data


if __name__ == '__main__':
    # 构建模型
    model = load_model('asr_model_weights.h5') # 加载训练模型
    wavs=[]
    wavs.append(get_wav_mfcc("D:\\wav\\trunk\\1_0.wav"))
    X=np.array(wavs)
    print(X.shape)
    result=model.predict(X[0:1])[0] # 识别出第一张图的结果,多张图的时候,把后面的[0] 去掉,返回的就是多张图结果
    print("识别结果",result)
    #  因为在训练的时候,标签集的名字 为:  0:seven   1:stop  2:happy  0,1,2 是下标
    name = ["seven","stop","happy"] # 创建一个跟训练时一样的标签集
    ind=0 # 结果中最大的一个数
    for i in range(len(result)):
        print(i)
        if result[i] > result[ind]:
            ind=i
    print("识别的语音结果是:",name[ind])

识别结果:


源码下载:

https://github.com/BenShuai/kerasTfPoj.git

 

参考:

https://blog.csdn.net/sunshuai_coder/article/details/83658625

https://blog.csdn.net/u011067684/article/details/83024777

https://keras.io/zh/getting-started/sequential-model-guide/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Keras是一种深度学习框架,可以用于实现人脸识别任务。人脸识别是一种常见的计算机视觉任务,通过深度学习技术,可以从图像中自动识别识别出人脸。下面是一种可能的实现人脸识别的步骤: 1. 数据收集:首先,需要收集包含不同人脸的图像数据集。这些数据集应包含来自不同实例和环境的人脸图像。 2. 数据预处理:对收集到的人脸图像进行预处理,包括图像的大小调整、灰度化、去噪和直方图均衡化等操作。这些步骤可提高人脸识别的准确性和鲁棒性。 3. 搭建深度学习模型:使用Python Keras框架来搭建深度学习模型。可以选择用于后续任务的不同模型架构,如卷积神经网络(CNN)和人脸识别特定模型。Keras提供了许多预先训练好的模型,如VGG16和ResNet等,这些模型已经在大型图像数据集上进行了训练,可以提供良好的性能。 4. 模型训练:使用预处理后的人脸图像数据集对深度学习模型进行训练。这包括将数据集划分为训练集和测试集,以评估模型的性能。通过在训练集上迭代多次来调整模型的权重和参数,以最小化损失函数,提高模型的准确性。 5. 模型测试和评估:使用测试集评估经过训练的模型的性能。通过计算准确率、召回率和F1分数等指标来评估模型的性能。可以根据需求对模型进行调整和改进。 6. 部署模型和人脸识别:在模型训练和评估后,可以将模型部署到实际应用中。例如,可以构建一个应用程序,通过摄像头捕获图像,并使用已训练好的模型识别人脸。可以将识别结果与数据库中存储的人脸信息进行比对,以确认身份。 总之,Python Keras提供了丰富的工具和技术,可以实现人脸识别任务。通过收集数据、预处理、模型搭建、训练、评估和部署等步骤,可以构建一个准确和鲁棒的人脸识别系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值