写在开头
我已经不是第一次接触paddle了,之前的也有零碎的听过一些paddle的课程。但是基本都摸鱼。一方面是自己忙(lan),另一方面确实事情比较多哈。但这次假期真的放了好久的说,本人自2017年来对深度学习颇感兴趣,但并未有比较系统的入门DL,大部分时间都在调参。我也觉得工业界和学术界是有一定的鸿沟的。深度学习的框架很多:Paddle,Tensorflow,Mxnet,PyTorch,Chainer等。讲真贪多嚼不烂,原理就是原理,这个是不会变的,但是调参的经验仍需要大量的实际。日后,应该是Auto 的天下,但是调参侠的末日可能没有来得那么早。
给新手的一点建议:
1.尽量使用轻量级的工具编写代码
2.学会使用IDE集成开发环境调试代码(Pycharm 等 宇宙无敌第一IDE VS也是可以的)
3.善用搜索引擎(但是要多问个为什么要这样做)
4.学会查阅文档(API)
5.不要死磕一个问题(超过6个小时解决不了,可以去求助别人)
6.在学习+实践中慢慢补充自己的知识面
Paddle作业和人流密度比赛 调参经验
1.选择合适的学习率 0.001是一个不错的选择
2.epoch设置成合适的大小,大了容易过拟合导致模型退化,小了模型不收敛
3.batch_size 越大越好(单卡),跨卡需要BN同步。好朋友告诉你,不要使用超过32的batch_size
4.模型的选择,不同的任务有不同的效果
5.里面大部分,我使用了VGG或者类VGG的结构
6.人流密度的使用了 论文里的 STEM结构,并加深了通道数。用于保持底层的特征纹理信息
7.模型集成的方法会提高整体的效果,受时间限制,还要改论文。所以人流密度只提交了5次
我把作业的基本思路放在下面的文件了,使用的时候留意一下python缩进哈~
Day1 新冠疫情可视化
############################# 饼图绘制代码 ############################################
import json
import datetime
from pyecharts.charts import Map,Pie
from pyecharts import options as opts# 读原始数据文件
today = datetime.date.today().strftime('%Y%m%d') #20200315datafile = 'data/'+ today + '.json'with open(datafile, 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())# 分析全国实时确诊数据:'confirmedCount'字段china_data = []for province in json_array:
china_data.append((province['provinceShortName'], province['confirmedCount']))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True) #reverse=True,表示降序,反之升序print(china_data)
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
c = (
Pie() # 生成饼图实例
.add("", [list(z) for z in zip(labels,counts)]) # 填入数据对
.set_global_opts(title_opts=opts.TitleOpts(title="新冠饼图"),legend_opts=opts.LegendOpts(is_show=False)) #设置标题,关闭label的名称显示
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("data/饼图.html")
)
Day2 手势识别
#DNN网络
class MyDNN(fluid.dygraph.Layer):
def__init__(self):
super(MyDNN,self).__init__()
self.hidden1 = Linear(100,128,act='relu')
self.hidden2 =Linear(128,256,act='relu')
self.hidden3 = Linear(256,512,act='relu')
self.hidden4 = Linear(512,1024,act='relu')
self.hidden5 = Linear(3*100*1024,10,act='softmax')
defforward(self,input):
x=self.hidden1(input)
x=self.hidden2(x)
x=self.hidden3(x)
#x=fluid.layers.dropout(x,dropout_prob=0.2) x=self.hidden4(x)
x=fluid.layers.dropout(x,dropout_prob=0.2)
x=paddle.fluid.layers.reshape(x,shape=[-1,3*100*1024])
x=fluid.layers.dropout(x,dropout_prob=0.2)
y=self.hidden5(x)
return y
DNN Val acc --0.80803573
#定义CNN网络 类似 VGG的一个CNN
class MyDNN(fluid.dygraph.Layer):
def __init__(self):
super(MyDNN,self).__init__()
self.hidden1 = Conv2D(3,64,3,padding=1,act='relu')
self.hidden2 = Conv2D(64,128,3,padding=1,act='relu')
self.hidden3 = Conv2D(128,256,3,padding=1,act='relu')
self.hidden4 = Conv2D(256,256,3,stride=2,padding=1,act='relu')
self.hidden5 = Conv2D(256,512,3,stride=1,padding=1,act='relu')
self.hidden6 = Conv2D(512,512,3,stride=2,padding=1,act='relu')
self.hidden7 = Conv2D(512,512,3,stride=1,padding=1,act='relu')
self.hidden8 = Conv2D(512,512,3,stride=2,padding=1,act='relu')
self.hidden9 = Linear(512*13*13,4096,act='relu')
self.hidden10 = Linear(4096,1024,act='relu')
self.hidden11 = Linear(1024,10,act='softmax')
defforward(self,input):
x=self.hidden1(input)
x=self.hidden2(x)
x=self.hidden3(x)
x=self.hidden4(x)
x=self.hidden5(x)
x=self.hidden6(x)
x=self.hidden7(x)
x=self.hidden8(x)
x=paddle.fluid.layers.reshape(x,shape=[-1,512*13*13])
x=self.hidden9(x)
x=self.hidden10(x)
y=self.hidden11(x)
return y
CNN Val acc --0.9285714
Day3 车牌识别
Batch_size=128
LR=0.001
num_epoch=200
#定义网络
class MyVGG(fluid.dygraph.Layer):
def__init__(self): super(MyVGG,self).__init__()
self.hidden1 = Conv2D(1,64,3,padding=1,act='relu')
self.hidden2 = Conv2D(64,128,3,padding=1,act='relu')
self.hidden3 = Conv2D(128,256,3,padding=1,act='relu')
self.hidden4 = Conv2D(256,256,3,stride=2,padding=1,act='relu')
self.hidden5 = Conv2D(256,512,3,stride=1,padding=1,act='relu')
self.hidden6 = Conv2D(512,512,3,stride=2,padding=1,act='relu')
self.hidden7 = Conv2D(512,512,3,stride=1,padding=1,act='relu')
self.hidden8 = Conv2D(512,512,3,stride=2,padding=1,act='relu')
self.hidden9 = Linear(512*3*3,4096,act='relu')
self.hidden10 = Linear(4096,1024,act='relu')
self.hidden11 = Linear(1024,65,act='softmax')
def forward(self,input):
x=self.hidden1(input)
x=self.hidden2(x)
x=self.hidden3(x)
x=self.hidden4(x)
x=self.hidden5(x)
x=self.hidden6(x)
x=self.hidden7(x)
x=self.hidden8(x)
x=paddle.fluid.layers.reshape(x,shape=[-1,512*3*3])
x=self.hidden9(x)
x=self.hidden10(x)
y=self.hidden11(x)
return y
Day4 口罩识别
classVGGNet(fluid.dygraph.Layer): '''
VGG网络
''' def__init__(self): super(VGGNet, self).__init__()
self.hidden1 = ConvPool(3,64,3,2,2,2,conv_padding=1,act='relu')
self.hidden2 = ConvPool(64,128,3,2,2,2,conv_padding=1,act='relu')
self.hidden3 = ConvPool(128,256,3,2,2,3,conv_padding=1,act='relu')
self.hidden4 = ConvPool(256,512,3,2,2,3,conv_padding=1,act='relu')
self.hidden5 = ConvPool(512,512,3,2,2,3,conv_padding=1,act='relu')
self.hidden6 = fluid.Linear(512*7*7,4096,act='relu')
self.hidden7 = fluid.Linear(4096,4096,act='relu')
self.hidden8 = fluid.Linear(4096,2,act='softmax')
defforward(self, inputs, label=None): """前向计算"""
x=self.hidden1(inputs)
# print(x.shape)
x=self.hidden2(x)
# print(x.shape)
x=self.hidden3(x)
# print(x.shape)
x=self.hidden4(x)
# print(x.shape)
x=self.hidden5(x)
# print(x.shape)
x=paddle.fluid.layers.reshape(x,shape=[-1,512*7*7])
x=fluid.layers.dropout(x,dropout_prob=0.5)
x=self.hidden6(x)
x=fluid.layers.dropout(x,dropout_prob=0.5)
x=self.hidden7(x)
x=fluid.layers.dropout(x,dropout_prob=0.5)
y=self.hidden8(x)
acc=fluid.layers.accuracy(y,label)#计算精度
return y,acc
Day5
Day6 paddle slim 对slim不是很熟悉。所以这里放以后再探讨啦
Day7 人流密度检测(Baseline 强化版+未调参 0.46)
当前提交,实时排名:18lr:0.001
epoch:100
batchsize:12 塞满卡为宜
classCNN(fluid.dygraph.Layer):
def__init__(self):
super(CNN, self).__init__()
self.conv01_1 = fluid.dygraph.Conv2D(num_channels=3, num_filters=128,filter_size=3,padding=1,act="relu")
# STEM
self.conv01_2 = fluid.dygraph.Conv2D(num_channels=128, num_filters=128,filter_size=3,padding=1,act="relu")
self.conv01_3 = fluid.dygraph.Conv2D(num_channels=128, num_filters=128,filter_size=3,padding=1,act="relu")
self.pool01=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv02_1 = fluid.dygraph.Conv2D(num_channels=128, num_filters=128,filter_size=3, padding=1,act="relu")
self.conv02_2 = fluid.dygraph.Conv2D(num_channels=128, num_filters=128,filter_size=3, padding=1,act="relu")
self.pool02=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv03_1 = fluid.dygraph.Conv2D(num_channels=128, num_filters=256,filter_size=3, padding=1,act="relu")
self.conv03_2 = fluid.dygraph.Conv2D(num_channels=256, num_filters=256,filter_size=3, padding=1,act="relu")
self.pool03=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv04_1 = fluid.dygraph.Conv2D(num_channels=256, num_filters=512,filter_size=3, padding=1,act="relu")
self.conv05_1 = fluid.dygraph.Conv2D(num_channels=512, num_filters=512,filter_size=3,padding=1, act="relu")
self.conv06 = fluid.dygraph.Conv2D(num_channels=512,num_filters=256,filter_size=3,padding=1,act='relu')
self.conv07 = fluid.dygraph.Conv2D(num_channels=256,num_filters=128,filter_size=3,padding=1,act='relu')
self.conv08 = fluid.dygraph.Conv2D(num_channels=128,num_filters=64,filter_size=3,padding=1,act='relu')
self.conv09 = fluid.dygraph.Conv2D(num_channels=64,num_filters=1,filter_size=1,padding=0,act=None)
defforward(self, inputs, label=None): """前向计算"""
out = self.conv01_1(inputs)
out = self.conv01_2(out)
out = self.conv01_3(out)
out = self.pool01(out)
out = self.conv02_1(out)
out = self.conv02_2(out)
out = self.pool02(out)
out = self.conv03_1(out)
out = self.conv03_2(out)
out = self.pool03(out)
out = self.conv04_1(out)
out = self.conv05_1(out)
out = self.conv06(out)
out = self.conv07(out)
out = self.conv08(out)
out = self.conv09(out)
return out
网友评论