上一篇讲了产品经理也能动手实践的AI(二)- 做个识别宠物的AI,今天讲如何自己选择要识别的物种(我选了3种猫),做成AI,并把它发布到线上,长按下图二维码即可体验。
接下来说今天的主要内容,我发现这样的梳理过程真的能够强化知识,推荐大家真的想学一样东西都用这种方式,当你能向别人表达清楚的时候,也就是学会了。
概览
首先今天的训练数据需要自己整理,不过比想象中的简单,借助google 图片就可以;然后训练环节和上一节没差多少,不过其中的原理会展开讲解;最后发布到线上可以借助onrender.com或者Google Cloud,都已经测通,主要部署分2部分内容,一个是训练好的模型,一个是应用展示的文件。
核心步骤
把每一个种类的图片url整理出来
把图片批量下载下来
创建数据堆 DataBunch
训练模型
调节到更高的准确率
发布到线上
期中3-5上一讲已经描述过了,这一节主要讲1.2.6,同时这一节有比较多的数学相关的内容,主要是SGD(随机梯度下降),看起来很复杂,但只要有耐心看个2-3遍,其实还是可以理解的。
核心数学概念
均方差 MSE:两个数差的平方的平均值,是loss的值,是预测和实际偏差的大小。
最大自变量点集 argmax:是一个函数,在实际应用中是求一堆值当中最大的那个的索引值
点积 dot product:比如a = [a1, a2,…, an] b = [b1, b2,…, bn] a·b=a1b1+a2b2+……+anbn。
矩阵乘积 matrix product:2个矩阵相乘的和
线性函数 linear function:y = ax + b
导数 derivative:可简单理解为斜率
梯度 gradient:更多维度的斜率,比如看到一个坑,哪一边到坑底的路线最陡峭,就是梯度最大
y上面带了个帽子 ŷ:一般指代预测值
核心专业词汇
向量 vector:一维的数组,比如[ 2 , 3 ]
矩阵 matrix:二维的数据,比如[ [ 2 , 3 ] , [ 4 , 5 ] ]
张量 tensor:一种形状规则的数组,向量也叫一阶张量,矩阵叫二阶张量,还有三阶五阶张量……
学习率 learning rate:一个乘以梯度来决定权重变化大小的值
拟合 fit:形象的说,就是把平面上一系列的点用一条光滑的曲线连接起来
一波数据 epoch:把数据完整使用一遍叫1个epoch
迷你批次 mini-batches:当数据量太大时,每次训练会随机抽去样本数据用来训练,多个mini-batches可以组成1个epoch
模型 model/architecture:通过权重值去拟合的函数
权重值 parameters/coefficients/weights:也叫系数、参数,用来控制函数图形,来拟合训练数据形成的规律
损失函数 loss function:一个用来计算预测值和实际值偏差大小的函数
欠拟合/过度拟合 underfitting/overfitting:前者有点像大趋势,就是谁都能判断的;后者像细节规律往往是因人而异不能一概论之
示例详细讲解
首先是整理图片数据,想象中是个很头疼的问题,貌似要掌握爬虫技巧,但这里有种更便捷的方式,就是打开chrome的开发者工具,然后粘贴如下代码,就可以把当前页的图片url都打包成一个csv文件下载下来
然后是下载图片和清理无效图片,Jeremy非常贴心的把这些细枝末节的命令都提供好了,真的是在用一种解决问题的思路写教程,而不仅仅是为了严谨。
download_images(path/file, dest, max_pics=200)
verify_images(path/c, delete=True, max_workers=8)
而且自己整理数据的时候还会遇到没有验证组数据的问题,这里有个参数叫valid_pct,可以直接设定一个比例,系统会自动划分出验证组的数据。
data = ImageDataBunch.from_folder(path, train=".", valid_pct=0.2, ds_tfms=get_transforms(), size=224, num_workers=4).normalize(imagenet_stats)
然后经过了和上一篇类似的训练,现在想优化error rate,那就用到了上次没展开说的工具,FileDeleter
from fastai.widgets import *
losses,idxs = interp.top_losses()
top_loss_paths = data.valid_ds.x[idxs]
fd = FileDeleter(file_paths=top_loss_paths)
通过这个就可以找出异常的图片,借助人类的判断,把干扰图片清除
最后课程演示了一个在Jupyter Notebook中部署的逻辑,有利于了解其中的原理,想直接部署到线上也很简单,https://course.fast.ai/deployment_render.html 这是官网部署的教程。
原理详细讲解
这一节讲了非常多的概念和原理,但主要都是围绕SGD,这个最普遍的、模型训练时,所依赖的原理。首先看这张图,中间的状态就是想通过SGD实现的效果,但为了简化,我们先从一个最简单的案例去理解。
先来一个最简单的,假设蓝点是输入的数据,橙点是预测的数据,预测的数据是根据训练好的模型计算出来的,而这个训练好的模型是一个线性函数,就是一条直线,,所以这节课演示的就是如何根据蓝色的点,预测出这个线性函数。
过程中Jeremy老师做的非常详细,包括蓝色点点是如何通过一个随机函数生成出来的,都详细的讲解了,太负责任了……但这里不过多讲解,只说核心。
首先生成好了训练数据
然后初始化一个预测函数,比如就是这个横着的 y = 1x +1,这里的系数就是[ 1 , 1 ],而最终的目标系数是[ 3 , 2 ],那如何移动这条直线呢?
这里就涉及到好几个概念:learning rate,loss function,gradient。
移动这条直线的方式会有很多,但如何判断怎么移动是对的呢,就通过loss function 计算MSE 均方差,可以看到预测数据和训练数据的差距,差距越来越小,就证明拟合到位了。
移动的方式有上下移动或者旋转,情况很多,但其实都可以通过gradient一个值来判断,通过改变gradient的值就能计算出loss有多少,就知道这样的调节对不对了。
而learning rate决定的就是调节的幅度,调节的幅度太快反而容易迷失了。
最后Jeremy还教大家用matplotlib,去动态演示绘制SGD的过程,本质上就是机器学习的过程,就是如何把这个案例中的直线移动到相符的位置上的过程。
而一开始的y = ax + b的函数,如果再增加一个维度的话:y = a1x1 + a2x2,如果x2 = 1的话,那就是如上的情况,如果x2是个变化的话,那就是更复杂的训练过程,之后会有更详细的讲解。
好了,核心都提炼出来了,但其实第二课讲的远远不止这些,详情请点击阅读原文,查看完整的课程笔记。
相关阅读
如果你喜欢思考,别忘记关注+置顶公众号哦!
我是Hawk,8年产品经理,目前专注AI机器学习。
好看的人都点了在看