#DeepDream 是一种艺术性的图像修改技术,它用到了卷积神经网络学到的表示 '''

#DeepDream 算法与前面的卷积神经网络过滤器可视化技术几乎相同,都是反向运行一个cnn:对cnn的输入做梯度上升,以便将cnn靠顶部的某一层的某个过滤器激活最大化。

# 但有几个简单区别:

1.使用 DeepDream,我们尝试将所有层的激活最大化,而不是将某一层的激活最大化,因此需要同时将大量特征的可视化混合在一起。

2.不是从空白的、略微带有噪声的输入开始,而是从现有的图像开始,因此所产生的效果 能够抓住已经存在的视觉模式,并以某种艺术性的方式将图像元素扭曲.

3.输入图像是在不同的尺度上[叫作八度(octave)]进行处理的,这可以提高可视化的质量。 '''

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pylab
from pandas import DataFrame, Series
from keras import models, layers, optimizers, losses, metrics
from keras.utils.np_utils import to_categoricalplt.rcParams['font.sans-serif'] = ['SimHei']  #指定默认字体
plt.rcParams['axes.unicode_minus'] = False  #解决保存图像是负号'-'显示为方块的问题#在实践中,人们已 经知道 Inception 能够生成漂亮的 DeepDream 图像,所以我们将使用 Keras 内置的 Inception V3 模型#加载预训练的Inception V3模型
from keras.applications import inception_v3
from keras import backend as K
from deepdream_img_utils import preprocess_image,save_img,resize_img
# #注意检查数据类型和shape是否一致ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("strided_slice/stack_1:0", shape=(3,), dtype=float32)'K.set_learning_phase(0)#我们不需要训练模型,所以这个命令 会禁用所有与训练有关的操作
model=inception_v3.InceptionV3(weights='imagenet',#使用预训练的 ImageNet权重来加载模型include_top=False)#构建不包括全连接层的 Inception V3网络。
#计算损失(loss),即在梯度上升过程中需要最大化的量。
model.summary()
'''
前面写道的过滤器可视化中,我们试图将某一层的某个过滤器的值最大化。
这里,我们要将多个层的所有过滤器的激活同时最大化。具体来说,就是对一组靠近顶部的层激活的 L2 范数进行加权求和,然后将其最大化。选择哪些层(以及它们对最终损失的贡献)对生成的可视化结果具有很大影响, 所以我们希望让这些参数变得易于配置。更靠近底部的层生成的是几何图案,而更靠近顶部的层生成的则是从中能够看出某些 ImageNet 类别(比如鸟或狗)的图案。我们将随意选择 4 层的 配置,但你以后一定要探索多个不同的配置。
'''
#设置DeepDream配置
layer_contributions={# 'mixed2':0.2,'mixed3':3.,'mixed4':2.,'mixed5':1.5,'mixed7':1.,'mixed9':0.5,
}#根据model.summary()得到对应的层的名称,然后赋予相应的权重#定义需要最大化的损失:上面配置的层激活的L2范数的加权求和
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].outputscaling=K.prod(K.cast(K.shape(activation),'float32'))#K.prod()将张量中的值沿着指定的轴相乘loss+=coeff*K.sum(K.square(activation[:,2:-2,2:-2,:]))/scaling#将该层特征的L2范数添加到loss中。 为了避免出现边界伪影,损失中仅包含非边界的像素#梯度上升过程dream=model.input
grads=K.gradients(loss,dream)[0]
grads/=K.maximum(K.mean(K.abs(grads)),1e-7)#梯度标准化
outputs=[loss,grads]
fetch_loss_and_grads=K.function([dream],outputs)#给定一张输出图像,设置 一个 Keras 函数来获取损失值和梯度值
def eval_loss_and_grads(x):outs=fetch_loss_and_grads([x])loss_value,grad_value=outs[0],outs[1]return loss_value,grad_valuedef 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:breakprint('...Loss value at', i, ':', loss_value)x += step * grad_valuesreturn x#DeepDream算法
'''首先,我们来定义一个列表,里面包含的是处理图像的尺度(也叫八度)。每个连续的尺度都是前一个的 1.4 倍(放大 40%),即首先处理小图像,然 后逐渐增大图像尺寸.对于每个连续的尺度,从最小到最大,我们都需要在当前尺度运行梯度上升,以便将之前 定义的损失最大化。每次运行完梯度上升之后,将得到的图像放大 40%。在每次连续的放大之后(图像会变得模糊或像素化),为避免丢失大量图像细节:每次放大之后,将丢失的细节重新注入到图像中.因为我们知道原始图像放大到这个尺寸应该是什么样子。给定一个较小的图像尺寸S和一个较大的图像尺寸 L,你可以计算将原始图像大小调整为L与将原始图像大小调整为S之间的区别,这个区别可以定量描述从S到L的细节损失
'''#在多个连续尺度上运行梯度上升
step=0.01#梯度上升学习率
num_octave=3#空间处理尺度(八度)的连续放大次数
octave_scale=1.4
iterations=20
max_loss=10.
base_image_path='datasets/timg.jpg'
img=preprocess_image(base_image_path)#(1, height, width, 3)original_shape=img.shape[1:3]#图片尺寸
print(original_shape)#(326, 490)
successive_shapes=[original_shape]for i in range(1,num_octave):#连续2个八度shape=tuple([int(dim/(octave_scale**i)) for dim in original_shape])#缩小图像尺寸1.4倍print(shape)successive_shapes.append(shape)
# print(successive_shapes)#[(326, 490), (232, 350), (166, 250)]
successive_shapes=successive_shapes[::-1]#将形状列表反转,变为升序
print(successive_shapes)
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)#同shape原始图像的高质量版本lost_detail=same_size_original-upscaled_shrunk_original_img#二者差值作为丢失的细节,重新注入到梦境中img+=lost_detailshrunk_original_img=resize_img(original_img,shape)#更新(当前尺度)尺寸save_img(img,fname='datasets/dream_at_scale_'+str(shape)+'.png')#保存当前尺度梦境图像
save_img(img,fname='datasets/final_dream.png')#保存连续三次放大尺度的图像

    ------------>>>>>>生成的图                

DeepDream过程图示:

#因为原始 Inception V3 网络训练识别尺寸为 299×299 的图像中的概念,而上述过程中将 图像尺寸减小很多,所以 DeepDream 实现在尺寸介于 300×300 和 400×400 之间的图像 上能够得到更好的结果。但不管怎样,你都可以在任何尺寸和任何比例的图像上运行同样的代码

python深度学习--DeepDream相关推荐

  1. 《python深度学习》代码中文注释

    <python深度学习>由Keras之父.现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和Keras进行深度学习的探索实 ...

  2. 《python深度学习》学习笔记与代码实现(第八章:8.1,8.2,8.3)

    <python深度学习>第八章:生成式深度学习 8.1 使用LSTM生成文本 给定一个序列,预测下一个或多个标记的概率,从而生成之后的序列 给定前面的标记,能够对下一个标记的概率进行建模的 ...

  3. 粗读《Python 深度学习》(7)

    粗读<Python 深度学习>(7) 第八章 生成式深度学习 8.1 使用 LSTM 生成文本 8.1.1 生成式循环网络简史(略) 8.1.2 如何生成序列数据 8.1.3 采样策略的重 ...

  4. Python深度学习:基于TensorFlow

    作者:吴茂贵,王冬,李涛,杨本法 出版社:机械工业出版社 品牌:机工出版 出版时间:2018-10-01 Python深度学习:基于TensorFlow

  5. Python深度学习:基于PyTorch [Deep Learning with Python and PyTorch]

    作者:吴茂贵,郁明敏,杨本法,李涛,张粤磊 著 出版社:机械工业出版社 品牌:机工出版 出版时间:2019-11-01 Python深度学习:基于PyTorch [Deep Learning with ...

  6. python神经结构二层_《python深度学习》笔记---8.3、神经风格迁移

    <python深度学习>笔记---8.3.神经风格迁移 一.总结 一句话总结: 神经风格迁移是指将参考图像的风格应用于目标图像,同时保留目标图像的内容. 1."神经风格迁移是指将 ...

  7. Python深度学习之搭建小型卷积神经网络(Kaggle网站Dogs-vs-Cats数据集)

    完全来源与<Python深度学习>中的例子,仅供学习只用. Cats vs. Dogs(猫狗大战)是Kaggle大数据竞赛的数据集,数据集由训练数据和测试数据组成,训练数据包含猫和狗各12 ...

  8. python参考手册 豆瓣_python之父亲自撰写两年后豆瓣评分9.8《python深度学习》PDF分享...

    <python深度学习>本书由Keras之父.现任Google人: 工智能研究员的弗朗索瓦.肖莱(Francois Chollet)执笔,详尽介绍了用Python和Keras进行深度学习的 ...

  9. 过拟合解决方法python_《python深度学习》笔记---4.4、过拟合与欠拟合(解决过拟合常见方法)...

    <python深度学习>笔记---4.4.过拟合与欠拟合(解决过拟合常见方法) 一.总结 一句话总结: 减小网络大小 添加权重正则化 添加 dropout 正则化 1.机器学习的根本问题? ...

最新文章

  1. 一个不定宽高的元素如何在父元素中垂直水平居中
  2. 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法
  3. [开发笔记]-页面切图、CSS前端设计、JS
  4. bios是固定在微型计算机上的一块RoM,计算机硬件笔试试题
  5. 使用MVC连接数据库及MVC应用的一般命名
  6. Html中 table,list等表格 中 js 的 Checkbox全选,反选,单选,获取数据选中行 的写法
  7. Linux oracle中文乱码的问题解决
  8. centos7重启后/etc/resolv.conf 被还原解决办法
  9. VC知识库大讲堂C++系列教程(目前最新)
  10. java整人的代码_「vbs代码」vbs表白代码+整人代码,抖音vbscript表白代码 - seo实验室...
  11. delphi中webbrowser的用法
  12. mysql中引号的作用是什么_mysql单引号和双引号的用法
  13. 看不见你的笑我怎么睡得着
  14. 丁香园php岗_你为什么从丁香园离职?
  15. 计算机主板i3 i5区别,装机那些事儿之挑选适合自己的CPU;i3/i5/i7的区别
  16. Arduino 单位数码管实验
  17. 专注做事,竟然也成为我们的稀缺能力
  18. 51单片机:直流电机与步进电机
  19. 限流-漏桶算法、令牌桶算法
  20. mac系统清理软件MacClean支持文件类型分享

热门文章

  1. PyQuery的使用方法
  2. linux cmake 教程,CMake简明教程
  3. Progressive Self-Supervised Attention Learning forAspect-Level Sentiment Analysis论文阅读
  4. android 编译c可执行程序,如何将C编译成可执行二进制文件,并在Android从Android Shell运行它?...
  5. MySQL系列---事务与锁详解
  6. 消费级AR眼镜爆发将近:Rokid+无影突破算力,打造“第三块屏幕”
  7. Ubuntu下工作空间的创立以及思岚系列激光雷达的使用(详细)和驱动安装及地图创建
  8. PC浏览器凌冬已至,移动端才是未来
  9. 深度之眼Pytorch打卡(九):Pytorch数据预处理——预处理过程与数据标准化(transforms过程、Normalize原理、常用数据集均值标准差与数据集均值标准差计算)
  10. 使用Autoware标定工具包联合标定相机和激光雷达