Deep Dream 模型

本文介绍了如何使用TensorFlow实现Deep Dream技术,通过优化Inception模型的卷积层通道激活值生成图像。首先,导入Inception模型,然后通过梯度下降法最大化特定通道的平均值以生成图像。接着,通过分块处理解决大尺寸图像优化时的内存问题。此外,还介绍了如何生成更高质量的图像,利用高斯和拉普拉斯金字塔以及梯度标准化提升图像的低频成分,使图像更加柔和。最后,展示了如何结合背景图像生成更复杂的Deep Dream效果。
摘要由CSDN通过智能技术生成

Deep Dream 是 Google 公司在 2015 年公布的一项有趣的技术 。本文通过极大化卷积层某个通道的平均值来生成图像 , 并学习了如何生成更大尺寸和更高质量的图像。

 

1、导入 Inception模型

原始的 Deep Dream模型只需要优化 ImageNet模型卷积层某个通道的激活值就可以了 , 为此应该先在 TensorFlow导入一个 ImageNet图像识别模型 。 这里以 Inception 模型为例进行介绍 , 新建文件 load_inception.py。

# 引入基本模块
from __future__ import print_function # 兼容print的py2、py3版本
import numpy as np
import tensorflow as tf

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

TensorFlow 提供了一种特殊的以“.pb”为扩展名的文件,可以事先将模型导入到pb 文件中,再在需要的时候导出 。对于 Inception 模型,对应的 pb 文件为 tensorflow_inception_graph.pb。使用下面的程序就可以把 Inception 模型导入TensorFlow 中。tensorflow_inception_graph.pb文件中,既存储了inception网络结构,也存储了数据。

# 导入inception模块
file_name = 'tensorflow_inception_graph.pb'
with tf.gfile.FastGFile(file_name,'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())

# 输入数据占位符
input_data = tf.placeholder(np.float32,name='input_data')

# 数据预处理,去均值,增加维数
mean_value = 117.0
data_processed = tf.expand_dims(input_data - mean_value, 0)

# 导入模型
tf.import_graph_def(graph_def,{'input_data':data_processed})

为什么要增加维数呢?因为格式(height, width, channel)只能表示一张图片,但在训练神经网络时往往需要同时送入多张国片,因此在前面加了一维,让输入图像的格式变为(batch, height, width, channel),这符合Inception模型需要的输入格式。

为什么要去均值呢?因为在训练 Inception 模型的时候,已经做了减去均值的预处理,因此应该使用同样的预处理方法,才能保持输入的一致 。 此处使用的 Inception 模型减去的是一个固定的均值 117,所以在程序中也定义 7 imagenet_mean= 117,并 用 t_input 减去 imagenet_mean。

 

2、生成图像

新建文件gen_naive.py,首先导入inception模型,同上述一致。

# 引入基本模块
from __future__ import print_function # 兼容print的py2、py3版本
import numpy as np
import tensorflow as tf
import scipy

# 创建图和会话
graph = tf.Graph()
sess = tf.InteractiveSession(graph=graph)
# 导入inception模块
file_name = 'tensorflow_inception_graph.pb'
with tf.gfile.GFile(file_name,'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
# 输入数据占位符
input_data = tf.placeholder(np.float32,name='t_input')
# 数据预处理,去均值
mean_value = 117.0
data_processed = tf.expand_dims(input_data - mean_value, 0)
# 导入模型
tf.import_graph_def(graph_def,{'input': data_processed})

新建一个保存图片函数,将numpy.ndarray保存为文件的形式

# 保存图像
def save_image(image_array,image_name):
    scipy.misc.toimage(image_array).save(image_name)
    print("%s saved" % image_name)

将mixed4d_3x3_bottleneck_pre_relu层的输出,任意选择一个通道作为优化目标;再用均匀分布定义一个原始图像,表示优化起点

# 得到 mixed4d_3x3_bottleneck_pre_relu层channel通道的输出,作为训练目标
name = 'mixed4d_3x3_bottleneck_pre_relu'
channel = 139 # 共144个通道,此处随机选择一个通道进行调整
layer_output = graph.get_tensor_by_name('import/%s:0' % name)
# 输入图像初始化
img_init = np.random.uniform(size=[224,224,3])+100.0

定义训练函数

# 训练
def train(t_obj,t_img,iter_n=20,lr=1.0):
    # 优化目标 t_score是 t_obj 的平均值 。t_score越大 , 就说明神经网络卷积层对应通道的平均激活越大 。
    t_score = tf.reduce_mean(t_obj)
    # 梯度
    t_grad = tf.gradients(t_score,input_data)[0]

    img = t_img.copy()
    for i in range(iter_n):
        grad,score = sess.run([t_grad,t_score],{input_data:img})
        grad /= grad.std() + 1e-8
        img += grad * lr # 将梯度运用到图像上
### 回答1: DeepDream是一种基于卷积神经网络(CNN)的图像生成算法,它通过最大限度地放大和突出图像中的纹理和模式来创建视觉上令人印象深刻的效果。 DeepDream实验最初由谷歌的工程师团队开发,目的是通过调整神经网络的内部表征来探索CNN的视觉感知能力。该算法通过多次沿着梯度逆向传播过程,将原始图像输入网络并反向增加网络的激活,使网络将注意力更多地放在它认为重要的特征上。经过多次迭代,图像逐渐被改造为充满了独特纹理和特征的幻觉般的形象。 通过DeepDream实验,我们可以发现神经网络在图像识别中使用的内部表征。例如,当我们输入一张狗的照片时,DeepDream会突出给定图像中与狗相关的纹理和特征,例如狗的眼睛、耳朵和毛发。但是,DeepDream不仅仅适用于狗的图像,它可以用于任何图像,从风景照片到抽象艺术作品。 DeepDream实验展示了深度学习算法的创造力和潜力。它不仅仅用于图像生成,还可以用于图像增强和创意艺术。DeepDream的效果被广泛运用在电影、音乐视频和艺术展览中,给人们带来了视觉上的震撼和惊喜。 总的来说,DeepDream实验是一种利用神经网络调整图像表征的方法,通过突出图像的纹理和特征来产生视觉上令人印象深刻的效果。它展示了深度学习的创造力和潜力,并广泛应用于艺术和视觉媒体领域。 ### 回答2: DeepDream是一种基于人工智能的图像处理技术。该技术利用神经网络来识别和分析图像中的不同特征,并将这些特征通过算法进行处理,生成独特的图像效果。 DeepDream的实验过程可以大致分为以下几个步骤:首先,选择一张输入图像,这可以是一张普通的照片或图画;然后,通过一个已经训练好的卷积神经网络对输入图像进行多次迭代处理,来寻找图像中的模式和特征;接下来,将网络中的某些特定层运用到输入图像上,运用梯度上升算法来放大并强调这些特征;最后,将处理后的图像输出,并通过重复这一过程来不断改进结果。 DeepDream实验的独特之处在于,它不仅仅是一种图像处理技术,更是一种艺术创作的工具。通过对图像的重复处理与调整,DeepDream可以生成奇幻、幻觉般的图像效果,不仅仅是图像的艺术变现,还可以通过这一过程来探索和观察神经网络的工作方式和特性。 此外,DeepDream实验还可以应用于图像识别的改进和优化。通过这一技术,可以发现并加强神经网络对图像中的细节和特征的关注,从而提高图像识别的准确率和精度。同时,在医学图像分析、视觉艺术、图像生成等领域也有广泛的应用。 总的来说,DeepDream实验是一种将人工智能与图像处理相结合的创新技术,具有独特的艺术创作和图像识别优化的应用潜力。 ### 回答3: Deepdream是一种基于人工智能技术的图像生成实验,它源自Google开发的深度学习算法。Deepdream通过对现有图像进行多次重复改造,创造出一种另类的图像效果,以探索并揭示神经网络的工作方式。 Deepdream实验首先需要选择一个输入图像,可以是任何一张照片或图片。然后,通过预训练的神经网络模型,将这张图像输入到算法中。算法会对图像进行分析,并逐步改变图像的像素值,以便在图像中寻找和增强神经网络最敏感的特征。 在Deepdream实验中,会对图像进行多次迭代,每次迭代都会对图像进行微小调整。通过调整图像的像素值,使其与最敏感的神经网络特征更相似。经过多次迭代,图像中原本存在的部分特征会被放大和强调,最终生成出一幅视觉上令人难以置信的图像。 这种实验的结果往往呈现出千奇百怪的特效,令人惊叹不已。它可以使普通的图像转变成充满幻想和艺术感的作品。通过Deepdream实验,我们可以更好地理解和观察神经网络的工作方式,探索其内部所学到的知识,同时也能够激发创造力,提供一个新的艺术表现形式。 总而言之,Deepdream实验是一种利用深度学习算法对图像进行改造和增强的创新实践。它不仅能够改变图像的外观,还能够揭示出神经网络的内在特征,为我们了解和探索人工智能提供了更加直观和生动的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值