2017年10月1日星期日

那个曾经黑掉iPhone和PS3的少年,要把你的车破解成无人车

陈桦 问耕 发自LZYY量子位 出品 | 公众号 QbitAI

你知道霍兹(George Hotz)么?

今天是他28岁生日。十年前,霍兹耗时500多个小时,破解了乔布斯刚发布不久的第一代iPhone,最后换得一辆Nissan跑车和三部未破解的iPhone。从此以后,他顶着Geohot的代号名声大噪,被称为神奇小子、天才黑客。

此后几年,提到iPhone的越狱、破解就会想起Geohot和他的头像。

霍兹不是针对乔布斯。2009年,他开始破解索尼的游戏主机PlayStation 3。两年后,索尼发起控告,最终双方庭外和解。霍茨答应不再破解索尼的产品。然后霍兹先后加入了Facebook和Google。

现在,霍茨创办了一家研究自动驾驶和机器学习的公司,名叫:Comma.ai。在英语里,comma的意思是"逗号"。

另辟蹊径

在旧金山郊外的高速公路上,一辆本田车以时速约90公里行驶。

车内后视镜的下方有个长方形盒子,里面其实是一部智能手机,通过内置摄像头拍摄加州的高速公路,并将红色和绿色的线条投影在图像上。

司机的双手没有握住方向盘,因为这辆汽车正在自动驾驶。

不过,这辆汽车的自动驾驶技术与大部分公司都不相同。

这辆汽车的背后,就是开头提到的天才黑客、卡耐基梅隆大学辍学生霍兹,他正在将美国的公共道路变成自己的实验室。

作为Comma.ai创始人,霍兹正在带领这家旧金山湾区的创业公司开发类似于特斯拉和谷歌Waymo的自动驾驶汽车。不同的是,Comma.ai向用户提供技术,让他们自己动手去实现汽车的无人驾驶。

但这并不是他的本意。

一年前,霍兹正准备开始销售Comma One,一款售价999美元的无人驾驶产品。然而,美国高速公路交通安全委员会(NHTSA)发出一封邮件警告称,如果该公司将未经测试的无人驾驶汽车投放至道路,那么将按天处以罚款。

因此,霍兹不得不取消了这款产品的发售计划,并于去年11月免费提供这项技术。

该公司发布了开源的无人驾驶平台Openpilot。此外,他还公布了Neo的开源计划。这是一款基于智能手机的设备,可以连接至某些兼容的本田和讴歌车型,控制车辆的油门、刹车和方向盘,并使用Openpilot去导航。

霍兹一直以来讲话都很大胆,同时还喜欢恶作剧。

他说:"无人驾驶汽车只需要工程师,不需要汽车厂商、监管者,或其他这类人。他们最好远离工程师的工作。"

数据之争

已有73名司机正在使用Openpilot。

此外,有超过1000人正在使用Chffr。这是Comma.ai旗下一款仪表盘摄像头智能手机应用,能记录司机的情况,并发送至该公司位于旧金山一处3层楼房屋地下室的数据中心。霍兹的12人创业团队就在这里工作。

到目前为止,这两款工具总共收集了超过100万英里的驾驶数据,而这也是Comma.ai无人驾驶计划的核心。该公司的工程师使用这些数据去训练无人驾驶的人工智能行为模型。

其他开发无人驾驶技术的公司试图教会汽车去识别不同路况,并手动标记驾驶数据,例如超车道是什么样,禁行标志是什么样。

与此不同,Comma.ai依靠普通司机的模式和行为,训练Openpilot使用的模型。

关注无人驾驶技术的律师和咨询师Jim McPherson表示:"他将所有一切信息记录至计算机。如果东西是静止的,那么就是一棵树。如果是移动的,那么就是行人。他希望计算机能自行判断这些信息。"

霍兹表示,这是正确定义驾驶的唯一方法:观察司机如何驾驶,记录数据,使用这些数据来教会其他汽车。他把卡车比作跳舞,但舞伴是重达两吨的汽车。

Comma.ai的这种方法令不少人感到担忧。仅2016年一年,美国就有近4万人死于汽车交通事故。如果去让普通司机指导Openpilot如何驾驶,那么Openpilot是否会出现不安全的驾驶行为?

克莱姆森大学汽车工程系教授Venkat Krovi表示:"如果有人决定将这些技术放在他们的汽车上,但技术在公共道路上发生了问题,这就会令我感到害怕。如果一辆汽车遇到了此前没有发生过的情况,很难知道汽车会怎样反应。"

不过,霍兹强烈反对这样的观点。他表示,随着Comma.ai收集更多数据,系统会变得越来越智能。他目前正试图黑掉一辆丰田普锐斯,使其兼容Openpilot。

近期,Comma.ai开始销售一款88美元的设备Panda。这款设备可以连接至汽车的系统诊断接口,收集行驶数据,包括刹车力量、方向盘和速度等。他随后会使用这些数据,对尚不支持Openpilot的汽车进行反向工程。

Comma.ai目前仍在依赖来自知名风投a16z的310万美元种子轮投资。

霍兹表示:"我们正计划让项目更开放,我最终关心的是赢得市场。竞争对手们很快看到,我们将把他们的全部工作开源。"

参考报道:

http://ift.tt/2ipqvkQ

— 完 —

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 http://ift.tt/2g3fUIV
RSS Feed

RSS5

IFTTT

那个曾经黑掉iPhone和PS3的少年,要把你的车破解成无人车

陈桦 问耕 发自LZYY量子位 出品 | 公众号 QbitAI

你知道霍兹(George Hotz)么?

今天是他28岁生日。十年前,霍兹耗时500多个小时,破解了乔布斯刚发布不久的第一代iPhone,最后换得一辆Nissan跑车和三部未破解的iPhone。从此以后,他顶着Geohot的代号名声大噪,被称为神奇小子、天才黑客。

此后几年,提到iPhone的越狱、破解就会想起Geohot和他的头像。

霍兹不是针对乔布斯。2009年,他开始破解索尼的游戏主机PlayStation 3。两年后,索尼发起控告,最终双方庭外和解。霍茨答应不再破解索尼的产品。然后霍兹先后加入了Facebook和Google。

现在,霍茨创办了一家研究自动驾驶和机器学习的公司,名叫:Comma.ai。在英语里,comma的意思是"逗号"。

另辟蹊径

在旧金山郊外的高速公路上,一辆本田车以时速约90公里行驶。

车内后视镜的下方有个长方形盒子,里面其实是一部智能手机,通过内置摄像头拍摄加州的高速公路,并将红色和绿色的线条投影在图像上。

司机的双手没有握住方向盘,因为这辆汽车正在自动驾驶。

不过,这辆汽车的自动驾驶技术与大部分公司都不相同。

这辆汽车的背后,就是开头提到的天才黑客、卡耐基梅隆大学辍学生霍兹,他正在将美国的公共道路变成自己的实验室。

作为Comma.ai创始人,霍兹正在带领这家旧金山湾区的创业公司开发类似于特斯拉和谷歌Waymo的自动驾驶汽车。不同的是,Comma.ai向用户提供技术,让他们自己动手去实现汽车的无人驾驶。

但这并不是他的本意。

一年前,霍兹正准备开始销售Comma One,一款售价999美元的无人驾驶产品。然而,美国高速公路交通安全委员会(NHTSA)发出一封邮件警告称,如果该公司将未经测试的无人驾驶汽车投放至道路,那么将按天处以罚款。

因此,霍兹不得不取消了这款产品的发售计划,并于去年11月免费提供这项技术。

该公司发布了开源的无人驾驶平台Openpilot。此外,他还公布了Neo的开源计划。这是一款基于智能手机的设备,可以连接至某些兼容的本田和讴歌车型,控制车辆的油门、刹车和方向盘,并使用Openpilot去导航。

霍兹一直以来讲话都很大胆,同时还喜欢恶作剧。

他说:"无人驾驶汽车只需要工程师,不需要汽车厂商、监管者,或其他这类人。他们最好远离工程师的工作。"

数据之争

已有73名司机正在使用Openpilot。

此外,有超过1000人正在使用Chffr。这是Comma.ai旗下一款仪表盘摄像头智能手机应用,能记录司机的情况,并发送至该公司位于旧金山一处3层楼房屋地下室的数据中心。霍兹的12人创业团队就在这里工作。

到目前为止,这两款工具总共收集了超过100万英里的驾驶数据,而这也是Comma.ai无人驾驶计划的核心。该公司的工程师使用这些数据去训练无人驾驶的人工智能行为模型。

其他开发无人驾驶技术的公司试图教会汽车去识别不同路况,并手动标记驾驶数据,例如超车道是什么样,禁行标志是什么样。

与此不同,Comma.ai依靠普通司机的模式和行为,训练Openpilot使用的模型。

关注无人驾驶技术的律师和咨询师Jim McPherson表示:"他将所有一切信息记录至计算机。如果东西是静止的,那么就是一棵树。如果是移动的,那么就是行人。他希望计算机能自行判断这些信息。"

霍兹表示,这是正确定义驾驶的唯一方法:观察司机如何驾驶,记录数据,使用这些数据来教会其他汽车。他把卡车比作跳舞,但舞伴是重达两吨的汽车。

Comma.ai的这种方法令不少人感到担忧。仅2016年一年,美国就有近4万人死于汽车交通事故。如果去让普通司机指导Openpilot如何驾驶,那么Openpilot是否会出现不安全的驾驶行为?

克莱姆森大学汽车工程系教授Venkat Krovi表示:"如果有人决定将这些技术放在他们的汽车上,但技术在公共道路上发生了问题,这就会令我感到害怕。如果一辆汽车遇到了此前没有发生过的情况,很难知道汽车会怎样反应。"

不过,霍兹强烈反对这样的观点。他表示,随着Comma.ai收集更多数据,系统会变得越来越智能。他目前正试图黑掉一辆丰田普锐斯,使其兼容Openpilot。

近期,Comma.ai开始销售一款88美元的设备Panda。这款设备可以连接至汽车的系统诊断接口,收集行驶数据,包括刹车力量、方向盘和速度等。他随后会使用这些数据,对尚不支持Openpilot的汽车进行反向工程。

Comma.ai目前仍在依赖来自知名风投a16z的310万美元种子轮投资。

霍兹表示:"我们正计划让项目更开放,我最终关心的是赢得市场。竞争对手们很快看到,我们将把他们的全部工作开源。"

参考报道:

http://ift.tt/2ipqvkQ

— 完 —

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 http://ift.tt/2g3fUIV
RSS Feed

RSS5

IFTTT

新型池化层sort_pool2d实现更快更好敛:表现优于最大池化层(附代码实现)

近日,Sahil Singla 在 Medium 上发表了一篇题为《A new kind of pooling layer for faster and sharper convergence》的文章,提出一种可实现更快更好收敛的新型池化层 sort_pool2d,表现优于最大池化层,同时解决了最大池化层无法使用来自多层激活函数信息的问题,以及反向传播只会提升最大池化的激活函数的问题。作者还给出了该池化层的代码实现。作者表示,介绍此研究的论文将会提交至 arXiv 上。
  • sort_pool2d 代码:http://ift.tt/2fAlkdA
  • sort_pool2d 实现:http://ift.tt/2yfB0hM


现在的最大池化层(应用于当前几乎所有顶级的计算机视觉任务,甚至是一些 NLP 任务中)大约去掉了 75% 的激活函数。本文试图设计一种新型池化层 sort_pool2d,摆脱与之关联的一些问题。


问题如下:


  1. 空间信息损失:当去掉 75% 的激活函数时,关于其来源的信息就会丢失。
  2. 最大池化层无法使用来自多层激活函数的信息。
  3. 反向传播只会提升最大池化的激活函数,即使其他激活函数的值可能出现错误。

本文想要设计一种新型池化层,尽可能多地解决这些问题。在这一过程中,我想出了一个非常简单的技巧,可以解决问题 2 和 3。


想法与动机


按照渐增的顺序排列 4 个激活函数,而不是选择最大的那个。用 4 个权重 [w1,w2,w3,w4] 与之相乘,并添加 4 个值。


这一想法背后的动机也非常简单:


用这种方式,网络依然能够学习对应于 [w1,w2,w3,w4] = [1,0,0,0] 的良好的、旧的最大池化。

后面的层可以获取更多信息。因此,在非最大激活函数可用于降低损失函数时,网络只可学习使用其他值。


梯度流过上一层中的所有 4 个值(相比之下,最大池化层只有一个值)。


因此我希望基于上述原因,这一想法能够比最大池化层做的更好。这是一个非常少见的深度学习实验,其结果与我设想的简直一模一样。


具体定义


设池化之前的层的输出为张量 T,大小为 [B, H, W, C]。定义一个超参数 pool_range,它可以是 [1,2,3,4] 中的任意一个。pool_range 指定激活函数(按照排列顺序保存)的数量。假设要被池化的张量 T 有 4 个激活函数,我首先按照 [a1, a2, a3, a4] 的顺序排列它们,其中 a1 ≥ a2 ≥ a3 ≥ a4。接着保留其中的第一个 pool_range,我称之为激活向量。

我将 pool_range 的权重向量定义为 [w{1},.... w{pool_range}]。这里需要注意的是,如果这些权重中的任何一个是负值,则激活向量按强度排序且采用加权平均的假设将不成立。因此,我没有直接使用权重,而是在权重向量上取一个 softmax,并将结果乘以激活向量。为了证明添加 softmax 的重要性,我在 cluttered-mnist 数据集上进行了一个 toy experiment,当 pool_range=3 时看看有无 softmax 的区别。以下是测试数据集上的结果:



cluttered-mnist 数据集测试数据上的精确度(accuracy)对比与交叉熵对比


很明显,softmax 在这里是赢家。


我本来还可以对不同的通道使用不同的权重,但是为了便于与最大池化进行对比,我在不同通道上使用了 4 个相同的权重。


实现细节


我在 TnsorFlow 中写了该层的代码。TnsorFlow 的 top_k 层在 CPU 上非常快但是在 GPU 上非常慢。为了对这 4 个浮点数进行排序,我亲自写了程序。测试 sort_pool2d 的代码请参见 http://ift.tt/2fDoq0I http://ift.tt/2x8OTOQ


结果


我在不同的数据集和架构上尝试了这一想法,发现其性能全部优于基线最大池化。所有实验使用 pool_range 的 4 个值:1,2,3,4。pool_range=1 对应最大池化。


以下是我的实验结果:


cluttered-mnist


cluttered-mnist 和 fashion-mnist 上的 toy experiment



cluttered-mnist 数据集训练数据上的精确度与交叉熵对比



cluttered-mnist 数据集测试数据上的精确度与交叉熵对比



测试数据训练中的最佳精确度与交叉熵的值


网络获得的训练损失和精确度是相同的,但是 pool_range = 2,3,4 的验证精确度要远好于标准的最大池化。


fashion-mnist


fashion-mnis 数据集训练数据上的精确度与交叉熵对比



fashion-mnis 数据集测试数据上的精确度与交叉熵对比



训练过程中,测试数据上的最优精确度和交叉熵的值


pool_range>1 时,结果要好得多。


当前最佳模型上的实验


resnet 上的 cifar-100



cifar-10 数据集训练数据上的精确度与交叉熵对比



cifar-10 数据集测试数据上的精确度与交叉熵对比



训练过程中,测试数据上的最优精确度与交叉熵的值


pool_range>1 时,结果更好。


resnet 上的 cifar-100



在 cifar-100 数据集训练数据上的精确度与交叉熵对比



在 cifar-100 数据集测试数据上的精确度与交叉熵对比



训练过程中,在测试数据上的最优精确度与交叉熵的值


pool_range>1 时,结果更好。这里的结果优于 cifar-10 的结果,因为 cifar-10 拥有的每个类别的数据较少。这表明这个想法对解决每个类别数据较少的问题效果很好。


匹配网络中的 omniglot


我尝试使用论文《Matching Networks for one shot learning》提出的架构在 omniglot 数据集上对比 20 种方式的一次分类结果。



omniglot 数据集训练数据上的精确度与损失对比



omniglot 数据集验证数据上的精确度与损失对比



训练过程中,在验证数据上最优精确度与损失的值


注意:该实现使用该论文提出的已正则化的当前最佳的实现。因此,这些改进超过很多现有技巧。


论文《学习记忆罕见事件》(Learning to Remember Rare Events)中的 omniglot


我尝试使用《学习记忆罕见事件》论文中提出的架构在 omniglot 数据集上对比 5 种方式的一次分类结果。



omniglot 数据集验证数据上的损失对比



一次和二次分别在 omniglot 数据集验证数据上的精确度对比


pool_range=2、pool_range=4 时的收敛比使用基线最大池化要快得多。


这次加速再次超越该论文当前最佳的实现结果。因此这些改进超过很多现有技巧。


重现结果的代码和命令行参数

  • 所有实验可以从该 repo 中重现(地址:http://ift.tt/2x8XrFd
  • 重现 cluttered-mnist 和 fashion-mnist 数据集上结果的命令行参数地址:http://ift.tt/2fDouO0
  • 重现使用 resnet 架构在 cifar10 和 cifar100 上的结果的命令行参数地址:http://ift.tt/2fDouO0
  • 重现使用《Matching Networks for one shot learning》提出的架构在 omniglot 上的结果的命令行参数地址:http://ift.tt/2x8OYlC
  • 重现使用《学习记忆罕见事件》提出的架构在 omniglot 上的结果的命令行参数地址:http://ift.tt/2fE7Ayq


结论


这一池化层(我将其称之为 sort_pool2d)在所有数据集和架构中的表现大大优于 max_pool2d。而计算时间的优势也很大。通过编写高度优化的 C 语言代码和 CUDA 代码,我们还可以进一步优化每次迭代的时间。


虽然这一方式并不能解决空间信息丢失的问题。但是它为解决这个问题提出了一个很有意义的方向。



]]> 原文: http://ift.tt/2x8befe
RSS Feed

机器知心

IFTTT

从零开始:深度学习软件环境安装指南

在搭建深度学习机器之后,我们下一步要做的就是构建完整的开发环境了。本文将向你解释如何在一台新装的 Ubuntu 机器上安装 Python 和 Nvidia 硬件驱动、各类库和软件包。


为了进行强化学习研究,我最近购置了一台基于 Ubuntu 和英伟达 GPU 的深度学习机器。尽管目前在网络中能找到一些环境部署指南,但目前仍然没有全面的安装说明。另外,我也不得不阅读了很多文档来试图理解安装细节——其中的一些并不完整,甚至包含语法错误。因此,本文试图解决这个问题,提供一个详尽的软件环境安装指南。


本文将指导你安装


  • 操作系统(Ubuntu)
  • 4 种驱动和库(GPU 驱动、CUDA、cuDNN 和 pip)
  • 5 种 Python 深度学习库(TensorFlow、Theano、CNTK、Keras 和 PyTorch)


这些软件之间的互相依赖关系如下图所示。其中,你只需要安装一种深度学习库,请自由选择。



深度学习软件安装和依赖示意图


以下是各个软件的细节介绍:


  1. Ubuntu(v16.04.3)——操作系统,各种任务处理。
  2. Nvidia GPU 驱动(v375)——允许系统获得 GPU 带来的加速。
  3. CUDA(v8.0)——GPU C 语言库。「计算同一设备架构」。
  4. cuDNN(v6.0.21)——基于 CUDA 的深度学习基元库。「CUDA 深度学习库」。
  5. pip(v9.0.1)——Python 安装包。「Pip 安装包」。
  6. TensorFlow(v1.3)——谷歌开发的深度学习框架。
  7. Theano(v0.9.0)——此前由 MILA 负责维护的深度学习框架。
  8. CNTK(v2.2)——微软研究院开发的深度学习框架。
  9. Keras(v2.0.8)——深度学习包装可互换后端。可与 TensorFlow、Theano 和 CNTK 共同使用。
  10. PyTorch(v0.2.0)——可被 GPU 加速的动态图深度学习框架,主要由 Facebook 的研究人员负责开发。


1. 安装 Ubuntu 16.04.3


v 16.04.3 可由 USB 启动的方式安装,它是最新的 LTS(长期支持)版本。首次在电脑上启用时,请在 BIOS 中选择由 USB 引导启动。


我的电脑中有两块硬盘——一块 1TB 的 SATA 和一块 256GB 的 SSD。在我的设想中,Ubuntu 被安装在常规硬盘中,固态硬盘(SSD)用于处理数据集和加速训练。在安装过程中,在屏幕中的 Installation Type 中选择 Something else,随后我们要进行三个分区操作:


  • 引导分区(128GB):包含系统文件、程序设置和文档。
  • 交换分区(2 倍的内存大小):对于我来说这就是 128GB。这块分区的容量用于扩展 Kernel RAM 作为虚拟内存使用。
  • 用户分区(剩下的部分):1TB 的硬盘剩下的空间大约还有 744GB。


在安装后,最好先运行以下命令来升级内核版本。


  1. sudo apt-get update

  2. sudo apt-get upgrade


Reference:http://ift.tt/2u6MwJf


2. 安装英伟达 GPU 驱动


在安装完 Ubuntu 后,你可能会发现屏幕的分辨率不对,而且不能修改,这是因为现在还没有安装 GPU 驱动。


安装驱动有两种方法:从 Ubuntu 资源库和数据源。第一个方法更加容易,但需要频繁的重新安装。使用 sudo apt-get update 和 sudo apt-get upgrade 指令后,系统的内核可以自动升级。但这样并不会更新英伟达驱动,可能会导致 GUI 无法正确加载。从数据源安装可以避免这个问题。


从安装包里安装 v375 驱动(简单的方法)


以下命令会将与你系统相兼容的驱动版本显示出来,它会提供两个版本号:最新的不稳定版和长期稳定版。版本号会从头列起,所以你需要把页面滚到最上面。


  1. sudo add-apt-repository ppa:graphics-drivers/ppa


添加并安装资源库。通过第二个命令,改变你想要安装的。我们在这里推荐安装最新的长期稳定版本——375 版。


  1. sudo apt-get update

  2. sudo apt-get install nvidia-


重启计算机以重新配置视频输出。


  1. sudo shutdown -r now


要测试驱动程序是否工作,Screen Display(SUPERKEY,屏幕显示类型)现在应该可以识别你使用的显示器了,你可以修改设置、分辨率与方向。


Reference:http://ift.tt/1DNcS3o


从英伟达网站安装 v384.90(较难的方法)


从英伟达网站下载最新的驱动程序版本。基于硬件配置,我选择的选项是:


GeForce -> GeForce 10 Series -> GeForce GTX 1080 -> Linux 64 bit -> English (UK)


可选条件:编译到 32 位架构和 GUI 的开发版本。


  1. sudo apt-get install gcc-multilib xorg-dev


按 CTRL + ALT + F1 键登录,从 GUI 转至终端。为了重建视频输出,必须先将其暂停。


  1. sudo service lightdm stop


如果命令行没有效果,Ubuntu 新版本使用 systemctl 替换 lightdm。然后使 runfile 可执行,并运行它。


  1. cd

  2. chmod +x NVIDIA-Linux-x86_64-384.90.run

  3. sudo ./NVIDIA-Linux-x86_64-384.90.run --dkms


运行时,你可能会收到一条 pre-install script failed 信息。这没什么影响,因为预安装脚本包含命令 exit 1,其目标是确保你真的想安装驱动程序。


选项--dkms(默认开启)在 kernel 自行更新时将驱动程序安装至模块中,从而阻止驱动程序重新安装。在 kernel 更新期间,dkms 触发驱动程序重编译至新的 kernel 模块堆栈。


如果安装失败,则原因在于计算机的 BIOS 未关闭 Secure Boot。重启电脑,在 BIOS 选项中关闭 Secure Boot。


如果安装成功,则可以重启 GUI。


  1. sudo service lightdm start


卸载:sudo ./NVIDIA-Linux-x86_64-384.90.run --uninstall


验证


确保以下命令能够识别正确的 GPU 版本


  1. nvidia-smi


确保驱动程序版本号与你安装的一致


  1. cat /proc/driver/nvidia/version


3. 安装 CUDA 8.0


从英伟达网站,使用下列系统属性下载 CUDA 的 runfile(地址:http://ift.tt/2xRnqjr


Linux -> x86_64 -> Ubuntu -> 16.04 -> .deb(network)


导航至.deb 文件的位置后,将该文件解压缩,更新软件包列表,使用下列命令安装 CUDA。


  1. sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb

  2. sudo apt-get update

  3. sudo apt-get install cuda


将库添加至 bash path,这样就可以使用其他应用找到库了。


  1. echo 'export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}' >> ~/.bashrc

  2. echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc

  3. source ~/.bashrc


验证时,使用 nvcc -V 确保 Nvidia C Compiler(nvcc)版本与 CUDA 的版本匹配。


重启电脑 sudo shutdown -r now,完成安装。


可选操作:测试 CUDA 安装


测试安装的一个方法是运行一些示例。以下命令行创建了一个存储示例程序的 test_CUDA 目录。


  1. mkdir test_CUDA

  2. cd test_CUDA

  3. ./cuda-install-samples-8.0.sh .

子目录 NVIDIA_CUDA-8.0_Samples/3_Imaging/cudaDecodeGL 中是 findgllib.mk 文件。该文件的第 61 行 30 列包含了英伟达驱动程序的硬编码值,该值应从 367 更改成你安装的驱动程序版本号。


编译示例


  1. cd ../.. && make

你现在可以在 NVIDIA_CUDA-8.0_Samples 内随意运行示例。你可以在 NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release 中找到两个非常有用的脚本:./deviceQuery 可以在使用过程中打印 GPU,./bandwidthTest 可以打印它的带宽。


Reference:http://ift.tt/2qGIMgl


4. 安装 cuDNN 6.0.21


在英伟达网站上注册开发者项目,同意条款。从下拉菜单中选择 cuDNN v6.0.21 (April 27, 2017), for CUDA 8.0,并下载:


  1. cuDNN v6.0 Runtime Library for Ubuntu16.04 (Deb)
  2. cuDNN v6.0 Developer Library for Ubuntu16.04 (Deb)
  3. cuDNN v6.0 Code Samples and User Guide for Ubuntu16.04 (Deb)


.deb 优先于.tar,因为.deb 格式更适用于 Ubuntu,可以进行更纯净的安装。使用下列命令安装这三个包:


  1. sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb

  2. sudo dpkg -i libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb

  3. sudo dpkg -i libcudnn6-doc_6.0.21-1+cuda8.0_amd64.deb


测试 cuDNN


将已安装的示例复制到可读目录,然后编译并运行 mnistCNN。


  1. cp -r /usr/src/cudnn_samples_v6/ $HOME

  2. cd $HOME/cudnn_samples_v6/mnistCUDNN

  3. make clean && make

  4. ./mnistCUDNN


如果一切顺利,脚本应该会返回一条 Test passed! 消息。


卸载 cudnn


使用以下命令卸载三个库。另外,如果你已经创建了样本,那么再加上 rm -r ~/cudnn_samples_v6。


  1. sudo apt-get remove libcudnn6

  2. sudo apt-get remove libcudnn6-dev

  3. sudo apt-get remove libcudnn6-doc

Reference:cuDNN Installation Guide cuDNN Installation Guide(http://ift.tt/2xQAfdA


5. 安装 pip 9.0.1


Pip 的升级非常频繁,几乎每两周一次,建议使用最新版本的 pip。


请使用以下命令安装和升级最新版本的 pip。


  1. sudo apt-get install python-pip python-dev

  2. sudo pip install --upgrade pip


验证:请确保键入 pip -V 后可以打印出版本号。


6. 安装 Tensorflow 1.3.0


  1. pip install tensorflow-gpu


验证:启动$ python,确认是否以下脚本能够打印出 Hello, Tensorflow!


  1. import tensorflow as tf

  2. hello = tf.constant('Hello, TensorFlow!')

  3. sess = tf.Session()

  4. print(sess.run(hello))


Reference:http://ift.tt/2lpZTQj


7. 安装 Theano 0.10


Theano 需要的系统环境:


  1. sudo apt-get install libopenblas-dev cmake git


此外还要遵循 Python 的系统需求。


  1. sudo pip install numpy scipy nose sphinx pydot-ng pycuda scikit-cuda cython


libgpuarray 可以让 Theano 使用 GPU,它必须从源编译。首先下载源代码


  1. git clone http://ift.tt/2wV5c1x

  2. cd libgpuarray


将其编译为一个名为 Build 的文件夹。


  1. mkdir Build

  2. cd Build

  3. cmake .. -DCMAKE_BUILD_TYPE=Release

  4. make

  5. sudo make install


随后将其编译成一个 Python 包。


  1. cd ..

  2. python setup.py build

  3. sudo python setup.py install


将下面一行添加至 ~/.bashrc,这样 Python 就可以找到库了。


  1. export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH


最后,安装 Theano


  1. sudo pip install git+http://ift.tt/2yGzQJi


验证:创建测试文件 test_theano.py,其中的内容复制自:http://ift.tt/2xRiURY

随后看看 THEANO_FLAGS=device=cuda0 python test_theano.py 在使用了 GPU 之后是否成功。

Reference: Theano 0.9.0 documentation(http://ift.tt/2fJjuuX


8. 安装 CNTK 2.2


  1. sudo pip install http://ift.tt/2wV5d5B

验证:输入 python -c "import cntk; print(cntk.__version__)",输出 2.2。

Reference: Setup CNTK on your machine(http://ift.tt/2fJSn2O


9. 安装 Keras 2.0.8


  1. sudo pip install keras

验证:检查$ python 中的 import keras 是否成功。

Reference: Keras Installation(http://ift.tt/2yjgTiM


10. 安装 PyTorch 0.2.0


PyTorch 运行在两个库上: torchvision 和 torch,我们需要这样安装:

  1. sudo pip install http://ift.tt/2fJjvz1

  2. 0.2.0.post3-cp27-cp27mu-manylinux1_x86_64.whl

  3. sudo pip install torchvision

验证:以下脚本能够打印出一个带有随机初始浮点数的张量。

  1. from __future__ import print_function

  2. import torch

  3. x = torch.Tensor(5, 3)

  4. print(x)

Reference: http://pytorch.org/


结论


目前为止,整个过程中最难的部分是找出 Nvidia 驱动和深度学习包之间的依赖关系,以及最有效的长期安装过程。而最简单的部分是安装 Python,安装包和文档都得到了良好的维护。

虽然阅读文档和源代码都非常耗费时间,但了解每个软件包的构建和功能是非常具有启发性的,它也可以帮助我们理解整个 Ubuntu 生态系统。


希望本文对你有所帮助。 

]]> 原文: http://ift.tt/2yhCGYb
RSS Feed

机器知心

IFTTT

如何判断LSTM模型中的过拟合和欠拟合

判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事。也许你会得到一个不错的模型技术得分,但了解模型是较好的拟合,还是欠拟合/过拟合,以及模型在不同的配置条件下能否实现更好的性能是非常重要的。


在本教程中,你将发现如何诊断 LSTM 模型在序列预测问题上的拟合度。完成教程之后,你将了解:

  • 如何收集 LSTM 模型的训练历史并为其画图。
  • 如何判别一个欠拟合、较好拟合和过拟合的模型。
  • 如何通过平均多次模型运行来开发更鲁棒的诊断方法。


让我们开始吧。


教程概览


本教程可分为以下 6 个部分,分别是:

1. Keras 中的训练历史

2. 诊断图

3. 欠拟合实例

4. 良好拟合实例

5. 过拟合实例

6. 多次运行实例


1. Keras 中的训练历史


你可以通过回顾模型的性能随时间的变化来更多地了解模型行为。


LSTM 模型通过调用 fit() 函数进行训练。这个函数会返回一个叫作 history 的变量,该变量包含损失函数的轨迹,以及在模型编译过程中被标记出来的任何一个度量指标。这些得分会在每一个 epoch 的最后被记录下来。


  1. ...

  2. history = model.fit(...)


例如,如果你的模型被编译用来优化 log loss(binary_crossentropy),并且要在每一个 epoch 中衡量准确率,那么,log loss 和准确率将会在每一个训练 epoch 的历史记录中被计算出,并记录下来。


每一个得分都可以通过由调用 fit() 得到的历史记录中的一个 key 进行访问。默认情况下,拟合模型时优化过的损失函数为「loss」,准确率为「acc」。


  1. ...

  2. model.com pile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

  3. history = model.fit(X, Y, epochs=100)

  4. print(history.history['loss'])

  5. print(history.history['acc'])


Keras 还允许在拟合模型时指定独立的验证数据集,该数据集也可以使用同样的损失函数和度量指标进行评估。


该功能可以通过在 fit() 中设置 validation_split 参数来启用,以将训练数据分割出一部分作为验证数据集。


  1. ...

  2. history = model.fit(X, Y, epochs=100, validation_split=0.33)


该功能也可以通过设置 validation_data 参数,并向其传递 X 和 Y 数据集元组来执行。


  1. ...

  2. history = model.fit(X, Y, epochs=100, validation_data=(valX, valY))


在验证数据集上计算得到的度量指标会使用相同的命名,只是会附加一个「val_」前缀。


  1. ...

  2. model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

  3. history = model.fit(X, Y, epochs=100, validation_split=0.33)

  4. print(history.history['loss'])

  5. print(history.history['acc'])

  6. print(history.history['val_loss'])

  7. print(history.history['val_acc'])


2. 诊断图


LSTM 模型的训练历史可用于诊断模型行为。你可以使用 Matplotlib 库来进行性能的可视化,你可以将训练损失和测试损失都画出来以作比较,如下所示:


  1. from matplotlib import pyplot

  2. ...

  3. history = model.fit(X, Y, epochs=100, validation_data=(valX, valY))

  4. pyplot.plot(history.history['loss'])

  5. pyplot.plot(history.history['val_loss'])

  6. pyplot.title('model train vs validation loss')

  7. pyplot.ylabel('loss')

  8. pyplot.xlabel('epoch')

  9. pyplot.legend(['train', 'validation'], loc='upper right')

  10. pyplot.show()


创建并检查这些图有助于启发你找到新的有可能优化模型性能的配置。


接下来,我们来看一些例子。我们将从损失最小化的角度考虑在训练集和验证集上的建模技巧。


3. 欠拟合实例


欠拟合模型就是在训练集上表现良好而在测试集上性能较差的模型。


这个可以通过以下情况来诊断:训练的损失曲线低于验证的损失曲线,并且验证集中的损失函数表现出了有可能被优化的趋势。


下面是一个人为设计的小的欠拟合 LSTM 模型。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((len(X), 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(10, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mse', optimizer='adam')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=100, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'])

  32. pyplot.plot(history.history['val_loss'])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例会产生一个训练损失和验证损失图,该图显示欠拟合模型特点。在这个案例中,模型性能可能随着训练 epoch 的增加而有所改善。



欠拟合模型的诊断图


另外,如果模型在训练集上的性能比验证集上的性能好,并且模型性能曲线已经平稳了,那么这个模型也可能欠拟合。下面就是一个缺乏足够的记忆单元的欠拟合模型的例子。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((5, 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(1, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mae', optimizer='sgd')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=300, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'])

  32. pyplot.plot(history.history['val_loss'])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例会展示出一个存储不足的欠拟合模型的特点。


在这个案例中,模型的性能也许会随着模型的容量增加而得到改善,例如隐藏层中记忆单元的数目或者隐藏层的数目增加。



欠拟合模型的状态诊断线图


4. 良好拟合实例


良好拟合的模型就是模型的性能在训练集和验证集上都比较好。


这可以通过训练损失和验证损失都下降并且稳定在同一个点进行诊断。


下面的小例子描述的就是一个良好拟合的 LSTM 模型。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((5, 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(10, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mse', optimizer='adam')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=800, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'])

  32. pyplot.plot(history.history['val_loss'])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例可以创建一个线图,图中训练损失和验证损失出现重合。


理想情况下,我们都希望模型尽可能是这样,尽管面对大量数据的挑战,这似乎不太可能。



良好拟合模型的诊断线图


5. 过拟合实例


过拟合模型即在训练集上性能良好且在某一点后持续增长,而在验证集上的性能到达某一点然后开始下降的模型。


这可以通过线图来诊断,图中训练损失持续下降,验证损失下降到拐点开始上升。


下面这个实例就是一个过拟合 LSTM 模型。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. # return training data

  7. def get_train():

  8. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  9. seq = array(seq)

  10. X, y = seq[:, 0], seq[:, 1]

  11. X = X.reshape((5, 1, 1))

  12. return X, y

  13. # return validation data

  14. def get_val():

  15. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  16. seq = array(seq)

  17. X, y = seq[:, 0], seq[:, 1]

  18. X = X.reshape((len(X), 1, 1))

  19. return X, y

  20. # define model

  21. model = Sequential()

  22. model.add(LSTM(10, input_shape=(1,1)))

  23. model.add(Dense(1, activation='linear'))

  24. # compile model

  25. model.compile(loss='mse', optimizer='adam')

  26. # fit model

  27. X,y = get_train()

  28. valX, valY = get_val()

  29. history = model.fit(X, y, epochs=1200, validation_data=(valX, valY), shuffle=False)

  30. # plot train and validation loss

  31. pyplot.plot(history.history['loss'][500:])

  32. pyplot.plot(history.history['val_loss'][500:])

  33. pyplot.title('model train vs validation loss')

  34. pyplot.ylabel('loss')

  35. pyplot.xlabel('epoch')

  36. pyplot.legend(['train', 'validation'], loc='upper right')

  37. pyplot.show()


运行这个实例会创建一个展示过拟合模型在验证集中出现拐点的曲线图。


这也许是进行太多训练 epoch 的信号。


在这个案例中,模型会在拐点处停止训练。另外,训练样本的数目可能会增加。



过拟合模型的诊断线图


6. 多次运行实例


LSTM 是随机的,这意味着每次运行时都会得到一个不同的诊断图。


多次重复诊断运行很有用(如 5、10、30)。每次运行的训练轨迹和验证轨迹都可以被绘制出来,以更鲁棒的方式记录模型随着时间的行为轨迹。


以下实例多次运行同样的实验,然后绘制每次运行的训练损失和验证损失轨迹。


  1. from keras.models import Sequential

  2. from keras.layers import Dense

  3. from keras.layers import LSTM

  4. from matplotlib import pyplot

  5. from numpy import array

  6. from pandas import DataFrame

  7. # return training data

  8. def get_train():

  9. seq = [[0.0, 0.1], [0.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]

  10. seq = array(seq)

  11. X, y = seq[:, 0], seq[:, 1]

  12. X = X.reshape((5, 1, 1))

  13. return X, y

  14. # return validation data

  15. def get_val():

  16. seq = [[0.5, 0.6], [0.6, 0.7], [0.7, 0.8], [0.8, 0.9], [0.9, 1.0]]

  17. seq = array(seq)

  18. X, y = seq[:, 0], seq[:, 1]

  19. X = X.reshape((len(X), 1, 1))

  20. return X, y

  21. # collect data across multiple repeats

  22. train = DataFrame()

  23. val = DataFrame()

  24. for i in range(5):

  25. # define model

  26. model = Sequential()

  27. model.add(LSTM(10, input_shape=(1,1)))

  28. model.add(Dense(1, activation='linear'))

  29. # compile model

  30. model.compile(loss='mse', optimizer='adam')

  31. X,y = get_train()

  32. valX, valY = get_val()

  33. # fit model

  34. history = model.fit(X, y, epochs=300, validation_data=(valX, valY), shuffle=False)

  35. # story history

  36. train[str(i)] = history.history['loss']

  37. val[str(i)] = history.history['val_loss']

  38. # plot train and validation loss across multiple runs

  39. pyplot.plot(train, color='blue', label='train')

  40. pyplot.plot(val, color='orange', label='validation')

  41. pyplot.title('model train vs validation loss')

  42. pyplot.ylabel('loss')

  43. pyplot.xlabel('epoch')

  44. pyplot.show()


从下图中,我们可以在 5 次运行中看到欠拟合模型的通常趋势,该案例强有力地证明增加训练 epoch 次数的有效性。



模型多次运行的诊断线图


扩展阅读


如果你想更深入地了解这方面的内容,这一部分提供了更丰富的资源。

  • Keras 的历史回调 API(History Callback Keras API,http://ift.tt/2xMgZfE
  • 维基百科中关于机器学习的学习曲线(Learning Curve in Machine Learning on Wikipedia,http://ift.tt/2yiSKcg
  • 维基百科上关于过拟合的描述(Overfitting on Wikipedia,http://ift.tt/2xLVaNt


总结


在本教程中,你学习到如何在序列预测问题上诊断 LSTM 模型是否拟合。


具体而言,你学到了:


  • 如何收集 LSTM 模型的训练历史并为其画图。
  • 如何判别一个欠拟合、良好拟合和过拟合的模型。
  • 如何通过平均多次模型运行来开发更鲁棒的诊断方法。
]]> 原文: http://ift.tt/2yiCSGz
RSS Feed

机器知心

IFTTT

LangChain 彻底重写:从开源副业到独角兽,一次“核心迁移”干到 12.5 亿估值 -InfoQ 每周精要No.899期

「每周精要」 NO. 899 2025/10/25 头条 HEADLINE LangChain 彻底重写:从开源副业到独角兽,一次"核心迁移"干到 12.5 亿估值 精选 SELECTED 1000 行代码手搓 OpenAI gpt-oss 推理引...