资源算法cnn-vis

cnn-vis

2019-08-19 | |  186 |   0 |   0

CNN-VIS

受谷歌最近的Inceptionism博客文章的启发,cnn-vis是一个开源工具,可让您使用卷积神经网络生成图像。这是一个例子:

您可以在示例库中找到更多示例以及用于生成它们的脚本

卷积神经网络(CNN)近年来已经变得非常流行,用于计算机视觉中的许多任务,但最特别是用于图像分类。CNN采用图像(以像素网格的形式)作为输入,并通过若干非线性函数转换图像在分类设置中,最后一层以一组类的概率分布的形式对图像的内容进行编码。较低层倾向于捕获低级图像特征,例如定向边缘或角落,而较高层被认为编码更具语义意义的特征,例如对象部分。

为了将CNN用于分类任务,需要对其进行训练我们随机初始化网络的权重,然后展示其标签已知的图像的许多示例。基于网络在对这些已知图像进行分类时所犯的错误,我们逐渐调整网络的权重,以便正确地对这些图像进行分类。用于训练CNN的两个流行数据集是ImageNet [4]和MIT Places [10]。ImageNet包含1000种对象,如狗,鸟和其他动物,而MIT Places包含205种类型的场景,如卧室,厨房和森林。

尽管CNN在各种任务上表现良好,但很难准确理解CNN正在使用什么类型的图像特征来发挥其魔力。揭开CNN神秘面纱的一个技巧是在训练有素的CNN中选择一个神经元,并尝试生成一个导致神经元强烈激活的图像。我们用随机噪声初始化图像,通过网络向前传播图像以计算目标神经元的激活,然后通过网络向后传播神经元的激活以计算图像的更新方向。我们使用此信息更新图像,并重复该过程直到收敛。这个一般策略已被用于可视化单个神经元的激活[8,9],以生成特定对象类的图像[5],以反转CNN特征[1,2],

Inceptionism建立在这一系列工作的基础上,增加了三个独特的曲折:

  • 层扩增:我们不是选择神经元并生成图像以使其最大化,而是选择网络层并尝试放大已经由图像激活的图层中的神经元。这导致反馈循环,使网络强调已经存在的图像的特征。谷歌的博客文章没有详细说明这一点; 在cnn-vis中,我们通过最大化所选层中每个神经元的绝对值和平方的总和来实现这一点,但原则上所选层的任何超线性函数都应该起作用。

  • 多尺度,高分辨率图像:因为它们的计算成本非常高,所以CNN倾向于在相对低分辨率的图像上工作。例如,最先进的GoogLeNet网络[7]适用于224x224像素的输入图像。为了生成更高分辨率的图像,Inceptionism“在自己的输出上迭代地应用算法,并在每次迭代后应用一些缩放”。除了提供高分辨率图像之外,这个技巧还使得生成的图像具有多个尺度的结构,从而赋予它们类似分形的外观。在cnn-vis中,我们通过用重叠的224x224补丁平铺图像并在每个补丁上交错更新来实现这个想法。经过一些迭代后,我们对图像进行上采样,对其进行爬行,然后继续。

  • 非随机初始化:Inceptionism(和cnn-vis!)允许您从用户指定的图像开始,而不是像文献中常见的那样使用随机噪声或零初始化我们生成的图像。我不确定它有多大的科学价值,但它确实看起来很酷!

建立

咖啡

cnn-vis建立在Caffe之上,Caffe是Berkeley的一个优秀的开源CNN实现。您需要执行以下操作:*安装Caffe; 按照官方的安装说明*为Caffe *构建Python绑定如果您有NVIDIA GPU,您可以选择安装cuDNN以使Caffe更快*将环境变量设置$CAFFE_ROOT为指向Caffe安装的根目录*下载官方Caffe预训练的GoogLeNet模型; $CAFFE_ROOT运行命令

./scripts/download_model_binary.py models/bvlc_googlenet/
  • 下载预训练的麻省理工学院的地方数据集版本GoogLeNet的位置 ; 把它放进去$CAFFE_ROOT/models/googlenet_places

CNN-VIS

克隆存储库,创建虚拟环境,安装需求,并将Caffe Python库添加到virtualenv:

git clone https://github.com/jcjohnson/cnn-vis.gitcd cnn-visvirtualenv .envsource .env/bin/activatepip install -r requirements.txtecho $CAFFE_ROOT/python > .env/lib/python2.7/site-packages/caffe.pth

用法

cnn-vis是一个独立的Python脚本; 您可以通过传递各种命令行参数来控制其行为。

有很多可以调整的旋钮会影响最终生成的图像。为了帮助您入门,我们提供了使用cnn-vis的脚本,以在示例库中生成一组示例图像为了完整起见,我们还在此处记录所有选项。

CNN选项

这些选项控制将用于生成图像的CNN。* --deploy_txt:Caffe .prototxt文件的路径,该文件定义要使用的CNN模型。cnn-vis期望此模型的输入来自名为blob的blob data默认值是BVLC参考GoogLeNet。* --caffe_model.caffemodel文件的路径,给出要使用的CNN模型的权重。默认值是BVLC参考GoogLeNet。* --batch_size:要并行计算的图像块的数量。较大的值将占用更多的GPU内存,但对于较大的图像可能更有效。默认值为1. * --mean_image:按照惯例,大多数Caffe预训练模型不适用于原始图像,而是在减去一些平均图像后处理残差。此参数提供a的路径.npy提供平均图像的文件; 默认值是Caffe提供的ImageNet平均图像。* --gpu:用于优化的GPU。将此值设置为负值将在CPU模式下运行模型。

图像选项

这些选项定义了将优化以生成图像的目标* --image_type要生成的图像类型。如果是这样,amplify_neuron那么我们将尝试最大化网络中的单个神经元,类似于[5]。如果是amplify_layer这样,那将产生以Inceptionism风格的图像。* --target_layer:网络中要定位的图层的名称。较早的图层倾向于编码较低级别的特征,如边缘或斑点,而后期图层倾向于编码较高级别的特征,如对象部分。为方便起见,文件中给出了GoogLeNet的完整图层列表googlenet_layers.txt* --target_neuron:如果image_typeamplify_neuron,则target_neuron给出神经元的指数放大。

初始化选项

用于设置初始图像的选项。您可以从现有图像中播种初始图像,也可以使用随机噪声。在随机噪声的情况下,我们生成高斯白噪声,然后使用高斯模糊来平滑它,以防止电视正则化主导优化的前几个步骤。* --initial_image:用于开始优化的图像文件的路径。如果未设置此标志,则将从平滑的高斯白噪声中初始化图像。* --initialization_scale:如果initial_image未设置,则给出用于初始化图像的高斯白噪声的标准偏差。默认值为1. * --initialization_blur:如果initial_image未设置,则给出用于平滑白噪声图像的高斯内核的标准偏差。默认值为0,对应于无平滑。

调整选项大小

用于配置用于生成高分辨率图像的多尺度缩放的选项。为了生成漂亮的图像,我们希望从一个小的初始大小开始,理想情况下不会比CNN的基本分辨率大很多,然后逐渐增长到更大的图像。

尺寸可以指定为基本尺寸的倍数; 对于噪声初始化,基本大小是CNN的输入大小,对于图像初始化,基本大小是初始图像的原始大小。* --initial_size:初始大小。可以是以下之一:*如果未设置,则初始大小为基本大小。* xF其中F是浮点数,例如x0.5初始大小将是基本大小的倍数。* HxW其中HW是整数,例如600x800初始图像将分别具有高度和宽度H以及W像素。* --final_size:最终大小,格式与--initial_size* --num_sizes:要使用的尺寸数量。默认值为1. *--resize_type:如何在初始尺寸和最终尺寸之间分隔中间尺寸。选择是geometriclinear; 默认是geometric

优化选项

我们使用梯度下降进行优化,并使用RMSProp计算每参数自适应学习率。* --learning_rate:使用的学习率。默认值为1.0。* --learning_rate_decay_iter:每次learning_rate_decay_iter迭代,降低学习率。默认值为100. * --learning_rate_decay_factor:每次learning_rate_decay_iter迭代,通过乘以减少学习率learning_rate_decay_factor默认值为1.0,对应于没有学习率衰减。* --decay_rate:RMSProp的衰减率。默认值为0.95。通常当RMSProp用于随机梯度下降时,通常使用大于0.9的值作为衰减率; 但是在这种应用中,我们的梯度不是随机的,因此较低的衰减率值有时效果很好。* --num_steps:每种尺寸的优化步骤数。*--use_pixel_learning_rates:因为图像是使用输入大小的重叠窗口平铺到CNN,所以每个像素将包含在1,2或4个窗口中; 这可能会导致窗口区域边界附近的丑陋伪影,特别是对于高学习率。如果该标志通过,则将每个像素的学习率除以包含像素的窗口数; 这有时可以帮助缓解这个问题。

层扩增目标选项

这些选项允许您配置用于层放大的目标。在反向传播期间,我们将目标层的梯度设置为,目标层的激活-l1_weight * abs(a) - l2_weight * clip(a, -g, g)在哪里a这对应于最大化目标层处的激活的绝对值和阈值平方的(加权)和。生成的图像往往不会对这些参数的值非常敏感,因此默认值应该可以正常工作。* --l1_weightl1_weight上述等式中的值; 默认值为1.0。* --l2_weightl2_weight上述等式中的值; 默认值为1.0。* --grad_clipg上面等式中的值默认值为5.0。

P范数正则化选项

P范数正则化防止单个像素变得太大。对于噪声初始化,p范数正则化将每个像素拉向零(对应于平均ImageNet颜色),并且对于图像初始化,p范数正则化将每个像素拉向初始图像中该像素的值。对于噪声初始化,相对较弱的p范数正则化往往效果很好; 对于图像初始化,p范数正则化是唯一一个强制与初始图像视觉一致性的术语,因此p范数正则化应该更强。* --alpha:p范数的指数。注意[5]使用L2正则化,对应于alpha=2.0while [2]建议使用alpha=6.0默认值为6.0。*--p_reg:p-范数正则化的正则化常数。较大的值将导致更强烈地强制执行p范数约束。默认值为1e-4。* --p_scale:缩放常数; 在计算p范数正则化器之前将像素除以该值。请注意,p_scale可以吸收非单位值p_reg,因此这在技术上是可以减少的; 但是它对于数值稳定性和更容易比较p_reg不同值的值都很有用alpha

辅助p范数正则化选项

第二个p范数正则化器的参数; 然而,第二个p范数正则化器总是向零拉,而第一个p范数正则化器如果给出则拉向初始图像。如果初始图像包含非常饱和的区域(非常白或非常黑),那么即使是初始值周围的小偏差也会导致像素值超出[0,255]范围。解决这个问题的一个技巧是添加第二个p-norm正则化器,其具有高指数(可能是11)和非常低的正则化常数(可能是1e-11)。该正则化器对[0,255]范围中心附近的像素几乎没有影响,但会将该范围外的像素推回零。* --alpha_aux:辅助p范数正则化的指数。默认值为6. *--p_reg_aux:辅助p范数正则化的正则化强度。默认值为0(无辅助p范数正则化器)。* --p_scale_aux:辅助p范数正则化器的缩放常数,类似于p_scale

总变化正则化选项

总变差(TV)正则化鼓励相邻像素具有相似的值。对于噪声初始化,这个正则化器是至关重要的; 没有它,生成的图像将表现出大量的高频噪声。对于图像初始化,它不太重要; 强p正则化将使像素保持接近初始图像,这足以防止高频噪声。

如[2]中所定义,我们通过使用相邻像素近似图像梯度的大小来计算图像的TV范数,将图像梯度提高到β的幂,并对图像求和。

[2]表明,从较低的电视标准正规化强度开始并随着时间的推移而增加它会产生良好的结果。在cnn-vis中,我们通过在固定次数的迭代之后将TV范数正则化强度增加恒定量来实现该想法。* --beta:电视正则化的指数。如[2]中所讨论的,小于1的值将产生纯色斑块; 将beta设置为2或2.5往往会产生良好的结果。默认值为2.0。* --tv_reg:电视正规化的正规化强度。较高的值将更强烈地鼓励图像具有小的电视规范。* --tv_reg_scale:类似于p_scale在计算电视规范之前图像被分割的缩放因子。因为p_scale这在技术上是减少的,可以被吸收tv_reg*--tv_reg_step_iter:电视规范正规化力度将逐步提高tv_reg_step_iter默认为50. * --tv_reg_step:每tv_reg_step_iter一步,TV-norm正规化强度都会增加这个数量。默认值为0,对应于固定的电视规范正则化强度。* --tv_grad_operator:操作员用于计算电视规范的图像梯度。选择是naive(使用[2]中的相邻像素),sobel(使用经典的Sobel滤波器)或sobel_squish(使用内核[[-1,1,0],[-2,2,0],[-1] ,1,0]]和[[-1,-2,-1],[1,2,1],[0,0,0]])。使用Sobel算子往往会因相邻像素的振荡行为而导致高频噪声,所以天真可能是大多数应用的最佳选择。

输出选项

控制输出的选项。--output_file:将保存最终图像的文件名。默认是out.png--rescale_image:如果给出该标志,则图像颜色线性重新缩放为[0,255]; 图像的最小值将映射到0,最大图像值将映射到255.如果未给出此标志,则图像将被剪切到范围[0,255]以进行输出。重新调整图像值可以显示高饱和度或去饱和图像区域中的细节,但可能导致颜色失真。--output_iter:在output_iter优化的每个步骤之后,将产生一些输出。究竟是什么产生的是由控制iter_behavior--iter_behavior:每个output_iter步骤应该发生什么允许的选项如下所示。选项可以结合使用+有多种行为; 例如,show+print+save将完成所有三个output_iter步骤。* show:使用matplotlib显示当前图像* save:保存当前图像; 文件名将附加大小编号和迭代编号output_file* print:打印当前的迭代次数,以及来自不同正则化器的图像和梯度的一些统计数据。* plot_pix:使用matplotlib绘制一些图像像素的值随时间变化; 这可以让您粗略地了解优化过程的进展情况。例如,非常振荡的行为表明发生了一些不好的事情,学习率应该降低。* --show_width, --show_height:控制所显示图像的大小show行为。分别显示高度和宽度show_height以及show_width英寸的图像

参考

[1] A. Dosovitskiy和T. Brox。“使用卷积网络反转卷积网络”,arXiv preprint arXiv:1506.02753(2015)。

[2] A. Mahendran和A. Vedaldi,“通过颠倒来理解深层图像表征”,CVPR 2015

[3] A. Nguyen,J。Yosinski,J。Clune。“深度神经网络很容易被愚弄:对不可识别图像的高可信度预测”,CVPR 2015

[4] O. Russakovsky,et al。“Imagenet大规模视觉识别挑战”,IJCV 2014。

[5] K. Simonyan和A. Vedaldi和A. Zisserman,“深入卷积网络:可视化图像分类模型和显着性图”,ICLR 2014

[6] C. Szegedy,et al。“神经网络的迷人属性。” arXiv preprint arXiv:1312.6199(2013)。

[7] C. Szegedy,et al。“围绕Convolutions进行更深入”,CVPR 2015。

[8] J. Yosinski,J。Clune,A。Nguyen,T。Fuchs,H。Lipson H(2015)“通过深度可视化理解神经网络”,ICML 2015深度学习研讨会。

[9] MD Zeiler和R. Fergus。“可视化和理解卷积网络”,ECCV 2014。

[10] B. Zhou,A。Lapedriza,J。Xiao,A。Torralba和A. Oliva。“使用Places数据库学习场景识别的深层功能”,NIPS 2014。

上一篇:深度强化学习的异步方法集

下一篇:使用Gym库和Pytorch框架的强化学习模型

用户评价
全部评价

热门资源

  • Keras-ResNeXt

    Keras ResNeXt Implementation of ResNeXt models...

  • seetafaceJNI

    项目介绍 基于中科院seetaface2进行封装的JAVA...

  • spark-corenlp

    This package wraps Stanford CoreNLP annotators ...

  • capsnet-with-caps...

    CapsNet with capsule-wise convolution Project ...

  • inferno-boilerplate

    This is a very basic boilerplate example for pe...