Deep Dream模型

Deep Dream是Google公司在2015年公布的一项有趣的技术,在训练好的神经个网络中,只需要设定几个参数就可以通过这项技术生成一张图像,生出的图像不仅令人印象深刻,还能帮助我们更好的理解神经网络的运行机制。

1生成原始的Deep Dream图像

原始的DeepDream模型只需要优化ImageNet模型卷积层某个通道的激活值就可以了,因此应在TensorFlow中导入一个ImageNet图像识别模型,本文以Inception模型进行实验。

代码如下:

#导入要用到的基本模块
from __future__ import print_function
import tensorflow as tf
import os
from io import BytesIO
import numpy as np
from functools import partial
import PIL.Image
import scipy.misc
import tensorflow as tf

#创建图和会话
graph = tf.Graph()
sess = tf.InteractiveSession(graph=graph)

#tensorflow_inception_graph.pb文件中,既存储了inception的网络结构,也存储了对应的数据
#使用下面的语句将其导入
model_fn = 'tensorflow_inception_graph.pb'
with tf.gfile.FastGFile(model_fn,'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
#定义t_input为输入图像
t_input = tf.placeholder(np.float32,name = 'input')
imagenet_mean = 170.0
#输入图像需要经过处理才能送入网络中
#expand_dims是加一维,从[height,width,hannel]变成[1,heigh,width,channel]
#t_input-imagenet_mean是减去一个均值
t_preprocessed = tf.expand_dims(t_input-imagenet_mean,0)
tf.import_graph_def(graph_def,{'input':t_preprocessed})

def savearray(img_array,img_name):
    scipy.misc.toimage(img_array).save(img_name)
    print('img saved: %s'%img_name)

def  render_naive(t_obj,img0,iter_n=20,step=1.0):
    #t_score是优化目标。它是t_obj的平均值
    #结合调用处看,实际上就是layer_output[:,:,:,channel]的平均值
    t_score=tf.reduce_mean(t_obj)
    #计算t_score对t_input的梯度
    t_grad=tf.gradients(t_score,t_input)[0]


    #创建新图
    img=img0.copy()
    for i in range(iter_n):
        #在sess中计算梯度,以及当前的score
        g,score=sess.run([t_grad,t_score],{t_input:img})
        #对img应用梯度,step合一看做”学习率“
        g/=g.std()+1e-8
        img+=g*step
        print('score(mean)=%f'%(score))
    #保存图片
    savearray(img,'chapter4-2.jpg')


#定义卷积层、通道数,并取出对应的Tensor
name = 'mixed4d_3x3_bottleneck_pre_relu'
channel = 139
layer_output = graph.get_tensor_by_name("import/%s:0"%name)

#定义原始图像的通噪声
img_noise = np.random.uniform(size=(224,224,3))+100.0
#调用render_naive函数渲染
render_naive(layer_output[:,:,:,channel],img_noise,iter_n=20)

运行完之后,会得到类似下面的输出:


说明score(也就是卷积层对应通道的平均值)确实是按照期望逐渐增大的。经过20次迭代之后,会把图片保存为chapter4-2.jpg,如下图所示


以上就是通过最大化某一通道的平均值得到的图像,此处图像生成的效果好不太好,下面会生成更加精美的Deep Dream。

2生成更大尺寸的Deep Dream图像

要生成的图片越大,就会占越大的内存,若想生成更大的图片,就会因为内存不够而导致渲染失败。为了避免这个问题,每次不对整张图片做优化,而是把图片分成几个部分,每次只对其中的一部分做优化,这样每次优化时只消耗固定的内存。这个程序中的函数calc_grad_titled可以对任意大小的图像计算梯度。代码如下:

#导入要用到的基本模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值