4.keras实现-->生成式深度学习之DeepDream

DeepDream是一种艺术性的图像修改技术,它用到了卷积神经网络学到的表示,DeepDream由Google于2015年发布。这个算法与卷积神经网络过滤器可视化技术几乎相同,都是反向运行一个卷积神经网络:对卷积神经网络的输入做梯度上升,以便将卷积神经网络靠顶部的某一层的某个过滤器激活最大化。但有以下几个简单的区别:

  • 使用DeepDream,我们尝试将所有层的激活最大化,而不是将某一层的激活最大化,因此需要同时将大量特征的可视化混合在一起
  • 不是从空白的、略微带有噪声的输入开始,而是从现有的图像开始,因此所产生的效果能够抓住已经存在的视觉模式,并以某种艺术性的方式将图像扭曲
  • 输入图像是在不同的尺度上【叫作八度(octave)】进行处理的,这可以提高可视化的质量

我们将从一个在ImageNet上预训练的卷积神经网络(Keras内置的Inception V3模型)开始

#加载预训练的Inception V3模型
from keras.applications import inception_v3
from keras import backend as K

#我们不需要训练模型,所以这个命令会禁用
K.set_learning_phase(0)

#构建不包括全连接层的Inception V3网络。使用预训练的ImageNet权重来加载模型
model = inception_v3.InceptionV3(weights = ‘imagenet‘,include_top=False)

接下来要计算损失loss,即在梯度上升过程中需要最大化的量。在第五章的过滤器可视化中,我们试图将某一层的某个过滤器的值最大化。这里,我们要将多个层的所有过滤器的激活同时最大化。具体来说,就是对一组靠近顶部的层激活的L2范数进行加权求和,然后将其最大化。选择哪些层(以及它们对最终损失的贡献)对生成的可视化结果具有很大影响,所以我们希望让这些参数变得易于配置。更靠近底部的层生成的是几何图案,而更靠近顶部的层生成的则是从中能够看出某些ImageNet类别(比如鸟或狗)的图案。我们将随意选择4层的配置,但以后一定要探索多个不同的配置

# 设置DeepDream配置
layer_contributions={
    ‘mixed2‘:0.2,
    ‘mixed3‘:3.,
    ‘mixed4‘:2,
    ‘mixed5‘:1.5,
}
#这个字典将层的名称映射为一个系数,这个系数定量表示该层激活对你要最大化的损失的贡献大小。
# 注意,层的名称硬编码在内置的inception V3应用中

  

#定义需要最大化的损失

#创建一个字典,将层的名称映射为层的实例
layer_dict = dict([(layer.name,layer) for layer in model.layers] )

#在定义损失时将层的贡献添加到这个标量变量中
loss = K.variable(0.) 

for layer_name in layer_contributions:
    coeff = layer_contributions[layer_name] #该层激活对损失的贡献大小
    activation = layer_dict[layer_name].output #获取层的输出

    scaling = K.prod(K.cast(K.shape(activation),‘float32‘))

    #将该层特征的L2范数添加到loss中,为了避免出现边界伪影,损失中仅包含非边界的像素
    loss += coeff * K.sum(K.square(activation[:,2:-2,2:-2,:1])) / scaling

  

#梯度上升过程

#这个张量用于保存生成的图像,即梦境图像
dream = model.input

#计算损失相对于梦境图像的梯度
grads = K.gradients(loss,dream)[0]

#将梯度标准化(重要技巧)
grads /= K.maximum(K.mean(K.abs(grads)),1e-7)

#给定一张输出图像,设置一个keras函数来获取损失值和梯度值
outputs = [loss,grads]
fetch_loss_and_grads = K.function([dream],outputs)

def eval_loss_and_grads(x):
    outs = fetch_loss_and_grads([x])
    loss_value = outs[0]
    grad_values = outs[1]
    return loss_value,grad_values

#这个函数运行itertions次梯度上升
def gradient_ascent(x,iterations,step,max_loss=None):
    for i in range(iterations):
        loss_value,grad_values = eval_loss_and_grads(x)
        if max_loss is not None and loss_value > max_loss:
            break
        print(‘...Loss value at‘,i,‘:‘,loss_value)
        x += step * grad_values
    return x

  

最后就是实际的DeepDream算法

首先,我们来定义一个列表,里面包含的是处理图像的尺度(也叫八度)。每个连续的尺度都是前一个的1.4倍(放大40%),即首先处理小图像,然后逐渐增大图像尺寸。对于每个连续的尺度,从最小到最大,我们都需要在当前尺度运行梯度上升,以便将之前定义的损失最大化。每次运行完梯度上升之后,将得到的图像放大40%。

在每次连续的放大之后(图像会变得模糊或像素化),为避免丢失大量图像细节,我们可以使用一个简单的技巧:每次放大之后,将丢失的细节重新注入到图像中。这种方法是可行的,因为我们知道原始图像放大到这个尺寸应该是什么样子。

给定一个较小的图像尺寸S和一个较大的图像尺寸L,你可以计算将原始图像大小调整为L与将原始图像大小调整为S之间的区别,这个区别可以定量描述从S到L的细节损失。

#辅助函数
import scipy
from keras.preprocessing import image

def resize_img(img,size):
    img = np.copy(img)
    factors=(1,
            float(size[0])/img.shape[1],
            float(size[1])/img.shape[2],
            1)
    return scipy.ndimage.zoom(img,factors,order=1)

def save_img(img,fname):
    pil_img = deprocess_image(np.copy(img))
    scipy.misc.imsave(fname,pil_img)

def preprocess_image(image_path):
    img = image.load_img(image_path)#打开图片
    img = image.img_to_array(img)#把图片转成array形式
    img = np.expand_dims(img,axis=0)#改变图像大小
    img = inception_v3.preprocess_input(img)#将图像格式转换为Inception V3模型能够处理的张量
    return img

def deprocess_image(x): #通用函数,将一个张量转换为有效图像
    if K.image_data_format() == ‘channels_first‘:
        x = x.reshape((3,x.shape[2],x.shape[3]))
        x = x.transpose((1,2,0))
    else:
        x = x.reshape((x.shape[1],x.shape[2],3)) #对inception_v3.preprocess_input所做的预处理进行反向操作
    x /= 2.
    x += 0.5
    x *= 255.
    x = np.clip(x,0,255).astype(‘uint8‘)
    return x

  

#在多个连续尺度上运行梯度上升
import numpy as np

step = 0.01 #步长
num_octave = 3 #运行梯度上升的尺度个数
octave_scale = 1.4 #两个尺度之间的大小比例
iterations = 20 #在每个尺度上运行梯度上升的步数

max_loss = 10. #如果损失增大到大于10,我们要中断梯度上升的过程,以避免得到丑陋的伪影
base_image_path = ‘IU.jpeg‘ #将这个变量修改为你要使用的图像的路径

img = preprocess_image(base_image_path)#将基础图像加载成一个numpy数组

original_shape = img.shape[1:3]
successive_shapes = [original_shape]
for i in range(1,num_octave):
    #准备一个由形状元组组成的列表,它定义了运行梯度上升的不同尺度
    shape = tuple([int(dim/(octave_scale ** i)) for dim in original_shape])
    successive_shapes.append(shape)

successive_shapes = successive_shapes[::-1] #将形状列表反转,变为升序

original_img = np.copy(img)
shrunk_original_img = resize_img(img,successive_shapes[0])#将图像numpy数组的大小缩放到最小尺寸

for shape in successive_shapes:
    print(‘Processing image shape‘,shape)
    img = resize_img(img,shape)#将梦境图像放大
    img = gradient_ascent(img,
                         iterations = iterations,
                         step = step,
                         max_loss = max_loss)
    upscaled_shrunk_original_img = resize_img(shrunk_original_img,shape)
    same_size_original = resize_img(original_img,shape)
    lost_detail = same_size_original - upscaled_shrunk_original_img

    img += lost_detail
    shrunk_original_img = resize_img(original_img,shape)
    save_img(img,fname=‘dream_at_scale_‘+str(shape)+‘.png‘)

save_img(img,fname=‘final_dream.png‘)

训练损失:

原图 效果图

原文地址:https://www.cnblogs.com/nxf-rabbit75/p/10012317.html

时间: 2024-11-06 13:32:55

4.keras实现-->生成式深度学习之DeepDream的相关文章

人工智能AI:Keras PyTorch MXNet 深度学习实战(不定时更新) 𗶽

原文: http://blog.gqylpy.com/gqy/415 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

从零开始学会GAN 1:第一部分 介绍生成式深度学习(连载中)

生成模型的框架 让我们从两维开始玩生成模型游戏. 我选择了一条规则,用于生成图1-4中的X点集.我们称这个规则为pdata. 您面临的挑战是在空间中选择不同的数据点x =(x1,x2),使它看起来是由同一规则生成的. 图1-4 由一个未知规则pdata生成的一组二维点 你在哪里选择呢? 呢可能使用你对现有数据点的了解来构建心理模型pmodel,该模型可能更容易找到空间中的位置. 在这方面,pmodel是pdata的估计值. 也许你认为pmodel应该如图1-5所示 - 一个可以找到点的矩形框,以

[AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建

这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).windows上该环境的搭建 :) 前面三篇博客代码实现均基于该环境(开发或者测试过): [AI开发]Python+Tensorflow打造自己的计算机视觉API服务 [AI开发]基于深度学习的视频多目标跟踪实现 [AI开发]视频多目标跟踪高级版 运行环境 1) centOS 7.5 ,不要安装GUI桌面:

Python深度学习 deep learning with Python 人民邮电出版社

内容简介 本书由Keras之父.现任Google人工智能研究员的弗朗索瓦?肖莱(Fran?ois Chollet)执笔,详尽介绍了用Python和Keras进行深度学习的探索实践,涉及计算机视觉.自然语言处理.生成式模型等应用.书中包含30多个代码示例,步骤讲解详细透彻.由于本书立足于人工智能的可达性和大众化,读者无须具备机器学习相关背景知识即可展开阅读.在学习完本书后,读者将具备搭建自己的深度学习环境.建立图像识别模型.生成图像和文字等能力. 作者简介 [作者简介] 弗朗索瓦?肖莱(Fran?

深度学习性能提升的诀窍

深度学习性能提升的诀窍[转载] 原文: How To Improve Deep Learning Performance 作者: Jason Brownlee 提升算法性能的想法 这个列表并不完整,却是很好的出发点.我的目的是给大家抛出一些想法供大家尝试,或许有那么一两个有效的方法.往往只需要尝试一个想法就能得到提升.我把这个列表划分为四块: · 从数据上提升性能 · 从算法上提升性能 · 从算法调优上提升性能 · 从模型融合上提升性能 性能提升的力度按上表的顺序从上到下依次递减.举个例子,新的

提升深度学习模型的表现,你需要这20个技巧

提升深度学习模型的表现,你需要这20个技巧 标签: 深度学习 2016-09-24 21:28 6650人阅读 评论(0) 收藏 举报  分类: 深度学习(4)  选自machielearningmastery 机器之心编译 作者:Jason Brownlee 参与:杜夏德.陈晨.吴攀.Terrence.李亚洲 本文原文的作者 Jason Brownlee 是一位职业软件开发者,没有博士学位的他通过「从应用中学习」的方法自学了机器学习,他表示对帮助职业开发者应用机器学习来解决复杂问题很有热情,也

Keras版Faster-RCNN代码学习(IOU,RPN)1

最近开始使用Keras来做深度学习,发现模型搭建相较于MXnet, Caffe等确实比较方便,适合于新手练手,于是找来了目标检测经典的模型Faster-RCNN的keras代码来练练手,代码的主题部分转自知乎专栏Learning Machine,作者张潇捷,链接如下: keras版faster-rcnn算法详解(1.RPN计算) keras版faster-rcnn算法详解 (2.roi计算及其他) 我再对代码中loss的计算,config的设置等细节进行学习 Keras版Faster-RCNN代

主流的深度学习框架基本知识

本章内容 1.TensorFlow 2.Keras 3.MXNet 4.CNTK 5.PyTorch 常见的深度学习框架 常见的深度学习框架有 TensorFlow .Caffe.Theano.Keras.PyTorch.MXNet等,如下图所示.这些深度学习框架被应用于计算机视觉.语音识别.自然语言处理与生物信息学等领域,并获取了极好的效果.下面将主要介绍当前深度学习领域影响力比较大的几个框架, 1.TensorFlow-----擅长推断特征提取 2015年11月10日,Google宣布推出全

深度 | 提升深度学习模型的表现,你需要这20个技巧(附论文)

深度 | 提升深度学习模型的表现,你需要这20个技巧(附论文) 2018-04-15 19:53:45 JF_Ma 阅读数 296更多 分类专栏: 机器学习 深度 | 提升深度学习模型的表现,你需要这20个技巧(附论文) 2016-09-23 机器之心 选自machielearningmastery 机器之心编译 作者:Jason Brownlee 参与:杜夏德.陈晨.吴攀.Terrence.李亚洲 本文原文的作者 Jason Brownlee 是一位职业软件开发者,没有博士学位的他通过「从应用