训练集是由百度AI Studio提供的经典手势图片,共有两千多张。
https://aistudio.baidu.com/aistudio/datasetdetail/23668
这次深度学习使用的框架是百度推出的paddlepaddle飞桨。
paddle的使用手册 https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/index_cn.html
本次深度学习共使用了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
隐藏层使用的激活函数是ReLu
输出层使用的激活函数是Softmax
#定义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')#保存模型
使用上述的所有参数,最后测试集的平均acc为0.8715278。
百度的小哥单纯使用DNN+dropout防止过拟合,测试集可以达到0.95。
看来我还是要多调调参啊。