深的梦想

生成
用Keras生成深度梦境。
作者

fchollet

dfalbel- R翻译

简介

“深梦”是一种图像过滤技术,它包括采用图像分类模型,并在输入图像上运行梯度上升,以尝试最大化特定层(有时是特定层中的特定单元)对该输入的激活。它会产生幻觉般的视觉效果。

它是由Alexander Mordvintsev于2015年7月在谷歌上首次推出的。

过程:

  • 加载原始图像。
  • 定义从最小到最大的多个处理音阶(“八度”)。
  • 将原始图像调整到最小比例。
  • 对于每个刻度,从(最小的(i$e。当前一个),{})
    • 梯度上升跑
    • 高档形象到下一个规模
    • 重新插入升级时丢失的细节
  • 当我们回到原来的尺寸时停止。为了获得在缩放过程中丢失的细节,我们只需获取原始图像,缩小它,放大它,并将结果与(调整大小的)原始图像进行比较。

设置

图书馆(tensorflow)图书馆(keras)base_image_path<-get_file“sky.jpg”“https://i.imgur.com/aGBdQyK.jpg”
加载Tensorflow 2.9.1版本
result_prefix<-“sky_dream”这些是图层的名称#我们试图最大化激活,#以及他们的体重在最后的损失#我们试图最大化。#你可以调整这些设置来获得新的视觉效果。layer_settings<-列表“mixed4”1.0“mixed5”1.5“mixed6”2.0“mixed7”2.5#使用这些超参数还可以让你获得新的效果一步<-0.01#梯度上升步长num_octave<-3.#坡度上升时的刻度数octave_scale<-1.4#尺寸比例迭代<-20.每层上升的台阶数max_loss<-15.0

这是我们的基本图像:

plot_image<-函数(img) {img% > %as.rastermax =255% > %情节()base_image_path% > %image_load()% > %image_to_array()% > %plot_image()

让我们建立一些图像预处理/反处理工具:

preprocess_image<-函数(image_path) {# Util函数打开,调整大小和格式的图片#放入适当的数组中。img<-image_path% > %image_load()% > %image_to_array()昏暗的(img)<-c1昏暗的(img))inception_v3_preprocess_input(img)deprocess_image<-函数(x) {昏暗的(x)<-昏暗的(x) (-1#撤销初始化v3预处理x<-x/2.0x<-x+0.5x<-x255.0x []<-光栅::as.numeric(x)0255x

计算深梦损失

首先,建立一个特征提取模型来检索给定输入图像的目标层的激活。

构建一个装载预先训练好的ImageNet权重的InceptionV3模型模型<-application_inception_v3重量=“imagenet”include_top =#获取每个“键”层的符号输出(我们给它们起了唯一的名字)。outputs_dict<-purrr::imap(layer_settings函数(v,名称){<-get_layer(模型,名称)输出})#建立一个模型,为每个目标层返回激活值#(作为字典)feature_extractor<-keras_model输入=模型输入,输出=outputs_dict)

实际损失计算非常简单:

compute_loss<-函数(input_image) {特性<-feature_extractor(input_image)#初始化损失损失<-特遣部队0形状=形状())layer_settings% > %purrr::imap函数(coeff,名字){激活<-特性[[名字]]扩展<-特遣部队reduce_prod(特遣部队(特遣部队形状(激活),“float32”))#我们通过在损失中只涉及非边界像素来避免边界工件。多项式系数特遣部队reduce_sum(特遣部队广场(激活,3.:-23.:-2,)))/扩展})% > %purrr::减少(特遣部队添加)

设置一个八度的梯度上升循环

gradient_ascent_step<-tf_function函数(img, learning_rate) {(特遣部队GradientTape()%, %胶带,{磁带(img)损失<-compute_loss(img)})#计算梯度。毕业生<-磁带梯度(损失、img)#正常化渐变。毕业生<-毕业生/特遣部队最大(特遣部队reduce_mean(特遣部队腹肌(毕业生)),1 e-6img<-img+learning_rate毕业生列表(损失、img)})gradient_ascent_loop<-函数(img,迭代,learning_rate,max_loss =) {(我seq_len(迭代)){c(损失、img)% < - %gradient_ascent_step(img learning_rate)如果is.null(max_loss)& &as.logical(损失>max_loss)) {打破“…阶跃损失值,我,”:“as.numeric(损失),\ nimg

运行训练循环,在不同的八度音阶上迭代

original_img<-preprocess_image(base_image_path)original_shape<-昏暗的(original_img) [23.successive_shapes<-列表(original_shape)(我seq_len(num_octave-1)) {形状<-as.integer(original_shape/octave_scale我)successive_shapes[[我+1]]<-形状successive_shapes<-牧师(successive_shapes)shrunk_original_img<-特遣部队图像调整(original_img successive_shapes [[1]])img<-特遣部队身份(original_img)#复制一份(我seq_along(successive_shapes)) {形状<-successive_shapes[[我]]“处理八度”,我,“:”、形状、\ nimg<-特遣部队图像调整(img、形状)img<-gradient_ascent_loopimg,迭代=迭代,learning_rate =一步,max_loss =max_lossupscaled_shrunk_original_img<-特遣部队图像调整(shrunk_original_img、形状)same_size_original<-特遣部队图像调整(original_img、形状)lost_detail<-same_size_original-upscaled_shrunk_original_imgimg<-img+lost_detailshrunk_original_img<-特遣部队图像调整(original_img、形状)
加工八度音1,形状:326 489
警告:当子集tensorflow张量时,负数将被python风格解释。看:?”[.tensorflow。张量'表示细节。要关闭此警告,请设置“options(tensorflow.extract. extract. properties”。warn_negatives_pythonic = FALSE) '
...步骤1的损失值:0.5014444…第2步的损失值:0.7033239…第3步的损失值:0.9975789…第4步的损失值:1.339841…第5步的损失值:1.69038…步骤6的损失值:2.055832…第7步的损失值:2.368303…第8步的损失值:2.700009…第9步的损失值:3.018286… Loss value at step 10 : 3.355762 ... Loss value at step 11 : 3.659731 ... Loss value at step 12 : 3.970093 ... Loss value at step 13 : 4.239055 ... Loss value at step 14 : 4.570164 ... Loss value at step 15 : 4.875012 ... Loss value at step 16 : 5.180275 ... Loss value at step 17 : 5.479495 ... Loss value at step 18 : 5.700634 ... Loss value at step 19 : 6.022943 ... Loss value at step 20 : 6.264833 Processing octave 2 with shape: 457 685 ... Loss value at step 1 : 1.214347 ... Loss value at step 2 : 1.962548 ... Loss value at step 3 : 2.586394 ... Loss value at step 4 : 3.085848 ... Loss value at step 5 : 3.57484 ... Loss value at step 6 : 4.002796 ... Loss value at step 7 : 4.40269 ... Loss value at step 8 : 4.807469 ... Loss value at step 9 : 5.220548 ... Loss value at step 10 : 5.58031 ... Loss value at step 11 : 5.953027 ... Loss value at step 12 : 6.311125 ... Loss value at step 13 : 6.666377 ... Loss value at step 14 : 7.01564 ... Loss value at step 15 : 7.373053 ... Loss value at step 16 : 7.687048 ... Loss value at step 17 : 8.022481 ... Loss value at step 18 : 8.353153 ... Loss value at step 19 : 8.676409 ... Loss value at step 20 : 8.996731 Processing octave 3 with shape: 640 960 ... Loss value at step 1 : 1.34736 ... Loss value at step 2 : 2.137553 ... Loss value at step 3 : 2.785597 ... Loss value at step 4 : 3.325019 ... Loss value at step 5 : 3.836637 ... Loss value at step 6 : 4.312602 ... Loss value at step 7 : 4.782893 ... Loss value at step 8 : 5.230842 ... Loss value at step 9 : 5.646795 ... Loss value at step 10 : 6.066389 ... Loss value at step 11 : 6.450614 ... Loss value at step 12 : 6.861366 ... Loss value at step 13 : 7.217497 ... Loss value at step 14 : 7.596985 ... Loss value at step 15 : 7.9565 ... Loss value at step 16 : 8.316831 ... Loss value at step 17 : 8.604964 ... Loss value at step 18 : 8.966898 ... Loss value at step 19 : 9.21804 ... Loss value at step 20 : 9.593339

显示结果。

img% > %as.array()% > %deprocess_image()% > %plot_image()