艺术图像生成的DeepDream技术研究与实现

2021-11-03 06:43:36孙泽张俊
电子技术与软件工程 2021年18期
关键词:梯度损失像素

孙泽 张俊

(武汉工程大学计算机科学与工程学院 湖北省武汉市 430205)

1 研究背景

机器作画一直是近些年来研究的一个重难点,得益于硬件等条件的提升,人工智能迅速发展,并取得了前所未有的成就,现在它能做到的不仅仅是辨识技术,也能从事艺术创作。现在的艺术创作不再局限于传统的画笔、画布创作,而是能通过Deep Dream 技术、生成对抗网络等深度学习的方法进行生成[1]。

Deep Dream 是由Google 公司提出的,特殊点在于通过机器模仿人类视觉认知,产生图像。其绘制出的作品极具艺术特色,同时也是有一定的商业价值的,比如Google 举办的艺术展中,阿克肯的一幅作品以8000 美元的价格成功拍卖[2]。在我们视觉系统上建模的Deep Dream 程序,看到了我们未知的内容并以非凡的方式融合图像,人工神经网络可谓开启了一个全新的艺术子流派[3]。

2 Deep Dream数学原理

卷积神经网络可用于多分类任务,输入一张图片,神经网络便会输出一个向量,数值大小代表取各个类别的概率大小,输出值与真实值比较,两者之间的差距用损失函数来量化,损失函数指引网络模型参数的变化方向,分类任务常用交叉熵损失函数,如式1 所示,p(x)表示x 的真实概率值,q(x)表示x 的预测概率值,H(p,q)表示预测值与真实值之间的损失,上述RegCNN 同样使用交叉熵损失函数训练而成。

梯度的方向就是损失函数值增长最快的方向,常用梯度下降算法来优化参数,使参数不断更新,如式(2)所示,L 为损失函数,W 为网络模型参数,lr 为学习率,学习率决定了使损失函数达到最小值的每一步的步长[4]。损失值越小,模型输出值与真实值更接近,即模型更优,这也是分类任务的最终优化目标。

而Deep Dream 却是将损失最大化,首先将图片传入预训练的卷积神经网络,卷积层有固定的参数权值,经过卷积运算后得到特征图,再将特征图传入非线性激活函数得到输出激活值,如式(3)、(4)所示。

上式中,O(i,j)为输出矩阵O 中(i,j)位置的元素,I 为输入矩阵,K 为m×n 的核矩阵,b 为偏置项,两次累加完成卷积核与输入特征图对应位置相乘累加的过程。σ 为激活函数,完成非线性变换,增强了网络的表达能力。

选择某一个卷积层激活值的输出或者某一个特定卷积层通道激活值的输出,对其取平均后将其作为损失值,损失对图片像素值求导,再使用梯度上升算法更新像素值以最大化损失,损失越大,即表明图片上的特征与预训练模型卷积层提取到的特征越相似,卷积层学习到的特征在图片上的反馈越明显。整个训练过程中,神经网络模型的参数值是固定的,优化改变的是图片像素值。

卷积神经网络虽然在实际应用中取得了较好的效果,但缺乏可解释性。在2013年的“Visualizing and Understanding Convolutional Neural Networks”这篇文章提出了使用反卷积等方法进行特征可视化的方法。反卷积即卷积的逆过程,将卷积得到的特征图传入反卷积,即可得到特征图的可视化结果[5]。这在一定程度上解释了卷积神经网络所提取到的内部特征。DeepDream 的灵感来源于此,但不同的是,Deep Dream 以这种“训练图像”的方式来可视化网络,如图1 所示。

图1:DeepDream 原理图

3 深度神经网络

全连接神经网络参数量过多,训练起来较为困难,也极其容易出现过拟合的现象[6]。所以现在的用于分类的神经网络通常是先利用卷积层对图像进行特征提取,将提取到的降维之后的特征图传入全连接网络,卷积层通过权值共享大大减少了计算量[7]。

LeNet-5 是早期极具代表性的卷积神经网络,于1998年被Yann LeCun 等人提出,其成功地将卷积神经网络应用在了手写数字体识别的问题上,LeNet-5 网络由两个卷积层、两个池化层以及全连接层构成[8],此经典结构为以后卷积神经网络的发展奠定了基础。AlexNet 是在LeNet-5 之后被Alex 提出的,其网络由五个卷积层和三个全连接层构成,训练时使用Dropout 随机忽略一部分神经元,防止模型过拟合,使用ReLU 作为卷积层的激活函数以提升训练速度,使用最大池化而不是平均池化,使用两块GPU 加速训练[9],获得了2012年ImageNet[10]竞赛的冠军。VGGNet 证明了网络深度的增加可提高识别准确率,在2.2 小节对其进行介绍。GoogLeNet是2014年Christian Szegedy 等人提出的一种全新的深度神经网络,它在同一层内使用不同尺寸的卷积核,增加了网络的宽度,其网络由多个Inception 块串联而成,相比于VGGNet,GoogLeNet 的参数量更少,准确率更高,在ImageNet 上的top-5 错误率为6.67%[11]。ResNet 于2015年由Kaiming He 等人提出,创新性地提出了残差网络结构,残差块使用了跳跃连接,此结构训练优化相对容易,缓解了网络过深导致的梯度弥散问题,通过学习恒等映射,解决模型性能退化的问题,以此进一步加深网络层数,提升识别准确率,ResNet 在ImageNet 上的top-5 错误率仅为3.57%[12]。继ResNet 之后,DenseNet 被Gao Huang 等人提出,与残差块不同的是,DenseBlock中每一个网络层的输入来自前面所有层的输出,这种网络结构相比ResNet 具有更少的参数量,密集的跳跃连接使得模型更易训练,也可以缓解梯度弥散的问题,同时作者发现此结构具有一定的正则效果,同等参数量的情况下,DenseNet 的性能优于ResNet[13]。

卷积神经网络发展迅速,现已广泛应用于计算机视觉、自然语言处理等领域,并取得了显著成果。本文将DeepDream 分别在RegCNN 和经典卷积神经网络VGG19 上进行实现与改进。

3.1 RegCNN

图5:原图

为了生成艺术化的图片,首先提出了在RegCNN(Regular Convolutional Neural Network)网络模型上实现的方法。本文中RegCNN 为作者搭建的卷积神经网络,模型架构如图2 所示。其由4个标准的“卷积层-BN层-激活层-池化层”块和3层全连接层组成,为五分类模型。卷积层均采用3×3 的卷积核,步长为1,使用全零填充保证卷积操作后特征图的大小不变,4 个卷积层卷积核的个数分别为64、128、256、512;BN 层对特征图中的值进行批标准化,加速网络的收敛[14];激活层均采用ReLU 激活函数[15],如式(5)所示;池化层为最大池化,尺寸2×2,步长为2,使用全零填充,将特征图的大小变为原来的一半,减少计算量,起到数据降维的作用,防止过拟合。卷积层与池化层相结合,使得特征图大小不断减小,数目不断增多,以此保证卷积层提取到的特征信息不会过少。三个全连接层的结点数为256、128、5,前两层使用RELU 激活函数,最后一层不使用激活函数,以配合使用交叉熵损失函数。

图2:网络结构

3.2 VGG19模型

VGG19 模型是在AlexNet 之后提出来的,它在网络深度上进行改进,即加大了网络深度,相比于AlexNet 网络,VGG19 具有更强的特征提取能力[16]。VGG 网络在ImageNet 数据集上的Top5误差率为7.5%,采用3×3 的卷积核与2×2 的池化核[17],既减少了参数量,又能保证提取到的信息不减少。

4 基于RegCNN的艺术图像生成算法

4.1 Reg CNN的训练

训练RegCNN 模型,本文使用的是Pokemon 数据集,数据集图片从网络爬取获得,部分样本如图3 所示。数据集图片有5 种类别,共1168 张。数据集划分为训练集、验证集和测试集,由于此数据集较小,为了防止在验证集和测试集上的准确率有大幅的波动,使用60%-20%-20%的比例划分训练集、验证集和测试集。

图3:部分样本图

图片送入模型之前要对其进行预处理。将图片大小调整到(224,224),并对图片进行随机水平旋转,这属于数据增强的方法,可在一定程度上增强模型的泛化能力。神经网络对0 附近的值比较敏感,因此预处理还将[0,255]的图片像素值转换到[-1,1]之间,利于网络的收敛。

Reg CNN 训练时使用Adam 优化器,Adam 优化器结合一阶动量与二阶动量并修正偏差,在神经网络训练时取得的效果是较好的[4],学习率初始设置0.001,使用ReduceLROnPlateau 类实例让学习率动态变化,当验证集准确率经过10 个epoch 后没有提高,则将学习率变为原来的1/10。采用early stopping 技术防止过拟合,20个epoch 后验证集准确率没有提升0.001 则停止训练。训练时同时使用ModelCheckpoint 类实例保存最优参数,以便下次训练时不必重新开始或直接使用最优参数进行预测分类。损失函数使用分类问题最常见的交叉熵损失函数,评估指标为准确率。如图4 所示,最终训练完成后,在验证集上的准确率可达95.7%,测试集上的准确率为93.4%。结果表明,RegCNN 模型训练的效果是较好的。

图4:训练集与验证集的准确率和损失对比图

4.2 艺术图的生成

使用训练完毕的RegCNN 模型,可根据网络层名称或者索引获取到特定层的输出,可以选择任意的层,这里选择“activation”激活层的输出。以“activation”激活层的输出和Reg CNN 模型的输入构建新的模型,命名为dream_model。

此处图片在传入dream_model 之前,同样要进行预处理操作,并且给单张图片添加一个batch 维度,后送入dream_model 模型得到输出。模型的输出即为上述“activation”激活层的输出,形状为H×W×C,对输出值取平均后得到标量,将此标量作为损失值。

损失确定后,即可使用损失对图片像素值求导,接着对得到的导数进行标准化处理,更新图片像素值,具体实现为像素值加上标准化后的导数与学习率的乘积,每更新一次图片像素值便进行限值操作,使像素值的范围处于[-1,1]之间。当训练完成显示图片时,再还原像素值的范围到[0,255]。

单次训练函数train_step 定义为对图片进行一次梯度上升更新像素值。循环调用train_step函数110次,可以看到效果图如图6所示,同一张图片,经过模型的处理,改变了一种艺术效果。

图6:全通道生成图

图6 是选择“activation”层的整个输出作为优化目标的,也可以选择某一个特定通道的输出,例如选择“activation”层的第11个通道,实现方法是在损失计算时增加一个切片操作,获取输出特征图的某一通道值而不是整个特征图的值。同一层的不同通道生成效果也是不同的。

5 实验结果的优化改进

5.1 多尺度变换优化

通过实验发现,生成的原始图片仍存在一些问题:图片有噪声、分辨率低等,影响了图片艺术化的效果,基于此,可利用多尺度变换对生成图的质量进行优化改进。多尺度变换优化指的是将图片缩放到不同的大小,由小到大,在图片每一种不同的尺寸上进行梯度上升算法的多次迭代,最后再将图片还原为初始大小。

由于涉及到不同尺寸的图片输入,这就要求深度神经网络中不能包含全连接层,即全卷积网络,本文对VGG19 进行微调,去掉全连接层得到全卷积神经网络,同时加载ImageNet 数据集上的权值。首先选择VGG19 中的“block1_conv1”卷积层作为dream_model 的输出,首先按照第4 节所述方法生成原始图,效果如图7所示。

图7:VGG19 初始生成图

每一种尺寸循环迭代50 次train_step,接着将处理后的图片按一定比例放大,同样进行50 次的更新迭代,重复前述步骤直至图片大小达到设定的最大尺寸,最后再将图片变换为原始大小进行显示。尺寸优化后的效果图如图8 所示,可以看到,经过优化后的图片分辨率有一定的提高。

图8:尺寸变化优化

5.2 图片分割优化

多尺度变换虽提高了生成图的质量,但仍存在边缘模糊、细节处理不到位等问题,且如果图片尺寸很大,传入神经网络后计算时间和消耗的内存也会很大。解决此问题,可以将图片分割为多个互不相交的小图片,将每一个分割后的小图片传入神经网络计算梯度。为了防止分割后的小图片拼接还原时接缝的出现,在分割之前先对图片进行随机移动,梯度计算完成后再还原移动。

分割计算梯度时,采用与图片等大小的初值为零的矩阵gradients 存储图片梯度信息,分块计算的梯度值累加在gradients 上,之后根据shift 保存的移动量还原移动,使得gradients 矩阵与原图片相对应,最后再将梯度值标准化。

与多尺度变换的方法相结合,改变图片的尺寸,在每一个不同的尺寸上随机移动图片、分割计算梯度,使用梯度上升法更新像素值。图9 为最终优化生成的图片,生成图分辨率、清晰度均有所提高,图片细节上得到了优化。

图9:尺寸变换和分割计算梯度优化

同样使用VGG19 中的“block1_conv1”卷积层作为dream_model 的输出,选取不同的图片进行对比,对比效果如图10 所示,通过对比发现,经过多尺度变换与图片分割优化产生的艺术图,相较于原始生成图,解决了分辨率低、有噪声等问题,并且在边缘等细节上处理得更加完善。

图10:对比图

6 小结

本文首先在RegCNN 上进行艺术图的生成,但由于生成图有噪声、分辨率低等问题需要对其进行改进,通过将图片随机移动、分割为小图片的方法,并与多尺度相结合,完成了最终的优化改进。实验表明,优化改进提高了生成图片的分辨率,消除了图中存在的噪声,完善了对边缘等细节的处理。

猜你喜欢
梯度损失像素
赵运哲作品
艺术家(2023年8期)2023-11-02 02:05:28
像素前线之“幻影”2000
少问一句,损失千金
一个改进的WYL型三项共轭梯度法
胖胖损失了多少元
一种自适应Dai-Liao共轭梯度法
应用数学(2020年2期)2020-06-24 06:02:50
“像素”仙人掌
一类扭积形式的梯度近Ricci孤立子
玉米抽穗前倒伏怎么办?怎么减少损失?
今日农业(2019年15期)2019-01-03 12:11:33
高像素不是全部
CHIP新电脑(2016年3期)2016-03-10 14:22:03