前端技术深度

核心提示2018 AI 开发者大会是一场由中美人工智能技术高手联袂打造的 AI 技术与产业的年度盛会!这里有 15+ 硅谷实力讲师团、80+AI 领军企业技术核心人物、100+ 技术&大众实力媒体、1500+AI 专业开发者——我们只讲技术,拒绝空

2018 AI开发者大会是中美AI技术专家共同打造的AI技术与产业年度盛会!这里有15+硅谷实力讲师,80+AI领军企业技术核心人物,100+技术大众实力媒体,1500+AI专业开发者——我们只谈技术,拒绝谈技术空!

参加2018 AI开发者大会,请点击↑↑↑↑ⅳ

文森特·米勒

译者|刘

整理|简

出品| AI技术大本营

【导读】TensorFlow.js的发布可以说是js社区开发者的福音!但是在浏览器中训练一些模型还是存在一些问题和差异。怎样才能让培训效果更好?本文作者是一名前端工程师,通过自己不断的经验积累,为大家总结了18个小技巧,希望能帮助你训练出更好的模型。

TensorFlow.js发布后,我将之前训练好的目标/人脸检测和人脸识别模型导入到TensorFlow.js中,我发现有些模型在浏览器中的效果相当不错。感觉TensorFlow.js让我们做了前端的工作。

虽然浏览器也可以运行深度学习模型,但这些模型毕竟不是为在浏览器中运行而设计的,所以很多限制和挑战随之而来。就目标检测而言,没有实时检测很难保持一定的帧率。更不用说几百兆的机型给用户的浏览器和带宽带来的压力。

但是,只要遵循一定的原则,用卷积神经网络CNN和TensorFlow.js在浏览器中训练一个像样的深度学习模型,并不是痴人说梦。从下图可以看出,我训练的这些模型大小都控制在2 MB以下,最小的只有3 KB。

大家心里可能会有一个疑问:你傻吗?是否要使用浏览器来训练模型?是的,利用自己的电脑、服务器、集群或者云来训练深度学习模型肯定是正确的方法,但是并不是每个人都有钱用英伟达GTX 1080 Ti或者泰坦x,这个时候在浏览器中训练深度学习模型的优势就体现出来了。有了WebGL和TensorFLow.js,我也可以在自己的电脑上用AMD GPU轻松训练深度学习模型。

对于目标识别的问题,为了安全起见,通常建议你使用一些现成的架构比如YOLO、SSD、ResNet或者MobileNet,但是我个人认为如果完全照搬,在浏览器上的训练效果肯定不好。在浏览器上训练,要求模型小,速度快,越容易训练越好。下面我们从模型架构、训练、调试等方面来看看这三件事是怎么做的。

模型架构

▌1.控制模型大小

控制模型的大小非常重要。如果模型架构太大太复杂,训练和运行的速度会降低,从浏览器加载模型度数的速度也会变慢。控制模型的规模很容易,但是很难达到模型的精度和规模之间的平衡。如果精度达不到要求,模型再小也是浪费。

▌2.使用深度可分离卷积运算

与标准卷积运算不同的是,深度可分卷积首先对每个通道进行卷积运算,然后进行1X1跨通道卷积。这样做的好处是可以大大减少参数的数量,所以模型的运行速度会大大提高,资源消耗和训练速度也会提高。深度可分卷积运算的过程如下图所示:

MobileNet和Xception都使用深度可分卷积,在TensorFlow.js的MobileNet和PoseNet版本中也可以看到深度可分卷积虽然深度可分卷积对模型精度的影响还有争议,但从我个人的经验来看,在浏览器中训练模型肯定是对的。

第一个层面,我推荐使用标准的conv2d运算,保持特征提取后通道间的关系。因为第一层没有太多通用参数,所以对性能影响不大。

其他卷积层可以进行深度可分离的卷积。例如,这里我们使用两个过滤器。

tf.separableConv2d中使用的卷积核结构分别是[3,3,32,1]和[1,1,32,64]。

▌3.使用跳跃连接和密集块。

随着网络层数的增加,梯度消失的可能性也会增加。梯度的消失会导致损失函数下降太慢,训练时间太长或者训练完全失败。Net和DenseNet可以避免这个问题。简单来说,跳连接就是某些层的输出跳过激活函数,直接传递给网络深处的隐藏层作为输入,如下图所示:

这样就避免了激活函数和链导数引起的梯度消失问题,我们还可以根据需求增加网络的层数。

显然,跳转连接的一个隐含要求是输出和输入两层的格式必须兼容。如果要用残差网络,最好保证两层的滤波器个数和填充一致,步长为1。

一开始我模仿残网的思路,每隔一层加一个跳转连接。但是我发现密块效果更好,模型收敛速度比加跳连接快很多。

我们来看看具体的代码。这里的致密块具有四个深度可分离的卷积层。在第一层中,我将步长设置为2,以改变输入大小。

▌4.为激活功能选择ReLU

如果在浏览器中训练深网,则不需要直接选择ReLU来激活功能。主要原因是梯度消失。但是您可以尝试ReLU的不同变体,比如

和ReLU-6,6)用于MobileNet:

培训过程

▌5.优化器选择亚当。

这也是我的亲身经历。就说说吧。在使用SGD之前,经常卡在局部极小或者梯度爆炸。我建议您首先将学习率设置为0.001,然后对其他参数使用默认值:

▌6.动态调整学习速度

一般来说,当损失函数不再递减时,就应该停止训练,因为再训练是过拟合的。但是,如果我们发现损失函数上下波动,我们可能会通过降低学习率来使损失函数变小。

在下面的例子中,我们可以看到,学习率一开始设定为0.01,然后从第32期开始波动。这里,通过将学习率改变为0.001,损失函数减少了大约0.3。

7.权重初始化原则

我个人喜欢将偏移量设置为0,权重分布采用传统的正态分布。我通常使用Glorot正态分布的初始化方法:

▌8.打乱数据集。

这是老生常谈。TensorFlow.js可以通过tf.utils.shuffle实现

▌9.保存模型

Js可以通过FileSaver.js保存模型比如下面的代码可以保存模型的所有权重:

保存什么格式是你自己的决定,但是FileSaver.js只是保存,所以这里你要用JSON.strinfify把Blob转换成字符串:

接受初步测试

▌10.确保预处理和后处理的正确性。

虽然是废话,但是“垃圾数据垃圾结果”是一句至理名言。要正确标注,各层的输入输出要一致。尤其是你对图片做了一些前期处理和后期处理,就更要小心了。有时候这些小问题还是很难发现的。所以,虽然要费点力气,但是磨刀不误砍柴工。

▌11.定制损失函数

TensorFlow.js提供了很多现成的损耗函数供你使用,一般来说已经足够了,不建议你自己写。如果真的要自己写,请一定要先测试一下。

▌12.尝试适应数据子集。

我建议在定义好模型之后,选择十几张或者二十张图片,看看损失函数是否收敛。最好把结果可视化,这样就能清楚地看到这个模式是否有成功的潜力。

这样也能及早发现建模和预处理中的一些低级错误。其实这就是第11条提到的测试损失函数。

表演

13.内存泄漏

不知道你知不知道TensorFlow.js不会自动帮你垃圾回收。张量占用的内存必须通过手动调用tensor.dispose来释放。如果忘记回收,内存泄露是迟早的事。

很容易判断是否存在内存泄漏。我们每次迭代都输出tf.memory看看张量的个数。如果没有持续增加,说明没有渗漏。

▌14.调整画布大小,而不是张量大小

在调用TF之前。从像素,要将画布转换成张量,请调整画布大小,否则会很快耗尽GPU内存。

如果你的训练图像都是一样的大小,那就不是问题,但是如果你必须显式地调整它们的大小,你可以参考下面的代码。

▌15.仔细选择批量大小

每批的样本数,也就是批量大小显然取决于我们用的是什么GPU和网络结构,所以你最好尝试不同的批量大小,看看有多快。我一般从1开始,有时候发现增加批量对训练效率没有帮助。

▌16.善用索引b

我们的训练数据集有时相当大,因为都是图片。如果每次都下载,效率很低。最好使用IndexedDB来存储。IndexedDB实际上是嵌入在浏览器中的本地数据库,任何数据都可以以键值对的形式存储。读取和保存数据也可以通过几行代码来完成。

▌17.损失函数值的异步返回

要实时监控损失函数值,可以使用下面的代码自己计算,然后异步返回:

需要注意的是,如果你想在每一个训练期之后,把损失函数值保存在一个文件中,这个代码是有问题的。现在loss函数的值是异步返回的,所以我们要等最后一个承诺返回后才能保存。但是,我通常会在第一期结束后暴力等待10秒钟:

▌18.重量的量化

为了达到小而快的目标,在模型的训练完成后,要量化权重对模型进行压缩。权重的量化不仅可以减少模型的体积,还有助于提高模型的速度,而且几乎都是好的没有坏处。这一步使得模型小而快,非常适合我们在浏览器中训练深度学习模型。

浏览器中训练深度学习模型的十八招到此结束。希望你看完这篇文章能有所收获。

如有疑问,欢迎在后台给我们留言,大家一起探讨!

原文链接:https://it next . io/18-tips-for-training-your-own-tensor flow-js-models-in-the-browser-3e 40141 c 9091

[结束]

微信改版了,

要快速看到CSDN的热门文章,

赶紧把CSDN微信官方账号设为明星吧

打开微信官方账号,点击“设为明星”!

"

征稿。"

CSDN微信官方账号秉承“与千名技术人员共同成长”的理念,不仅以技术人员的独特视角,用“极客头条”和“畅所欲言”栏目第一时间描述技术人员关心的行业焦点事件,更有“技术头条”栏目深度解读行业热门技术和场景应用,让所有开发者紧跟技术趋势,保持对技术的警惕感,对行业趋势和技术有更全面的了解。

如果您有高质量的文章,对行业热点事件和技术趋势的见解,或对深度应用实践和场景的新见解,请联系CSDN投稿。联系方式:微信,邮箱。

 
友情链接
鄂ICP备19019357号-22