Python实现简单的机器翻译模型

thbcm阅读(170)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

好几天没推文的罪恶感让我决定今天来水一篇文章。

和之前“Python玩CartPole”那篇推文一样,这也是来自于PyTorch官方教程的一个简单实例。

为了展示我的诚意,我依旧会由浅入深地讲解本文使用到的基本模型:Seq2Seq以及Attention机制

内容依旧会很长~~~

希望对初入NLP/DeepLearning的童鞋有所帮助~

废话不多说,直接进入正题~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1y3KcMboz_xZJ9Afh5nRkUw

密码: qvhd

参考文献

官方英文教程链接:

http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html

另外:

对英文文献阅读有困难的同学也不必担心,我已经把这个教程翻译为中文放到了相关文件中。

开发工具

系统:Windows10

Python版本:3.6.4

相关模块:

torch模块;

numpy模块;

matplotlib模块;

以及一些Python自带的模块。

其中PyTorch版本为:

0.3.0


环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

补充说明:

PyTorch暂时不支持直接pip安装。

有两个选择:

(1)安装anaconda3后在anaconda3的环境下安装(直接pip安装即可);

(2)使用编译好的whl文件安装,下载链接为:

https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch

原理介绍

PS:

部分内容参考了相关网络博客和书籍。

(1)单层网络

单层网络的结构类似下图:

输入的x经过变换wx+b激活函数f得到输出y

相信对机器学习/深度学习有初步了解的同学都知道,这其实就是单层感知机嘛~~~

为了方便起见,我们把它画成这样(请忽视我拙劣的绘图水平):

x为输入向量,y为输出向量,箭头表示一次变换,也就是y=f(Wx+b)。

(2)经典RNN

在实际中,我们会遇到很多序列形的数据:

X1,X2,X3,X4…

例如我们的机器翻译模型,X1可以看作是第一个单词,X2可以看作是第二个单词,以此类推。

原始的神经网络并不能很好地处理序列形的数据,于是救世主RNN出现了,它引入了隐状态h的概念,利用h对序列形的数据提取特征,接着再转换为输出。下面详细说明一下其计算过程(下图中的h0为初始隐藏状态,为简单起见,我们假设它是根据具体模型而设置的一个合理值):

其中:

再重申一遍,所有的字母均为向量,箭头代表对向量做一次变换。

h2的计算与h1类似,并且每一步使用的参数P、Q、b都是一样的,也就是说每个步骤的参数共享:

其中:

以此类推(记住参数都是一样的!!!),该计算可以无限地持续下去(不限于图中的长度4!!!)。

那么RNN的输出又如何得到呢?

RNN的输出值是通过h进行计算的:

其中:

类似地,有y2、y3、y4…:

当然,和前面一样,这里的参数W和c也是共享的

以上就是最经典的RNN结构,我们可以发现其存在一个致命的缺点:

输入和输出序列必须是等长的!

这个缺点导致了经典RNN的适用范围并没有想象中的那么大。

(3)改进经典RNN

情况1(输入为N,输出为1):

假设我们的问题要求我们输入的是一个序列,输出的是一个单独的数值。那么我们只在最后一个h上进行输出变换就可以了:

情况2(输入为1,输出为N):

当输入只是单一数值而非序列时该怎么办呢?

我们可以只在序列开始进行输入计算:

当然你也可以把输入信息x作为每个阶段的输入:

情况3(输入为N,输出为M):

这是RNN最重要的一个变种,这种结构也被称为:

Encoder-Decoder模型,或者说Seq2Seq模型

我们的机器翻译模型就是以它为基础的。

Seq2Seq结构先将输入数据编码成一个上下文量c

其中:

即上下文量c可以直接等于最后一个隐藏状态,也可以是对最后的隐藏状态做一个变换V得到,当然也可以是对所有的隐藏状态做一个变换V得到等等。

上述RNN结构一般称为Encoder

得到c之后,我们需要另外一个RNN网络对其进行解码操作,即Decoder。你可以把这个c当作初始状态h’0输入到Decoder中:

当然你也可以把c当作Decoder每一步的输入:

算了,补充说明一下吧:

缺少输入的部分(比如某些蓝色的方块没有x输入)你完全可以把x作为0处理然后再代入经典RNN所列出的公式中计算输出,其他的也类似。

(4)Attention机制

在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c后再进行解码,当输入序列较长时,c很可能无法胜任存储输入序列所有信息的任务。

Attention机制很好地解决了上述问题。它在Decoder每一步输入不同的c:

其中,c根据Encoder中的h生成:

aij代表Encoder中第j阶段的hj和Decoder中第i阶段的相关性。

那么这些权重aij该如何确定呢?aij自然也是从模型中学得的,我们一般认为它与Encoder的第j个阶段的隐状态和Decoder的第i-1阶段的隐状态有关。

比如我们要计算a1j:

然后我们需要计算a2j:

以此类推

(5)最后任务:法语翻译成英语

有了前面的铺垫,相信大家都能看懂官网的教程。

在这里我们仅做简单的介绍,详细的建模和实现过程可以参考我翻译的官方文档。

Encoder网络为:

Decoder网络为:

其中,encoder最后一个隐藏状态作为decoder的初始隐藏状态。attention机制的权重计算类似(4)中所述。GRU网络的结构为:

GRU网络结构在此就不作详细的介绍了,篇幅太长的话估计没人看得下去吧,就先这样了~~~

在相关文件中我也提供了4篇相关的论文供感兴趣者阅读与研究。(T_T纯英文的~~~)

结果展示

在cmd窗口运行Translation.py文件即可。

误差曲线:

训练过程中cmd窗口的输出:

模型测试:


作为对比:

和最后一个测试结果一模一样有木有!!!

当然,有些翻译结果就不怎么理想了。因为模型和训练数据过于简单了(T_T这里就不举例了)~~~

最后四句话的attention图:




That’s all~~~

更多

感兴趣的同学可以进一步修改模型来获得更好的结果,当然也可以找找其他数据集制作诸如中翻英之类的模型~~~



学会Python实现学写作

thbcm阅读(197)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

T_T没有科研梦想的人半夜过来水篇文章~~~

让Python学会写写歌,创创作~~~

纯属娱乐~~~

改编自PyTorch官网的一个教程,不过我用TF写的,然后生成英文变成了生成中文~~~

Let’s Go~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1VUEFR82CqyDj2w9SS4xnFA

密码: 3dmx

开发工具

Python版本:3.6.4

相关模块:

tensorflow-gpu模块;

numpy模块;

以及一些Python自带的模块。

其中TensorFlow-GPU版本为:

1.6.0

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

关于RNN的介绍,请参考我之前的文章:

Python实现简单的机器翻译模型(点击蓝字进入)

这里我们使用Char RNN模型进行训练。

即Seq2Seq模型中的特殊情况输入与输出等长。

也就是类似下图的样子(图源网络):

具体实现过程详见相关文件中的源代码。

使用演示

在cmd窗口运行Char_RNN.py文件并根据提示输入相关信息即可。

训练相关的参数请在config.py文件中调整:

训练所用的数据路径以及生成新文本所用的预热数据请在Char_RNN.py文件中调整:

训练演示视频:

因为时间太长了,我只录了训练的前面一部分。

最终训练结果如下图所示:


结果展示

因为时间和资源有限。

这里只展示周杰伦的所有歌词作为样本进行训练之后测试的结果。

当然你完全可以找其他文本作为训练语料来生成风格各异的“文章”“歌词”等等~~~

结果如下:

预热歌词为:是曾与你躲过雨的屋檐

好吧我并不知道它在说啥T_T

一个失败的案例T_T

大概是模型太low了。而且训练数据是我从网上直接下载的,也没有预处理过T_T。中间竟然突然冒出一个括号我也是颓了T_T

更多

随便玩玩的T_T~~~

有兴趣的同学可以试着换更复杂的模型~~~

然后训练的语料最好处理一下~~~

好久没写TF了,代码可能写的有点糟糕T_T

就这样吧~~~

【Python】RNN实现文本生成

thbcm阅读(155)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

导语

本文将在此基础上介绍LSTM网络。最后举一个类似“Python学写作”的例子来实现文本生成,如生成诗歌、小说等等。

让我们愉快地开始吧~~~

参考文献

Understanding LSTM Networks:

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

相关文件

百度网盘下载链接: https://pan.baidu.com/s/16hjmw1NtU9Oa4iwyj4qJuQ

密码: gmpi

开发工具

Python版本:3.6.4

相关模块:

tensorflow-gpu模块;

numpy模块;

以及一些Python自带的模块。

其中TensorFlow-GPU版本为:

1.7.0

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

另外,TensorFlow-GPU的环境搭建请自行参考相关的网络教程,注意版本和驱动严格对应即可。

原理介绍

一. RNNs

人们的思维总是具有延续性的,比如当你阅读这篇文章时,你对每个词的理解都会依赖于你前面看到的一些词,而不是把你前面看的内容全部抛弃,再去理解每个词。而传统的神经网络(CNN)无法做到这一点,因此有了循环神经网络(RNNs)。

在RNNs中,存在循环操作,使得它们能够保留之前学习到的内容:

在上图网络结构中,对于矩形块A的那部分,通过输入Xt(t时刻的特征向量),它会输出一个结果ht(t时刻的状态或者输出),网络中的循环结构使得当前状态作为下一时刻输入的一部分。

将RNNs在时间步上进行展开,就可以得到下图:

也就是“Python实现简单的机器翻译模型”一文中所使用的RNNs链状的结构。显然,这样的结构是有利于处理序列相关问题的。近年来,其在语音识别、语言翻译等等领域都取得了巨大的成功。

而RNNs的成功,主要归功于LSTMs这种特殊RNNs结构的使用,而非普通的RNNs结构。

二. LSTMs

全称为Long Short Term Memory networks.

即长短期记忆网络。

普通RNNs的局限性在于当我们所要预测的内容和相关信息之间的间隔很大时,普通RNNs很难去把它们关联起来:

尽管从理论上来讲,只要参数合适,还是可以解决长时期依赖关系无法很好联系这一问题的,但具体实现起来似乎并不容易,至少目前为止是不容易的。

幸运的是,LSTMs能够很好地解决这一问题。它被设计的初衷就是为了能够记住长时期内的信息。

循环神经网络是由相同结构的神经网络模块进行复制而形成的。在标准的RNNs中,神经网络模块的结构非常简单,比如可以由单一的tanh层构成:

LSTMs也有类似的结构,不过神经网络模块的结构变得相对复杂了一些:

接下来,我们来详细介绍一下这个结构。首先,我们来定义一下用到的符号:

粉红色的圈:

代表向量加之类的逐点操作;

黄色矩形框:

代表神经网络层;

普通的线:

用于携带并传递向量;

合并的线:

代表对两条线上所携带的向量进行合并;

分开的线:

代表将线上所携带的向量复制后传给两个地方。

2.1 LSTMs的核心思想

假设一个绿色的框就是一个cell。

向量通过结构图最上面的那条贯穿cell的水平线穿过整个cell,而cell仅对其做了少量的线性操作:

显然,这样的结构能够很轻松地让信息从整个cell中穿过而不发生变化。

当然,只有一条水平线是无法实现添加或者删除信息的,也就是实现让信息有选择地通过cell,这需要通过一种叫做门(gates)的结构来实现。

门结构主要由一个sigmoid神经网络层和一个逐点相乘的操作来实现:

sigmoid层输出的向量每个元素都是介于0和1之间的实数,表示此时通过的信息的权重,当其为0时表示“此时不让任何信息通过”,为1时表示“此时让所有信息通过”。每个LSTM都有三个这样的门结构,来实现保护和控制信息。

2.2 逐步理解LSTM

遗忘门(forget gate layer):

首先,LSTM需要决定哪些信息需要丢弃,哪些信息需要保留。这是通过一个叫做遗忘门的sigmoid层来实现的。它的输入是ht-1xt,输出是一个数值都在0到1之间的向量,表示Ct-1中各部分信息的权重,0表示不让该部分信息通过,1表示让该部分信息全部通过。

具体而言,比如在语言模型中,我们要根据所有的上下文信息来预测下一个词。在这种情况下,每个cell的状态中都应该包含了当前主语的性别信息。这样,接下来我们才能够正确地使用代词。但是,当我们开始描述一个新的主语时,就应该把之前的主语性别给丢弃了才对。

传入门(input gate layer):

其次,LSTM将决定让哪些新的信息加入到cell的状态中来。该实现分两个步骤进行:

① 用一个tanh层生成一个备选向量,用于表示获得的所有可添加信息;

② 用一个叫做传入门的sigmoid层来决定步骤①中获得的可添加信息各自的权重。

具体而言,比如在语言模型中,我们需要把新主语的性别信息添加到cell状态中,来替换掉之前的主语性别信息。

有了遗忘门和传入门,我们就能够更新cell的状态了,即把Ct-1更新为Ct

还是以语言模型为例,假设我们的模型刚输出了一个代词,接下来可能要输出一个动词,那么这个动词应该采用单数形式还是复数形式呢?显然,我们需要把代词相关的信息和当前的预测信息都加入到cell的状态中来,才能够进行正确的预测。

具体计算方式如下图所示:

输出门(Output):

最后,我们需要决定输出值。输出值的计算方式为:

① 使用sigmoid层来决定/计算出Ct中的哪部分信息会被输出;

② 利用tanh层将Ct的取值压缩到-1到1之间;

③ 将tanh层的输出和sigmoid层的输出相乘即为最终的输出结果。

三. LSTMs的变种

① 将cell的状态作为门结构输入的一部分。

② 将遗忘门与传入门耦合,即不再分开决定要遗忘和添加的信息。

③ GRU

GRU模型“简化”了LSTM模型的设计,其中rt由LSTM中的遗忘门和传入门合并而得,称为重置门;zt为更新门,作用相当于LSTM中的输出门。

实际应用

为了贯彻理论与实践相结合的理念,本文将举一个简单的小例子,该例子使用的模型与“Python学写作”类似,本文不再作多余的介绍。

具体实现过程详见相关文件中的源代码。

使用演示

模型训练:

在cmd窗口运行‘train.py’文件即可:

如有需要,可自行修改相关参数:

模型使用:

在cmd窗口运行“generate.py”文件即可。

注意模型参数需和train.py文件中的模型参数一致:

结果展示

生成英文文本:

以莎士比亚的作品为训练素材获得的结果:

生成中文文本:

以周杰伦的作品为训练素材获得的结果:

更多

代码截止2018-06-24测试无误。

模型比较简单,有兴趣的朋友可以在此基础上进行优化,当然RNN的作用可不仅仅是文本生成哦~

以后有机会再举其他例子吧~~~

Python简单实现图像风格迁移

thbcm阅读(207)

本文转载至知乎ID:
Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

T_T之前似乎发过类似的文章,那时候是用Keras实现的,现在用的PyTorch,而且那时候发的内容感觉有些水,于是我决定。。。

好吧我确实只是为了写点PyTorch练手然后顺便过来水一篇美文~~~

利用Python实现图像风格的迁移!!!

不喜欢过程同学的依旧可以直接下拉到最后看结果~

Let’s Go!

参考资料

链接:

http://pytorch.org/tutorials/advanced/neural_style_tutorial.html#

是的,这又是来自于PyTorch官网的一个教程。

在相关文件中我依旧提供了我翻译好的版本~~~

以及涉及到的论文~~~

相关文件

网盘下载链接: https://pan.baidu.com/s/1eDOTzd0uzNzzQDRbpDEd2A

密码: tv5i

开发工具

Python版本:3.6.4

相关模块:

torch模块;

PIL模块;

matplotlib模块;

torchvision模块;

以及一些Python自带的模块。

torch版本:

0.3.0

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

补充说明:

PyTorch暂时不支持直接pip安装。

有两个选择:

(1)安装anaconda3后在anaconda3的环境下安装(直接pip安装即可);

(2)使用编译好的whl文件安装,下载链接为:

https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch

额外说明

T_T相关文件中提供了所需的预训练模型,若嫌弃官网的下载速度,可以下载我的。

下载之后放到类似下图路径的文件夹中:

原理简介

作为一个纯正的非艺术生,抱歉我真的没法解释什么叫图像的艺术风格。反正齐白石和梵高的画肯定不是一个style的就是了。

那么我来尝试解释一下风格迁移吧:

风格迁移的实质是保留原画内容的基础上,用另外一种style来呈现原画。

那么如何量化呢?

简单而言大概是这样的:

利用CNN逐层提取图像的特征(层越靠后提取出的特征越高级和稳定,即更能表现图片的高级语义信息),并且将某一层或某几层输出的Gram矩阵作为损失函数,来衡量两幅图像之间的内容/风格差异(T_T就是两幅图像分别经过相同的卷积神经网络,比较某一层或者某几层输出的Gram矩阵的差异)。

Gram矩阵是啥???

具体而言,其计算方式为:

我们都知道,一张图片在某个卷积层的输出特征为一个形如(batch_size, channels, width, height)的四阶张量,显然batch_size为1。

我们将类似下图的特征:

转换为(batch_size*channels, width*height)大小的矩阵,这个矩阵和它的转置相乘就可以得到一个大小为(batch_size*channels, batch_size*channels)的矩阵,这个矩阵即为Gram矩阵。

其实这就算是定义了图像风格和图像内容这两个概念了,接下来我们就可以实现风格迁移了。

其流程大概是这样的:

具体的实现细节详见源代码吧~~~

相关文件中也有官网教程的个人翻译版以及相关的论文供感兴趣者参考。

使用方式

修改下图所示处的图片路径为自己的图片路径:

在cmd窗口运行Neural_Transfer.py文件即可。

由于资源和时间有限,下面展示的结果我都只跑了几百轮左右,图像大小为256*256。

梵高笔下的皮卡丘

原图像:


生成的图像:

梵高笔下的老北京

原图像:


生成的图像:

毕加索笔下的爱因斯坦

原图像:


生成的图像:

齐白石笔下的西湖

原图像:


生成的图像:

更多

利用其他库实现的图像风格迁移:

1.基于python深度学习库DeepPy的实现:

https://github.com/andersbll/neural_artistic_style

2.基于python深度学习库Caffe的实现:

https://github.com/fzliu/style-transfer

3.基于python深度学习库TensorFlow的实现:

https://github.com/log0/neural-style-painting

感兴趣的朋友自己去实现一下吧~~~


【Python】FCN+滤波器实现细胞检测

thbcm阅读(197)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

Hi~~~

“浮云一别后,流水十年间。”忙忙碌碌中发现又有多日没有更新公众号了,过来更一发~~~

【下个月再开始推一些爬虫相关的内容吧,这个月确实没什么时间。】

利用全卷积网络+滤波器实现细胞检测。

让我们愉快地开始吧!

相关文件

百度网盘下载链接: https://pan.baidu.com/s/16W2uByTpThAH8GUrv7pOZg

密码: 5f5k

开发工具

Python版本:3.6.4

相关模块:

numpy模块;

PIL模块;

scipy模块;

TensorFlow-GPU模块;

tensorlayer模块;

matplotlib模块;

以及一些Python自带的模块。

TensorFlow-GPU版本:

1.6.0

测试平台:

Windows10

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

其中,TensorFlow-GPU的环境搭建请自行参考相关的网络教程,注意版本和驱动严格对应即可。

原理简介

利用简单的全卷积网络+高斯和统计排序滤波器实现的细胞检测算法。

其中全卷积网络的结构为:

训练集包含6种类型的细胞图像:

(依据其中心进行分类)

(1)细胞重叠:

(2)非目标细胞:

(3)细胞边缘

(4)细胞间隙:

(5)背景:

(6)细胞中心点:

T_T相信聪明的小伙伴已经猜到了:

我们采用的细胞检测算法其实就是利用滑动窗口遍历给定的图像,把每个窗口的图像感受野输入到训练好的网络,判断该窗口的中心是否为细胞中心,若是则标出。该思想类似于RCNN,不过我们对检测结果加了滤波器来提高其精度。

至于具体实现过程,详见相关文件中的源代码。

使用演示

模型训练:

在cmd窗口运行train.py文件即可。

相关文件中提供了原始数据集和转为tfrecords格式的数据集。训练只需使用tfrecords格式的数据集即可。若想自己生成,则将下图中的注释去掉,并将该函数中的原始数据集路径修改为你自己的数据集路径:

训练效果图:

模型测试:

相关文件中提供了训练好的模型,在cmd窗口运行test.py文件即可,运行前请自行修改该文件内的测试图像路径:

效果展示

原图像1:

检测效果1(注意红点):

原图像2:

检测效果2:

That’all~~~

更多

模型设计的比较简单,效率比较低。之后会推送一些高端点的算法~~~

代码截止2018-05-30测试无误。

【Python】利用GAN生成MNIST数据集

thbcm阅读(170)

本文转载至知乎ID:
Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

利用Python搭建简单的GAN网络来生成MNIST数据集。其中GAN,即生成对抗网络

英文全称:

Generative Adversarial Networks

偷闲入门了一波心心念念的GAN,过来发一波文。

毕竟自从2014年被Ian Goodfellow提出后便一直是深度学习中的热门方向且十分有趣。

Let’s Go~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1h6haOWnQojZU67igrNveeA

密码: 51pr

开发工具

相关模块:

tensorflow-gpu模块;

numpy模块;

matplotlib模块;

以及一些Python自带的模块。

其中TensorFlow-GPU版本为:

1.7.0

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

其中,TensorFlow-GPU的环境搭建请自行参考相关的网络教程,注意版本和驱动严格对应即可。

原理简介

生成对抗网络(GAN)的基本思想源自博弈论中的二人零和博弈,由一个生成器和一个判别器组成,通过对抗学习的方式来训练。

具体而言:

GAN的生成器主要用来学习真实图像的特征分布从而让自身生成的图像更加真实,以骗过判别器。判别器则需要对输入的图片进行真假判别。

整个过程串起来就是,生成器努力地让生成的图像更加真实,从而让判别器认为自己生成的图像是真实的图像,而判别器则努力地去识别出图像的真假,让生成器无法骗过自己。

随着训练的进行,生成器和判别器也在不断地斗智斗勇,最后的结果当然就是:

生成器生成的图像接近于真实图像,而判别器对于生成器生成的图像判别正确的概率接近于0.5。

其过程也可以总结为下图:

就生成MNIST的GAN网络具体模型而言:

生成器结构为:

判别器结构为:

至于具体的实现细节详见相关文件中源代码。

代码里注释的还算详细吧T_T

结果展示

训练方式:

在cmd窗口运行GanMnist.py文件即可。

训练过程中的Loss走势:

生成器生成的图像演变(show.py文件):

测试方式:

在cmd窗口运行Test.py文件即可。

利用训练好的模型生成MNIST数据集结果:

更多

T_T好吧这个例子也许并不能体现出GAN多有趣。

那么立个Flag,下次有空利用GAN网络来干一些有趣的事情,非常非常有趣的事情~~~

【Python】利用GAN生成动漫头像

thbcm阅读(166)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程>>戳此了解

参考文献

用深层卷积生成对抗网络进行无监督表示学习;

GenerativeAdversarialNets。

甘论文汇总:

https://github.com/zhangqianhui/AdversarialNetsPapers

声明

本教程提供的所有源码以及素材仅供学习交流使用,禁止商用/非法使用。

导语

发现之前两篇关于GAN的文章效果都比较一般,想试着优化一下,训练个像样一些的模型,至少不能太丢GAN的脸,于是就有了这篇文章。

OK,让我们愉快地开始吧〜

相关文件

百度网盘下载链接:https//pan.baidu.com/s/1t-d5wq3TeBWcVzTOoraPtQ

密码:84ky

开发工具

蟒蛇中的版本:3.6.4

相关模块:

pytorch模块;

torchvision模块;

PIL模块;

以及一些Python中的中自带的模块。

PyTorch版本:

0.3.0

环境搭建

安装的Python的中并添加到环境变量,PIP安装需要的相关模块即可。

补充说明:

PyTorch0.3.0不支持直接的PIP安装(Windows)中中中。

有两个选择:

(1)安装anaconda3后在anaconda3的环境下安装(直接PIP安装即可);

(2)使用编译好的WHL文件安装,下载链接为:

https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch

原理简介

关于生成对抗网络的核心思想,请参考之前的文章:

【Python中的中】利用甘生成MNIST数据集。

顺便补充一下甘训练目标的数学语言描述:

公式解释如下:

X:真实图片;

Z:输入ģ网络的噪声;

G(Z):G ^网络生成的图片;

d(X):真实图片是否真实的概率;

d(G(X)):G ^网络生成的图片是否真实的概率。

正如之前的文章所述,生成网络ģ的训练目标是尽可能生成真实的图片去欺骗判别网络d;而判别网络d的训练目标就是尽可能把生成网络ģ生成的图片和真实的图片区别开来,即训练过程是一个动态的“博弈过程”。

因此,公式中的ģ网络希望d(G(Z))尽可能得大; d网络希望d(x)的的的尽可能得大,d(G(X))尽可能得小故而公式的训练目标为

更多关于甘的原理介绍和应用可参考参考文献 ”部分的内容。

具体模型

【的的的Python】利用GAN神奇生成宝贝一文中使用的网络结构不同,本文使用了全卷积网络结构(即不再加入全连接层FC)。同时本文增加了训练数据量,使用了大约5万张动漫头像作为训练数据。

具体而言,生成器结构为:

判别器结构为:

具体实现详见相关文件中的源代码。

模型训练

一。训练数据集

使用了大约5万张动漫头像作为训练数据集,数据集源:

https://zhuanlan.zhihu.com/p/24767059。

二,模型训练

修改config.json文件中的训练数据集路径:

在CMD显示窗口显示运行显示train.py文件即可。

训练截图:

效果展示

Epoch0:

Epoch5:

Epoch10:

Epoch15:

Epoch20:

Epoch25:

Epoch29:

更多

代码截止2018年7月4日测试无误。

相关文件中提供了训练好的模型以及调用模型的简单脚本,直接在cmd窗口运行“ test.py ”文件即可生成动漫头像:




python学画画(上)

thbcm阅读(188)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

本来想用神经网络让计算机学会画铅笔画和素描的,后来发现其实不用神经网络效果也还可以,那么系列上就从简单的入手!

先放图哈!

沙画:




铅笔画:






文件下载

百度网盘下载链接: https://pan.baidu.com/s/1Y4ocZhhJuuRdWAJjWTh3MQ

密码: 26xi

原理简介

素描:

sketch1.py:

其主要思想是彩色图片先转换成灰度图片,然后模拟人作画时先画轮廓再逐步勾画细节的过程。

勾轮廓时比较像素点左边一小段区域内像素平均值和右边一小段区域内像素平均值的差值,如果差值超过预设范围,则认为该点是轮廓点。另外,素描时不是一次性成像的,而是由淡到深,依次画,这样可以使图画看起来深浅更分明,更有立体感。

sketch2.py:

原理类似,但是以线条为单位进行素描,并且增加了随机函数,使得线条长度不确定,并且增加到上下、左右、左上、右下、右上、左下8个方位区块的比较,这样创作的素描画看上去更柔和,也更接近真实的人类作画的风格。

沙画:

sand_paint.py:

其实原理和画铅笔画是差不多的,区别是用随机函数模拟了空白背景上的沙粒,沙粒的颜色深浅,可以通过S_COLOR_LIGHT和S_COLOR_DARK来设置。

OK,代码原理介绍完毕,其实很简单或者说很low。但效果确实还不错。


运行方式

python设置了环境变量之后,在cmd中运行即可。输入python文件名+想要素描或者化成沙画的原图像路径(含图像名)即可。例如下图:

图片将保存在当前路径下。

下期预告

让python模仿世界名画!也就是之前很火的一个人工智能话题。

比如梵高笔下的天安门和上海:



python学画画(下)

thbcm阅读(193)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

这大概是去年深度学习最火的应用之一了吧,利用神经网络将世界名画的画风迁移到任意一张普通的图片上。

还是先放图!

左边是待转换图片,右边是供以学习画风的图片:


结果:

再来一组:



所需工具获取

百度网盘下载链接: https://pan.baidu.com/s/1yJTxYBmV2rfLdNt2s53N_A

密码: bqjs

工具清单

所给出的文件包括:

  1. 该项目实现的原理论文: “A Neural Algorithm of Artistic Style”;

  2. GitHub上相关项目的源文件(TensorFlow实现);

  3. 该项目实现的Keras版本(也是获得前面两个例子的源代码,我做了一些注释)。

使用说明

STEP1:

将所提供的models文件夹放在类似下图所示的路径下:

STEP2:

运行所提供的ImitationPaintings.py文件,格式为python ImitationPaintings.py+待转化图片路径+模板图片路径+生成图片保存路径加名称(注意不需要有.jpg等后缀),例如:

实现起来就是这么简单,默认迭代次数为10,运行所需时间略久,至于具体的原理,可以参见论文和相关的GitHub项目(因为所需的理论基础实在太多,我也不知道如何介绍其原理,这里推荐一篇博文:http://www.cnblogs.com/mangoyuan/p/6329410.html个人觉得写的一般,想要明白具体原理还是需要研读论文和源代码才行)。

其他库实现风格转换

1.基于python深度学习库DeepPy的实现:

https://github.com/andersbll/neural_artistic_style

2.基于python深度学习库Caffe的实现:

https://github.com/fzliu/style-transfer

3.基于python深度学习库TensorFlow的实现:

https://github.com/log0/neural-style-painting

最后再放些图片吸引一下大家吧

下面是一些别人跑出来的结果,感觉很nice。













利用Python绘制了一些有意思的图案

thbcm阅读(167)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

花了点时间利用Python绘制了一些有意思的图案,也算是发掘了一下Python的可视化功能吧。。。

PS:

部分图案参考了一些博客的一部分源代码。

顺便证明一波我的审美T_T。。。

没错,是时候证明一波了~~~

Let’s Go!

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1ZOaw7JmZ2dNvw0BDCcaTcA

密码: grsp

开发工具

Python版本:3.6.4

相关模块:

numpy模块;

matplotlib模块;

numba模块;

PIL模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

原理没啥好说的,直接展示吧~~~

首先当然是一些逆天的数学分形图案啦~~~

(1)朱利亚分形

(2)二十面体对称的万花筒

(3)曼德勃罗集

(4)牛顿分形

其次,我也用Python的turtle模块画了一些有点意思的图案。

(1)漫天雪花


(2)玫瑰

方案一:

方案二:

(3)爱心(T_T好吧有些非主流)

That’s all…以后有机会再画其他的吧~~~

更多

Python的可视化库还是非常丰富的,功能也十分强大,有需要的朋友可以自己去学习一下。

譬如:

Matplotlib;

Pandas;

Bokeh;

Pygal等等。

联系我们