飞桨PaddlePaddle——百度架构师手把手带你零基础实践深度学习
首先,在CSDN注册账号很久了,一直以来都是看各位大佬的blog,也没有发表过自己的想法。在学习上出现了疑惑,第一件事就是来CSDN上寻找帮助,非常感谢各位大佬的无私分享。
最近我在百度AI Studio课程中参加了21天的百度架构师手把手带你零基础实践深度学习课程,课程即将结束,于是就课程的整体给大家分享下我的感受与课程中的一些想法。
课程整体感受
在历经21天之后,回顾这段时间,收获颇多。首先对自己感到骄傲,能够每天坚持学习完当天的课程任务,并且按时完成了打卡,要知道这可是暑假,我居然每天都在学习,还学习了21天,有点不真实,就像是一场梦,醒来还是很感动,淡黄的。。。。。。咳咳,言归正传,再者也确实是真的学到了东西的,百度的课程干货很多,并且免费提供GPU算力,只要每天运行下项目即可赠送12小时的算力,这对于我们这种既没钱买高昂的设备,又是新手小白来说,真的是非常友好,给各位想学深度学习的小白们强烈安利。
接下来我将大致总结下这门课。
深度学习的基本流程
深度学习是用来实现人工智能的一种方式,它相比机器学习而言,我觉得更加简单,更加容易上手,因为它基本上都有一套流程,只要你掌握了这套流程,基本上你也可以设计出一个模型,至于结果的好坏,就是个不断优化调整的过程。
如图所示(图片来自于百度架构师手把手带你零基础实践深度学习课程),从纵向看,深度学习一般都遵循数据处理、模型设计、训练配置、训练过程、以及模型保存这五个基本步骤;从横向看,每一步都可以进行优化调整,如数据的处理可以优化使得读取更快,训练配置中的学习率的调整能使得模型更好的收敛等等。
“Roman wasn’t built in a day”,一个好的深度学习模型也是经过不变的优化得到的。百度飞桨开设的这门课正是从这五个步骤出发,从最开始的房价预测模型到最后的YoLoV3算法,由浅入深,层层递进,使人学起来很轻松。
关于锚框的理解
将原始图片划分成m×n个区域,原始图片高度H=640,宽度W=480,如果我们选择小块区域的尺寸为32×32,则m和n分别为:
m=640/32=20
n=480/32=15
如下图所示(图片来自于百度架构师手把手带你零基础实践深度学习课程),将原始图像分成了20行15列小方块区域。
然后在YoLoV3中,以基本小方块为中心取不同的尺寸,就变成了预测框,课程中的代码是输入指定anchor的尺寸大小的,我们其实也可以固定anchor的基本长度,然后在此基础上进行形状调整也可以,代码如下(来自SiamRPN论文的代码):
def generate_anchors(total_stride, base_size, scales, ratios, score_size): # 其中base_size为anchor的基本大小,scales为放缩大小,ratios为宽高比例
anchor_num = len(ratios) * len(scales)
anchor = np.zeros((anchor_num, 4), dtype=np.float32)
size = base_size * base_size
count = 0
for ratio in ratios:
# ws = int(np.sqrt(size * 1.0 / ratio))
# ratio = h / w, s = w * h = w * w * ratio, w = sqrt(s / ratio), h = w * ratio
ws = int(np.sqrt(size / ratio))
hs = int(ws * ratio)
for scale in scales:
wws = ws * scale
hhs = hs * scale
anchor[count, 0] = 0
anchor[count, 1] = 0
anchor[count, 2] = wws
anchor[count, 3] = hhs
count += 1
anchor = np.tile(anchor, score_size * score_size).reshape((-1, 4))
ori = - (score_size // 2) * total_stride
x, yy = np.meshgrid([ori + total_stride * dx for dx in range(score_size)],
[ori + total_stride * dy for dy in range(score_size)])
xx, yy = np.tile(xx.flatten(), (anchor_num, 1)).flatten(), \
np.tile(yy.flatten(), (anchor_num, 1)).flatten()
anchor[:, 0], anchor[:, 1] = xx.astype(np.float32), yy.astype(np.float32)
return anchor