算法简介

DeepDream是Google在2015年发出的一个比较好玩的算法。它的本意是去可视化神经网络。其思想简介就是,对于深度学习,以图片分类为例,我们最终的网络可以识别图像,是因为在训练过程中不断改变网络的参数值。那么我们能不能用已经训练好的网络去改变图片,使得网络相信该图片属于哪一类。听上去好像是可行的。
最终的效果就是,输入图片有点像某类的特征的地方会越来越明显。

Tips

1.需要将多层的过滤器激活同时最大化
具体做法:对一组靠近顶部的层激活的L2范数进行加权求和
2.输入图像在不同的尺度上进行处理
具体做法:每次在当前尺寸运行梯度上升后,将得到的图像放大40%

代码

from keras.applications import inception_v3
from keras import backend as K
import numpy as np
import scipy
from keras.preprocessing import imageK.set_learning_phase(0) #禁止所有与训练有关的操作
model = inception_v3.InceptionV3(weights = 'imagenet', include_top = False)
#构建不包含全连接层的Inception V3网络,使用在ImageNet权重上预训练的模型#选择哪些层将其激活最大化,将他们的影响设一个权重值,靠近底部的层生成内容抽象,靠近顶部的层生成内容具体
layer_contributions = {'mixed2' : 0.2, 'mixed3' : 3., 'mixed4' : 2., 'mixed5' : 1.5}layer_dict = dict([(layer.name, layer) for layer in model.layers]) #将层的名字映射为层的实例loss = K.variable(0.) #定义损失函数的Variablefor 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, :])) / scalingdream = 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)
#返回损失值和梯度值
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
#梯度上升算法
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:breakprint('...Loss value as', i, ':', loss_value)x += step * grad_valuesreturn x#修改图片大小
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)
#转换为Inception V3能够处理的张量
def preprocess_image(image_path):img = image.load_img(image_path)img = image.img_to_array(img)img = np.expand_dims(img, axis=0)img = inception_v3.preprocess_input(img)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))x /= 2.x += 0.5x *= 255.x = np.clip(x, 0, 255).astype('uint8')return xstep = 0.1 #梯度上升的步长
num_octave = 3 #运行梯度上升的尺度个数
octave_scale = 1.4 #两个尺度之间大小比例
iterations = 20 #在每个尺度上运行梯度上升的步数max_loss = 10 #损失最大范围,避免丑陋伪影base_image_path = 'original.png'img = preprocess_image(base_image_path) #图像转为numpy格式
original_shapes = img.shape[1:3] #存放原始图片的大小
successive_shapes = [original_shapes]#形状列表存放运行梯度上升时不同的图片尺度(每次是上一次的octave_scale倍)
for i in range(1, num_octave):shape = tuple([int(dim / (octave_scale ** i)) for dim in original_shapes])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 = 'drean_at_scale_' + str(shape) + '.png') #保存图片save_img(img, fname='final_dream.png')

最终效果:


改了一下层,使用更偏顶部的层后,大型车祸现场。
有兴趣的可以多试几个。

layer_contributions = {'conv2d_85' : 0.2, 'mixed9_0' : 3., 'mixed9' : 2., 'mixed9_1' : 1.5}

参考

Tensorflow实现

Python深度学习(8):DeepDream相关推荐

  1. Python深度学习之DeepDream

    Deep Learning with Python 这篇文章是我学习<Deep Learning with Python>(第二版,François Chollet 著) 时写的系列笔记之 ...

  2. Python深度学习(DeepDream)--学习笔记(十九)

    8.2 DeepDream DeepDream是一种艺术性的图像修改技术,它用到了卷积神经网络学到的表示.DeepDream由Google于2015年夏天首次发布,使用Caffe深度学习库编写实现.它 ...

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

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

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

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

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

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

  6. 【深度学习】DeepDream的实现

    问题描述: 用keras实现DeepDream.我们将从一个在 ImageNet 上预训练的卷积神经网络开始.本次选择的模型是Inception模型 实现步骤: 下载数据集和设置DeepDream配置 ...

  7. Python深度学习:基于TensorFlow

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

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

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

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

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

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

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

最新文章

  1. 15篇论文全面概览BERT压缩方法
  2. 【CV夏季划】2021年冲刺CV秋招,100余课时从理论基础到进阶实践系统掌握
  3. 探索多媒体开发最新最佳实践,我们在深圳等你
  4. 使用showMessageDialog显示消息框
  5. linux mysql 建索引_MySQL在创建索引之前一定要想到的事情
  6. bat怎么发起网络请求_因为一个跨域请求,我差点丢了饭碗
  7. Git详解(2)——Git基础
  8. JavaScript笔记
  9. Hybrid App的架构
  10. 怎样购买及安装ssl安全证书
  11. 下载bilibili视频
  12. 期货穿仓和爆仓有何区别?
  13. SRC挖掘信息收集之JS文件中的秘密
  14. php lumen auth,Lumen实现用户注册登录认证
  15. Vue 设置背景图片
  16. 使用计算机控制台方法,电脑打开控制面板的几种方法
  17. html fmt转换日期格式,JSP JSTL fmt:parseDate标签:转换为时间
  18. word样式和多级列表设置技巧(二)
  19. 全国计算机二级考试上机试题,全国计算机二级《C++》上机试题附答案
  20. 面试问题1 谈谈你对加班的看法

热门文章

  1. Exception in thread main com.alibaba.fastjson.JSONException: create asm serializer error
  2. 这可能是简易的机器学习入门(小白必读)
  3. 记事本写的html文件保存到c:\inetpub\wwwroot失败
  4. chrome无法加载图片
  5. php 支付宝 扫码 源码,PHP微信扫码+PHP支付宝源码
  6. HTML下拉列表的左右选择
  7. 微信小程序分享卡片(一秒钟学会)
  8. VS错误提示:C4996 解决方法
  9. Matlab模拟登陆网页,转:使用matlab自动登录网站(人人网、新浪微博)代码
  10. 现阶段有50万资金,想去开一个店,从事什么行业好?