手势识别(基于Paddle飞桨框架)

目录

    • 训练集
    • 框架
    • 深度学习
    • DNN模型
      • 引用的包
      • 定义DNN网络
      • 使用动态图进行训练
      • 测试集结果

训练集

训练集是由百度AI Studio提供的经典手势图片,共有两千多张。

https://aistudio.baidu.com/aistudio/datasetdetail/23668

解压完后,分别有0-9的各个手势。
手势识别(基于Paddle飞桨框架)_第1张图片

框架

这次深度学习使用的框架是百度推出的paddlepaddle飞桨。

paddle的使用手册 https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/index_cn.html

深度学习

  • 建立模型(本次使用DNN模型)
  • 选择常用损失函数,平方误差,交叉熵…
  • 参数学习

DNN模型

手势识别(基于Paddle飞桨框架)_第2张图片
本次深度学习共使用了4层隐藏层,学习率设置为0.005,迭代次数选择了500次。运行环境是CPU: 2 Cores. RAM: 8GB.的免费版本,训练时长59分钟。

引用的包

import os
import time
import random
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import paddle
import paddle.fluid as fluid
import paddle.fluid.layers as layers
from multiprocessing import cpu_count
from paddle.fluid.dygraph import Pool2D,Conv2D
from paddle.fluid.dygraph import Linear

定义DNN网络

隐藏层使用的激活函数是ReLu
输出层使用的激活函数是Softmax
手势识别(基于Paddle飞桨框架)_第3张图片

#定义DNN网络
class MyDNN(fluid.dygraph.Layer):
    def __init__(self):
        super(MyDNN,self).__init__()
        self.hidden1 = Linear(100,100,act='relu')
        self.hidden2 = Linear(100,100,act='relu')
        self.hidden3 = Linear(100,100,act='relu')
        self.hidden4 = Linear(100,100,act='relu')
        self.hidden5 = Linear(3*100*100,10,act='softmax')
    def forward(self,input):
        x=self.hidden1(input)
        x=self.hidden2(x)
        x=self.hidden3(x)
        x=self.hidden4(x)
        x=fluid.layers.reshape(x,shape=[-1,3*100*100])
        y=self.hidden5(x)
        return y

使用动态图进行训练


#用动态图进行训练
with fluid.dygraph.guard():
    model=MyDNN() #模型实例化
    model.train() #训练模式
    opt=fluid.optimizer.SGDOptimizer(learning_rate=0.005, parameter_list=model.parameters())#优化器选用SGD随机梯度下降,学习率为0.001.

    epochs_num=500 #迭代次数
    
    for pass_num in range(epochs_num):
        
        for batch_id,data in enumerate(train_reader()):
            
            images=np.array([x[0].reshape(3,100,100) for x in data],np.float32)
            
            labels = np.array([x[1] for x in data]).astype('int64')
            labels = labels[:, np.newaxis]
            # print(images.shape)
            image=fluid.dygraph.to_variable(images)
            label=fluid.dygraph.to_variable(labels)
            predict=model(image)#预测
            # print(predict)
            loss=fluid.layers.cross_entropy(predict,label)
            avg_loss=fluid.layers.mean(loss)#获取loss值
            
            acc=fluid.layers.accuracy(predict,label)#计算精度
            
            if batch_id!=0 and batch_id%50==0:
                print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))
            
            avg_loss.backward()
            opt.minimize(avg_loss)
            model.clear_gradients()
            
    fluid.save_dygraph(model.state_dict(),'MyDNN')#保存模型
 

迭代效果
手势识别(基于Paddle飞桨框架)_第4张图片

测试集结果

使用上述的所有参数,最后测试集的平均acc为0.8715278。
百度的小哥单纯使用DNN+dropout防止过拟合,测试集可以达到0.95。
看来我还是要多调调参啊。

你可能感兴趣的:(神经网络)