百度深度学习7日—Day02 手势识别
深度学习三部曲
手势识别基于环境 paddlepaddle 1.7.0(因为我们要用到动态图)
建立模型
- 选择什么样的网络结构?
- 选择多少层数,每层选择多少神经元
其实神经网络也不一定要越深越好,越深的网络结构越复杂,以此来减少过拟合和无法传播到深处等问题,例如resnet和densenet等
我们可以选择简单的神经网络,例如lenet这样经典基础的网络
class LeNet(fluid.dygraph.Layer):
def __init__(self, training= True):
super(DenseNet, self).__init__()
self.conv1 = Conv2D(num_channels=3, num_filters=32, filter_size=3, act='relu')
self.pool1 = Pool2D(pool_size=2, pool_stride=2)
self.conv2 = Conv2D(num_channels=32, num_filters=32, filter_size=3, act='relu')
self.pool2 = Pool2D(pool_size=2, pool_stride=2)
self.conv3 = Conv2D(num_channels=32, num_filters=64, filter_size=3, act='relu')
self.pool3 = Pool2D(pool_size=2, pool_stride=2)
self.fc1 = Linear(input_dim=6400, output_dim=4096, act='relu')
self.drop_ratiol = 0.5 if training else 0.0
self.fc2 = Linear(input_dim=4096, output_dim=10)
def forward(self, inputs):
conv1 = self.conv1(inputs) # 32 32 98 98
pool1 = self.pool1(conv1) # 32 32 49 49
conv2 = self.conv2(pool1) # 32 32 47 47
pool2 = self.pool2(conv2) # 32 32 23 23
conv3 = self.conv3(pool2) # 32 64 21 21
pool3 = self.pool3(conv3) # 32 64 10 10
rs_1 = fluid.layers.reshape(pool3, [pool3.shape[0], -1])
fc1 = self.fc1(rs_1)
drop1 = fluid.layers.dropout(fc1, self.drop_ratiol)
y = self.fc2(drop1)
return y
这里我们使用paddlepaddle实现卷积神经网络
损失函数
选择常用损失函数,平方误差,交叉熵等损失函数
这里我们选择paddlepaddle中实现的交叉熵
fluid.layers.softmax_with_cross_entropy
这里提供一下paddlepaddle动态图的官方文档
https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/dygraph_cn.html
参数学习
- 梯度下降
- 反向传播算法
优化算法主要有GD,SGD,Momentum,RMSProp和Adam算法
我们选择 fluid.optimizer.Momentum 基于梯度的移动指数加权平均,他就像是拥有动量一样,没法说停就停【手动狗头】
我们使用paddlepaddle1.7.0的动态图进行训练
数据读取预处理部分
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