深度学习入门实战(一):像Prisma一样算法生成梵高风格画像

2023-11-02 03:50

本文主要是介绍深度学习入门实战(一):像Prisma一样算法生成梵高风格画像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文由云+社区发表

作者:董超

导语:现在人工智能是个大热点,而人工智能离不开机器学习,机器学习中深度学习又是比较热门的方向,本系列文章就从实战出发,介绍下如何使用MXnet进行深度学习~ 既然是实战而且本文是入门级别的我们就不讲那么多大家都听不懂的数学公式啦~

0x00 深度学习简介

虽然吧,我们不讲哪些深奥的数学原理,但是基本的原理还是要掌握下的~

在介绍深度学习之前我们要先了解两个概念,机器学习和神经网络。

机器学习:

在介绍深度学习之前,我们先简单介绍下机器学习,我们引用下维基百科上机器学习的定义:

机器学习是人工智能的一个分支。人工智能的研究是从以“推理”为重点到以“知识”为重点,再到以“学习”为重点,一条自然、清晰的脉络。显然,机器学习是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题。机器学习在近30多年已发展为一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。

机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。很多推论问题属于无程序可循难度,所以部分的机器学习研究是开发容易处理的近似算法。

简单的说机器学习就是让机器去分析数据找规律,并通过找到的规律对新的数据进行处理。

神经网络:

神经元:

img

以图像为例子,每个数据或者输入就是一张图片,而里面的每个x可以是图片中的每个像素。对于每个像素我们都赋予一个权重,然后经过转换函数(Transfer Function, 这里是线性叠加)得到一个数值。简单来说,我们对所有像素做个线性加权叠加。得到的数值会经过激活函数得到新的数值。这个激活函数(Activation Function)往往是那几个符合某些特性的非线性函数。为什么需要非线性的转换呢?举个简单的例子,在同一个平面你和你的影子是重叠是分不开的,在立体的空间你们却能分开了。非线性的转换有类似的作用。常用的激活函数有relu, softmax, tanh。

简单的说一个神经元是一个简单的分类器,你输入一个

比如我们有一大堆猫、狗照片,把每一张照片送进一个机器里,机器需要判断这幅照片里的东西是猫还是狗。我们把猫狗图片处理一下,左边是狗的特征向量,右边是猫的

img

大家想想,最简单地把这两组特征向量分开的方法是啥?当然是在两组数据中间画一条竖直线,直线左边是狗,右边是猫,分类器就完成了。以后来了新的向量,凡是落在直线左边的都是狗,落在右边的都是猫。

一条直线把平面一分为二,一个平面把三维空间一分为二,一个n-1维超平面把n维空间一分为二,两边分属不同的两类,这种分类器就叫做神经元。

当然,上面那幅图我们是开了上帝视角才知道“一条竖直线能分开两类”,在实际训练神经元时,我们并不知道特征是怎么抱团的。神经元模型的一种学习方法称为Hebb算法:

先随机选一条直线/平面/超平面,然后把样本一个个拿过来,如果这条直线分错了,说明这个点分错边了,就稍微把直线移动一点,让它靠近这个样本,争取跨过这个样本,让它跑到直线正确的一侧;如果直线分对了,它就暂时停下不动。因此训练神经元的过程就是这条直线不断在跳舞,最终跳到两个类之间的竖直线位置。

神经网络:

神经网络简单点将就是由好多个神经元组成的系统。

神经元一个缺点是:它只能切一刀!你给我说说一刀怎么能把下面这两类分开吧。

img

解决办法是多层神经网络,底层神经元的输出是高层神经元的输入。我们可以在中间横着砍一刀,竖着砍一刀,然后把左上和右下的部分合在一起,与右上的左下部分分开;也可以围着左上角的边沿砍10刀把这一部分先挖出来,然后和右下角合并。

每砍一刀,其实就是使用了一个神经元,把不同砍下的半平面做交、并等运算,就是把这些神经元的输出当作输入,后面再连接一个神经元。这个例子中特征的形状称为异或,这种情况一个神经元搞不定,但是两层神经元就能正确对其进行分类。

只要你能砍足够多刀,把结果拼在一起,什么奇怪形状的边界神经网络都能够表示,所以说神经网络在理论上可以表示很复杂的函数/空间分布。但是真实的神经网络是否能摆动到正确的位置还要看网络初始值设置、样本容量和分布。

深度学习:

那什么是深度学习呢?深度学习简单点说就是一种为了让层数较多的多层神经网络可以训练,能够运行起来而演化出来的一系列的新的结构和新的方法。

就像下图

img

普通的神经网络可能只有几层,深度学习可以达到十几层。深度学习中的深度二字也代表了神经网络的层数。现在流行的深度学习网络结构有"CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的等。

当然我们是以实战为主,可以直接使用现在市面上的一些现有深度学习框架,现在流行的深度学习框架有MXnet,tensorflow,caffe等,本文主要介绍MXnet这个开源的优秀深度学习框架。

0x01 安装MXnet

这里我们安装的是CPU版的MXnet,为什么不安装GPU版?因为偶的Macbook是AMD的卡啊,MXnet只支持CUDA

1.下载源码

新建一个目录,到那个目录下执行

git clone --recursive https://github.com/dmlc/mxnet

2.编译安装

运行setup-utils目录下的install-mxnet-osx.sh脚本,中间要编译些东西,要多等会,再输入个密码,就自动编译安装完成啦。

注意一下:

1.因为要读取make目录下的文件,所以这里要在MXnet源码的根目录执行安装脚本~

比如在mxnet的源码根目录执行

sh ./setup-utils/install-mxnet-osx.sh

2.以后运行脚本可能需要一些python模块,建议安装下pip

mac下安装的方法也很简单: sudo easy_install pip

0x02 样例运行

我们可以试着运行下MXnet自带的一些样例,这里我们试下Neural art这个样例

Neural art是个让机器模仿已有画作的绘画风格来把一张照片重新绘画的算法。

比如我们输入

img

img

最终生成

img

1.首先打开example/neural-style目录,大部分样例都是有README的,大家在运行之前可以先看看

这个样例的README有说

First use download.shto download pre-trained model and sample inputs Then run python nstyle.py, use-h to see more options

那我们就要运行这个目录下的download.sh

脚本会自动下载训练模型vgg19.params到Model目录,输入的素材到input目录

2.运行Demo

因为我们运行的是CPU版,所以要这么输入

python nstyle.py --gpu -1 --max-num-epochs 150 --output_dir ~/Desktop/

--gpu:使用哪个一个GPU,-1代表使用CPU

--max-num-epochs:最大迭代次数,这里我们迭代150次

--output_dir:结果输出路径

可能大家一次运行不起来,会出现No module named for xxx的提示,一般是相应的python模块没有安装,在google搜下No module named for xxx一般都能找到安装方法,大部分都能通过pip安装~

运行结果

我们看下不同迭代次数时的结果是什么样的

10次:

img

50次:

img

100次:

img

150次:

img

可以看出迭代次数越多效果越好~当然由于深度学习是有很多层神经网络组成,需要的运算量巨大,使用CPU即使是i7,150次迭代也需要好几十分钟了,有条件的看官可以尝试使用GPU版,可以将时间缩短到几分钟,甚至在云平台上跑。

样例的具体原理可以参考参考附录的第二个链接。

参考附录:

http://www.leiphone.com/news/201608/wh8osGY4vg28XlvM.html http://phunter.farbox.com/post/mxnet-tutorial2 https://zhuanlan.zhihu.com/p/20634163 http://www.cnblogs.com/peizhe123/p/4641149.html

此文已由作者授权腾讯云+社区在各渠道发布

获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

转载于:https://www.cnblogs.com/qcloud1001/p/10221774.html

这篇关于深度学习入门实战(一):像Prisma一样算法生成梵高风格画像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/327921

相关文章

PyQt5+Python-docx实现一键生成测试报告

《PyQt5+Python-docx实现一键生成测试报告》作为一名测试工程师,你是否经历过手动填写测试报告的痛苦,本文将用Python的PyQt5和python-docx库,打造一款测试报告一键生成工... 目录引言工具功能亮点工具设计思路1. 界面设计:PyQt5实现数据输入2. 文档生成:python-

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、