原标题:如何用卷积神经网络构建图像?

原标题 |Everything you need to know to master Convolutional Neural Networks

作者 | Tirmidzi Faizal Aflahi

译者 | pzSuen(哈尔滨工业大学)、AI小山(工程师)、Brains(前端开发工程师)

来自Pix2PixHD

那不是一张真实照片,你可以在新的标签页中打开并放大图片,看到马赛克了没?

这张图片其实是由一个叫人工智能的程序生成的。是不是看起来很真实?非常不错,不是吗?

这种技术由Alex Krizhevsky和朋友们通过ImageNet比赛而公诸于世,到现在才仅仅七年时间。这个竞赛是每年举行一次的计算机视觉比赛,竞赛内容是把图片分成1000种不同的分类。从阿拉斯加雪橇犬到卫生纸。Alex和朋友们建立了一个叫AlexNet的东西,它以远超第二名的成绩赢得了比赛。

这种技术叫作卷积神经网络,它是在图像处理方面表现出卓越的深度神经网络的一个分支。

来自ImageNet

上图是几年前赢得比赛的软件所产生的错误率,人类的错误率是5%。2016年,它的表现实际上已经优于人类了。

把深度学习引入到这个领域,已不仅仅是突破性的,而是革命性的了。

卷积神经网络架构

那么,这个技术的原理是什么呢?

卷积神经网络表现好于其它深度神经网络架构,是得益于它独特的处理方式。CNN并不每次只处理一个像素,而是把几个像素组合在一起(就像上图中3×3像素的例子),因此它能发现时序模式。

换句话说,CNN能“看到”像素群如何形成直线或曲线。因为深度神经网络天然包含多个层级,在下一层,CNN看到的不再是像素群,而是直线和曲线群如何组成某些形状。一步步下去,直到它们构成了完整的图像。

深度卷积神经网络,由Mynepalli提供

想要了解CNN,你必须要学习很多东西,需要从很基础的知识开始,比如内核、池化层等等。但是,如今你可以一头扎进这门技术的众多开源项目中,并使用它们。

因为一种叫“迁移学习”的技术,使得这种做法确实有效。

迁移学习

迁移学习是一种技术,它把在另外一个特定领域训练好的深度学习模型拿来复用。

举个例子,假如你在一家火车管理公司工作,你打算检查你们的火车是否准点,但你不想为这件事增加人手。你可以复用一个ImageNet的卷积神经网络模型,也许是ResNet(2015年的获胜者),然后用你的火车车队的图片重新训练网络。这样就可以解决问题了。

用迁移学习,有两个主要的竞争优势。

相比从头开始训练,只需要较少图片就能达到良好效果。ImageNet竞赛有大约一百万张图片用于训练。使用迁移学习,你可以只用1000张或者甚至100张图片,而且效果良好,因为模型已经用那一百万张照片训练过了。

取得好效果所需时间更少。要做到ImageNet的水平,你要花好多天来训练网络,这还不包括效果不好时修改网络所需的时间。使用迁移学习,对于某些任务来说,你只要花几个小时甚至几分钟就完成训练。大大节省了时间。

从图像分类到图像生成

有了迁移学习之后,很多构想产生了。如果你能处理图像,并且告诉我们图像里的内容是什么,那能不能自己生成图像呢?

我们接受挑战!

下面是生成对抗网络登场!

CycleGAN 由Jun-Yan Zhu提供

这项技术能够在获得一些输入后,生成图片。

只要给它一种叫CycleGAN的类型的绘图——我已经上面的照片中提供给你,它就能生成真实的照片。在另一个用例中,给出一些草图,它能生成一个袋子的图片。它还可以从低分辨率照片中生成高分辨率的照片。

超分辨率生成对抗网络

很神奇,对吧?

当然是的。而你现在就可以开始学习生成这种图片了。你接下来该怎么做呢?

卷积神经网络教程

那么,让我们开始吧。你会发现开始学习这门课程非常容易,容易到爆。但完全掌握它又是另外一回事。

我们现在暂时把完全掌握放到一边。

浏览几天后,我发现这个项目非常适合你入门。

仙人掌空中识别

本教程中的项目来自Kaggle。你的任务是从航空照片中识别是否有柱状仙人掌存在。

很简单,不是吗?

给你17,500张图片进行操作,需要标注4,000张尚未标注的图片。如果全部4,000张图片被你的程序正确标注,你的得分将是1或100%。

仙人掌

图片跟你在上面看到的很像。一块区域的照片里,可能有或没有柱状仙人掌,照片是32×32像素的。因为是航空照片,所以照片里的仙人掌有不同的角度。

那么,你还需要什么?

使用Python的卷积神经网络

Python,一种用于深度学习的流行语言。针对此语言,有很多深度学习框架可供选择,你实际上可以对每个选择进行反复试验 。下面是几个常用的深度学习框架:

Tensorflow,最受欢迎的深度学习库。由谷歌的工程师建造,拥有最大的贡献者基础和大多数粉丝。由于社区规模如此之大,您可以轻松找到问题的解决方案。它将Keras作为高级抽象包装器,对新手来说非常容易入门。

Pytorch。我最喜欢的深度学习库。纯粹基于Python构建并遵循Python的优缺点。Python开发人员将非常熟悉这个库。它有另一个名为FastAI的库,它提供了Keras对Tensorflow的抽象。

MXNet。Apache的深度学习库。

Theano。Tensorflow的前身

CNTK。微软自己的深度学习库。

在本教程中,让我们使用我最喜欢的一个深度学习框架,Pytorch,以及其抽象FastAI。

在开始之前,你需要安装Python。前往Python网站下载你所需的内容。你需要确保安装版本3.6+,否则你使用的库将可能不支持它。

现在,打开命令行或终端并安装这些东西:

pip installnumpy pip installpandas pip installjupyter

Numpy包用于存储输入图像,pandas包用于处理CSV文件,Jupyter notebook是用Python编辑器。

然后,前往Pytorch官网下载相应版本的Pytorch。为了加速训练速度,你可能需要下载相应的CUDA版本,但是要确保你的Pytorch版本在1.0以上。

然后,安装torchvision和FastAI:

pip installtorchvision pip installfastai

在命令行或者终端输入jupyter notebook打开Jupyter,它会显示在浏览器中。

现在,你已经准备妥当了。

数据准备

导入必要的代码:

importnumpy asnpimport pandas aspd frompathlib importPath fromfastai import* fromfastai.vision import* importtorch %matplotlib inline

Numpy和Pandas库基本上所有任务都需要导入,FastAI和Torch是深度学习库,Matpoltlib Inline 用于显示图表。

现在,从比赛网站下载数据文件。

解压zip压缩包到jupyter notebook的目录下。

假设你的notebook文件名是Cacti,那么你的目录结构将如图所示:

train文件夹含有你训练时用到的所有图片。

test文件夹包含提交时要用的到所有图片。

train.csv文件包含所有的训练数据:如果某图片中含有仙人掌,则该图片名对应的行中has_cactus字段将为1,否则为0。

sample_submission.csv文件中含有提交格式。文件名对应于test文件中所有图片的名字。

train_df= pd.read_csv("train.csv")

把train.csv文件加载到一个data frame中。

data_folder= Path(".") train_images = ImageList.from_df(train_df, path=data_folder, folder='train')

使用ImageList中的from_df方法创建一个加载器来将train_df中的data frame与train文件夹中的图片关联起来。

数据增强

这是一种从已有数据生成更多数据的方法。一只猫的图片垂直翻转之后还是一直猫。通过这种方法,你可以获得两倍,四倍,甚至十六倍的数据。

如果你的数据量比较少的话,你可以使用这种方法。

transformations= get_transforms(do_flip=True, flip_vert=True, max_rotate=10.0, max_zoom=1.1, max_lighting=0.2, max_warp=0.2, p_affine=0.75, p_lighting=0.75)

FastAI提供了一个叫做get_transform的方法可以很好的完成该任务。你可以对图片进行垂直翻转,水平翻转,旋转,缩放,补光,扭曲。

你可以通过运行上面代码来查看这些参数的增强效果,或者你也可以查看通过查看官方文档来详细阅读相关说明。

当然,需要在你的数据集上运用该变换:

train_img= train_img.transform(transformations, size=128)

参数size是为了调整图像大小以适应网络输入。我使用的网络是获得2017年ImageNet最好论文奖的DenseNet,其输入大小为128 x 128.

训练准备

加载数据之后,需要对数据进行预处理才能开始进行训练。训练,可以说成是神经网络在学习,为了在你的数据集上获得好的性能,它从你的数据中学习,并进行自我更新。

test_df= pd.read_csv("sample_submission.csv") test_img = ImageList.from_df(test_df, path=data_folder, folder='test')

-

train_img= train_img .split_by_rand_pct(0.01) .label_from_df .add_test(test_img) .databunch(path='.', bs=64, device=torch.device('cuda:0')) .normalize(imagenet_stats)

为了检测训练性能,你需要从你的训练数据中划分出来一小部分作为验证集。训练时不能采用验证集数据,因为它需要用于验证网络性能。如果你的CNN能够在验证集上获得较好性能,说明其具有较好的泛化能力,同样能在测试集上获得较好性能。

FastAI提供了一个叫做split_by_rand_pac的方法可以很方便的划分验证集。

它也包含一个叫做databunch的方法用于batch的处理。由于我的GPU显存限制,我采用的batch大小为64。如果你没有GPU,请删去device这个参数。

然后,由于你需要采用预训练好的网络,因此你需要采用一个叫做normalize的方法正则化你的图片。参数image_stats是为了按照ImageNet竞赛中预训练网络的规则化方式规则化你的图片。

把测试集数据加入训练集列表的目的是为了在预测时不再进行预处理。但是,请记住训练集数据不会用于训练,也不会归为验证集。这样做只是为了使所有数据采用相同的规则化方式。

learn= cnn_learner(train_img, models.densenet161, metrics=[error_rate, accuracy])

准备好训练数据之后,你可以使用cnn_learner创建一个训练方法。正如前面所说,我使用DenseNet作为预训练好的网络。你也可以使用TorchVision提供的其他网络

单循环技术

现在可以开始训练了。但是当训练所有DNN和CNN的时候,都会有这样一个疑惑,学习率选多大呢?有一个算法叫做梯度下降,它能随着学习率减小误差。

如果学习率过大,可能倾向于越过边界。想左图显示的那样,这可能导致误差非常大。但是如果学习率过小,训练会非常慢,但是误差不会失控。

因此,选择正确的学习率至关重要,要选取一个足够大、但不会大到使误差失控的学习率。

说起来容易,做起来难。

因此,一个叫做Leslie Smith的人提出了一个称为1-cycle的方法。

从直觉上讲,您可能希望找到/蛮力的几种学习速度,并找到一个错误几乎最小,但仍有一些改进空间的学习速度。让我们在代码中尝试一下。

learn.lr_findlearn.recorder.plot

它会打印出下面的东西:

最小值应为10 -1。所以,我认为我们可以使用比这更小的东西,但不能太小。也许3 * 10 - 2是个不错的选择。我们来试试吧!

lr= 3e-02learn.fit_one_cycle(5, slice(lr))

训练几个步骤(我选择5,不要太大也不要太小),让我们看看结果。

等等,什么!?

我们的简单解决方案为我们的验证分割提供100%的准确性!它实际上是有效的。它只需要6分钟的训练。真是太幸运啦!在现实生活中,您将进行多次迭代,以找出哪些算法比其他算法做得更好。

我很想提交!哈哈。让我们预测测试文件夹并提交结果。

preds,_ = learn.get_preds(ds_type=DatasetType.Test) test_df.has_cactus = preds.numpy[:, 0]

由于您已将测试图像放在训练图像列表中,因此无需预处理和加载测试图像。

test_df.to_csv('submission.csv', index=False)

此行将创建一个包含图像名称的CSV文件,并为所有4,000个测试图像提供一个cactus(仙人掌)列

当我尝试提交时,我发现你需要通过Kaggle内核提交CSV。我错过了!

由Kaggle提供

但是,幸运的是,Kernel(内核)实际上与你的jupyter notebook相同。你可以复制粘贴所有你在笔记本上创建的东西并提交到那里。

和BAM!

太棒了我的公共分数是0.9999。这是很好的。但是,当然,如果我的第一次尝试是那样的话,我想要得到一个完美的分数。

我做到了!所以你也能,其实也没有那么难。

(顺便说一句,这个排名是在4月13日,所以我可能会放弃我的排名...)

个人经验

这个问题很简单。所以你在解它的时候不会遇到任何奇怪的挑战。这使得它会成为最适合入门的项目之一。

唉,因为很多人在这方面得到了完美的分数,我认为管理员需要为提交创建另一个测试集,也许这很难。

不管什么原因,你都需要去尝试一下。你现在就可以试试,效果可能会很好噢~

最后思考

卷积神经网络(CNN)对各种任务都很有帮助,从图像识别到生成图像,现在分析图像不像以前那么困难了。当然,你都要去尝试一下。

开始吧,选择一个好的卷积神经网络项目,然后,得到一个好的数据。

好运!

文章最初发布在 thedatamage网站上。

英语原文:https://www.freecodecamp.org/news/everything-you-need-to-know-to-master-convolutional-neural-networks-ef98ca3c7655/

https://ai.yanxishe.com/page/TextTranslation/1768返回搜狐,查看更多

责任编辑:

python神经网络构建图_如何用卷积神经网络构建图像?相关推荐

  1. python代码做图_如何用Python代码制作图

    Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. 图是一 ...

  2. 卷积神经网络的结构_射击训练:卷积神经网络识别解剖结构标志位点

    本文2100字,阅读大约需要7分钟 在医学图像分析中,我们需要识别解剖结构的标志位点,识别出的位点可用于临床分析以及解剖结构分割等用途.深度学习的发展,给这样的方法带来了一些新的可能,已有不少的研究. ...

  3. 怎么用python读取excel图_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  4. python怎么实现图像去噪_基于深度卷积神经网络和跳跃连接的图像去噪和超分辨...

    Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connect ...

  5. python k线图_如何用python画K线图(成交量+MACD+KDJ)

    最近一直在研究股票的形态,一些量化的东西,虽然量化听起来很高大上,通寻找到一个策略,通过程序的手段去找到这样一批股票,避免了人为的因素在其中.这样有个问题就是,程序选出来的股票太机械了,某个参数或条件 ...

  6. java如何构建图_如何从传递边构建子图?

    我认为你最好的选择可能是使用subgraph()步骤,因为你通常可能提取边缘引发的子图,然后在该子图上执行一些Gremlin来引入可视化边缘并删除你不想要的东西 . 我可以使用TinkerPop打包的 ...

  7. python四边形转矩形_如何用PIL将矩形图像映射成四边形?

    所以我用一个简单的正向映射来解决这个问题,而不是逆映射,这通常更好,但是在我的应用程序中,我只将矩形映射到比矩形小的四边形,因此通常在变换后的图像中没有孔.代码如下:def reverse_quad_ ...

  8. 卷积神经网络 手势识别_如何构建识别手语手势的卷积神经网络

    卷积神经网络 手势识别 by Vagdevi Kommineni 通过瓦格德维·科米尼(Vagdevi Kommineni) 如何构建识别手语手势的卷积神经网络 (How to build a con ...

  9. 04.卷积神经网络_第一周卷积神经网络

    04.卷积神经网络_第一周卷积神经网络 1.1 计算机视觉 上面这张图是64x64像素的图像,它的数据量是12288,下图是1000x1000像素的图像,它的数据量是3百万.如果用全连接网络去处理这张 ...

最新文章

  1. CodeDom Assistant CodeDom的强大工具, 有些BUG修正了下,发到CodePlex,大家有需要的可以看看...
  2. 联通sgip协议 java socket_sgip12 个人编写的 联通SGIP协议基于 socket 方式实现 源 联合开发网 - pudn.com...
  3. 新东方预计6个月亏损超8亿美元
  4. 正则表达式-验证带千分号的,带任意位小数的数字类型
  5. python元类_Python元类
  6. 如何在XML序列化时隐藏可为null的的字段(XmlElement和XmlAttribute)
  7. Java教程01.Java简介与环境配置
  8. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_7_反射_Class对象功能概述...
  9. 19 统计量及其抽样分布——样本均值的分布与中心极限定理
  10. C++用*和空格输出一个正方形及其对角线
  11. win10专业版有必要吗_Win10专业版和家庭版系统有什么不同?
  12. html form背景图片设置,input 提交表单按钮 背景图片的完美设置
  13. 2021-04-24 - 电脑主板 - 升级Blos和ME - 学习/实践
  14. 最全Android 开发和安全系列工具
  15. vue 海康视频播放
  16. 【图像处理】CloudCompare 设置背景、点云颜色
  17. RK平台--EVS模块: (一)概述
  18. 大逃杀显示服务器崩溃,绝地求生大逃杀崩溃问题汇总 崩溃问题及完美解决方案...
  19. 简析LDO静态电流与功耗的关系
  20. matlab 三nurbs,nurbs 绘制 三维、二维图形,网格细化,基函数求解等 包 matlab 238万源代码下载- www.pudn.com...

热门文章

  1. 暖暖CEO姚润昊:“公司80%都是女生,大多是踏实的90后”
  2. 用Python玩转二维码
  3. WiFi的单频和双频
  4. SpringBoot项目没有@RunWith注解
  5. 刚开始做微商如何引流 ?一开始做微商没有客源怎么办
  6. Guava1.0—— 目录
  7. React基础(叁)———事件处理
  8. 463个生活小窍门 找找你需要的!(1-200)
  9. SSM项目-我爱我家(二)
  10. 《雪鹰领主3D》昨日腾讯玩吧首发! HTML5进入3D游戏时代!