原标题:如何极大效率地提高你训练模型的速度?

How to Train Your Model (Dramatically Faster)

翻译 | 老赵 校对 | Peter_Dong 整理 | 菠萝妹

https://medium.com/@williampnowak/how-to-train-your-model-dramatically-faster-9ad063f0f718

以Python为例,教你如何使用迁移学习

我现在在Unbox Research工作,由 Tyler Neylon创办的新的机器学习研究单位,岗位是机器学习工程师。我刚刚为一名客户完成了一个服装图片分类的iOS 应用程序开发的项目——在类似这样的项目里,迁移学习是一种非常有用的工具

为了有效地部分重训练神经网络,迁移学习是一种很好的方法。为了达到这个目的,我们重新使用了之前已经构建起的模型架构以及大部分已经学习到的权重,使用标准的训练方法去学习剩下的还未重新使用的参数。

迁移学习 对比 非迁移学习

图1:标准神经网络模型的架构,绿色代表着所有权证和偏置的训练。

完全训练的神经网络在初始层中获取输入值,然后顺序地向前馈送该信息(同时转换它),直到关键地,一些倒数第二层构建了输入的高级表示,可以更容易地 转化为最终输出。 模型的全面训练涉及每个连接中使用的权值和偏差项的优化,标记为绿色。

倒数第二层被称为瓶颈层。 瓶颈层将回归模型中的值或分类模型中的softmax概率推送到我们的最终网络层。

图2:转移学习神经网络模型的模型架构,红色表示固定的权重和偏差,绿色表示仅训练最终层的权重和偏差。

在转学习中,我们从整个网络的预训练权重开始。 然后我们将权重固定到最后一层,并在我们训练新数据时让该层中的权重发生变化。 如图所示,我们保持红色连接固定,现在只重新训练最后一层绿色连接。

转移效率

转移学习的两个主要好处:

1. 对新数据的培训比从头开始更快。

2. 如果我们从头开始,我们通常可以用比我们需要的更少的训练数据来解决问题。

图3:InceptionV3模型的高级概述,我们用它来演示迁移学习示例。 图像的奇特流程图性质与Inception是一个卷积神经网络有关。

在这里,我们确切地考虑为什么迁移学习如此有效

通过仅重新训练我们的最后一层,我们正在执行计算成本极低的优化(学习数百或数千个参数,而不是数百万)。

这与像Inception v3这样的开源模型形成对比,后者包含2500万个参数,并使用一流的硬件进行训练。 因此,这些网络具有良好拟合的参数和瓶颈层,具有高度优化的输入数据表示。 虽然你可能会发现很难用自己有限的计算和数据资源从头开始训练高性能模型,但你可以使用迁移学习来利用其他人的工作并强制增加你的性能。

示例代码

让我们看看一些Python代码,以获得更多的思考(但不要太远 - 不想迷失在那里)。

首先,我们需要从预训练模型开始。 Keras有一堆预训练模型; 我们将使用InceptionV3模型。

# Keras and TensorFlow must be (pip) installed.

fromkeras.applications importInceptionV3

fromkeras.models importModel

InceptionV3已经在ImageNet数据上进行了训练,该数据包含1000个不同的对象,其中很多我发现它们非常古怪。 例如,924类是“鳄梨”。

图4:mmm ......

实际上,预训练的InceptionV3就是这样认可的。preds = InceptionV3().predict(guacamole_img) 返回一个1000维数组guacamole_img(其中是一个224x224x3维度的np数组)。

preds.max() 返回0.99999preds.argmax(-1)而返回索引924 - Inception模型确实这个鳄梨酱就是那个! guacamole_img(例如,我们预测Imagenet图像#924的置信度为99.999%。这是一个可重现代码的链接。

现在我们知道InceptionV3至少可以确认我正在吃什么,让我们看看我们是否可以使用基础数据表示重新训练并学习新的分类方案。

如上所述,我们希望冻结模型的前n-1层,然后重新训练最后一层。

下面,我们加载预训练模型; 然后,我们使用TensorFlow方法 .get_layer()从原始模型中获取输入和倒数第二个(瓶颈)图层名称,并使用这两个层作为输入和输出构建新模型。

original_model= InceptionV3()

bottleneck_input= original_model.get_layer(index=0).input

bottleneck_output= original_model.get_layer(index=-2).output

bottleneck_model= Model(inputs=bottleneck_input, outputs=bottleneck_output)

在这里,我们从Inception模型的第一层(index = 0)获取输入。 要是我们 print(model.get_layer(index=0).input) ,我们看到Tensor("input_1:0", shape=(?,?,?,3), dtype=float32) 这表明我们的模型期望一些不确定数量的图像作为输入,具有未指定的高度和宽度,具有3个RBG通道。 这也是我们想要作为瓶颈层输入的东西。

我们将瓶颈的输出Tensor("avg_pool/Mean:0",shape=(?, 2048), dtype=float32)看作是我们通过引用倒数第二个模型层访问的瓶颈。 在这种情况下,初始模型已经学习了任何图像输入的2048维表示,其中我们可以将这些2048维度视为表示对分类必不可少的图像的关键组件。

最后,我们使用原始图像输入和瓶颈层作为输出实例化一个新模型:Model(inputs=bottleneck_input, outputs=bottleneck_output).

接下来,我们需要将预训练模型中的每一层设置为无法训练 - 基本上我们正在冻结这些层的权重和偏差,并保留已经通过Inception原始的,费力的训练学到的信息。

forlayer inbottleneck_model.layers:

layer.trainable = False

现在,我们制作一个Sequential() 新模型,从我们之前的构建块开始,然后进行一些小的添加。

new_model = Sequential()

new_model.add(bottleneck_model)

new_model.add(Dense(2, activation=‘softmax’, input_dim=2048))

上面的代码用于构建一个复合模型,该模型将我们的Inception架构与具有2个节点的最终层相结合。 我们使用2因为我们将重新训练一个新的模型来学习区分猫和狗 - 所以我们只有2个图像类。 将此替换为你希望分类的许多类。

如前所述,瓶颈输出的大小为2048,所以这是我们的input_dim Dense密集层, 最后,我们插入softmax激活,以确保我们的图像类输出可以解释为概率。

我在本文的最后部分包含了一个非常高的网络布局图像 - 请务必查看它。

要完成,我们只需要一些标准的TensorFlow步骤:

# For a binary classification problem

new_model.compile(optimizer='rmsprop',

loss='binary_crossentropy',

metrics=['accuracy'])

one_hot_labels = keras.utils.to_categorical(labels, num_classes=2)

new_model.fit(processed_imgs_array,

one_hot_labels,

epochs=2,

batch_size=32)

这里processed_ims_array是一个数组(number_images_in_training_set,224,224,3)和label一个基础真实图像类的Python列表。 这些是与训练数据中的图像类对应的标量。num_classes=2 所以标签label只是number_of_images_in_training_set一个包含0和1的长度列表。

最后,当我们在第一个猫训练图像上运行此模型时(使用Tensorflow非常方便的内置双线性重新缩放功能):

图6:一只可爱的猫......对你有好处!

该模型预测猫有94%的置信度。 这非常好,考虑到我只使用了20个训练图像,并且只训练了2个周期。

总结

通过利用预先构建的模型体系结构和预先学习的权重,迁移学习允许你使用学习的给定数据结构的高级表示,并将其应用于您自己的新训练数据。

回顾一下,你需要3种成分来使用迁移学习:

1. 一个预训练的模型

2. 类似的训练数据 - 你需要输入与预训练模型“足够相似”的输入。 类似的意味着输入必须具有相同的格式(例如输入张量的形状,数据类型......)和类似的解释。 例如,如果你使用预训练的模型进行图像分类,则图像将用作输入! 然而,一些聪明的人已经格式化音频以通过预训练的图像分类器运行,并带来一些很酷的结果。 与往常一样,财富有利于创意。

3. 训练标签,在此处查看完整的工作示例,以演示使用本地文件的迁移学习。

如果你有任何问题/发现此值,请在下面留下评论。 如果你有任何想要讨论的机器学习项目,请随时与我联系!will@unboxresearch.com。

对于纽约市的读者 - 我们将在2019年1月举办关于TensorFlow的整个研讨会 - 在这里获得门票。

附录

感谢Tyler Neylon。

http://ai.yanxishe.com/page/TextTranslation/1126

Excel 还能这样玩?轻松搞懂一维 & 三维卷积神经网络数据科学家应当了解的五个统计基本概念:统计特征、概率分布、降维、过采样/欠采样、贝叶斯统计

初学者怎样使用Keras进行迁移学习从语言学角度看词嵌入模型使用OpenCV和基于轮廓的方法实现寻线机器人去中心化可扩展多智能体强化学习返回搜狐,查看更多

责任编辑:

python训练模型太大怎么处理_如何极大效率地提高你训练模型的速度?相关推荐

  1. python训练模型太大怎么处理_趣味Python之如何降低过拟合风险

    可惜知乎编辑器里不能插入音频,麻烦诸位自己手动播放一下阅读此篇的官方钦定bgm--<脱掉>. 过拟合/欠拟合 之前的文章<从柏木由纪到卷积滤波器>介绍了卷积提取边缘特征的基本原 ...

  2. Pyinstaller打包python文件太大?教你三个小技巧有效减小文件体积

    简介 有时候需要在未安装Python环境的平台上运行py程序,使用pyinstaller打包很方便,但打包后的可执行文件实在是太大了.原因在于打包时pyinstaller本就已经关联了很多的pytho ...

  3. python 打包 太大 精简_极简 Python 打包指南

    本文由 qbit 整理自<pytest 测试实战·附录D 打包和发布 Python 项目>·Brian Okken 著·华中科技大学出版社 qbit 的实验环境 Windows 10 x6 ...

  4. python输出到txt文件太大的原因_如何减小Python创建的txt文件的大小?

    我在Netezza服务器上的一个表中有大约2M行x70列的数值和分类数据,我想使用Python将这些数据转储到一个.txt文件中. 我以前用SAS做过这个,在我的测试用例中,我得到了一个值450MB的 ...

  5. python需要多大的硬盘_适合新手练习的几个python小项目

    关于python练习的小项目,其实就是一些常用的模块的针对练习 一.找出电脑中遗忘的大文件 # !/usr/bin/env python # _*_ coding:utf-8 -*- import o ...

  6. python 打包 太大 精简_pyinstaller打包结果瘦身

    如果想把python程序发布成.exe的话,一般我们都会使用pyinstaller, 怎么打包这里我就不说了.有时我们打包的结果会非常大,我最大的一次居然有900M......下面我就总结一下可以对发 ...

  7. mysql 内存太大被杀_数据库mysqld进程频繁被杀解决方案[终]

    重要:本文最后更新于2018-11-25 23:33:42,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. 上次数据库mysql进程总是被杀,以前眼光不够长远,认为mysql被杀就是 ...

  8. linux镜像文件太大不好下载_这是什么神仙系统?支持安卓程序 + Windows 程序 + Linux 程序...

    说到操作系统相信大家都很熟悉 Windows.Linux.安卓.macOS 但是很多人都忽略了谷歌出品的 Chrome OS 系统,因为谷歌服务在国内需要 404 工具才能使用,导致这个系统关注度不高 ...

  9. python range从大到小_转 python range 用法

    使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 这里记 ...

最新文章

  1. 2022-2028年中国液晶电视市场投资分析及前景预测报告
  2. 总结open与fopen的区别
  3. struts2的执行过程
  4. Persistent Memory编程简介
  5. JAVA多线程总结(笔记)
  6. php 正则匹配unicode,PHP中正则表达式对UNICODE字符码的匹配方法
  7. 关于shared_from_this的转换
  8. Java笔记-Integer或Long转String时补0(补零)
  9. python server client_python 实现简单client与server | 学步园
  10. undefined reference to `create_module''
  11. 全网首发:多个mimetypes xml设置某种文件类型的不同图标,LINUX怎样确定使用哪个
  12. GaRy-Liang的linux成长日记8-RAID阵列
  13. (滑稽保命)对于《数据结构》严蔚敏教程的吐槽,附:详细代码
  14. MindSpore21天实战营(3):基于ResNet50实现毒蘑菇识别实战
  15. 化工原理计算机辅助设计,化工原理课程设计心得体会
  16. 360网站卫士php-dos,360网站卫士的CDN缓存加速功能详解
  17. libmodbus协议栈4—— 总结
  18. Linux的安装与系统介绍
  19. [转] 安卓巴士总结了近百个Android优秀开源项目,覆盖Android开发的每个领域
  20. 战地2服务器2地图修改,【战地2怎么将地图改为32人】如何修改地图_战地2修改地图教程_游戏城...

热门文章

  1. 2022 CCCC 团体程序设计天梯赛(个人题解)
  2. python 曲线平滑滤波
  3. C语言打印所有“水仙花数”
  4. SHA算法的C++实现
  5. 什么是回调函数Callback----自己的一点理解
  6. Matlab实现图像滤波
  7. 模型评估指标AUC(area under the curve)
  8. 四款超实用的电脑软件,90%的人没有安装!
  9. C++ const用法总结
  10. ffmpeg教程java_ffmpeg Windows开发环境搭建