news 2026/4/18 5:14:13

生成式深度学习(DeepDream)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
生成式深度学习(DeepDream)

DeepDream

DeepDream 是一种艺术性的图像修改技术,它使用了卷积神经网络学到的表示。DeepDream
由谷歌于2015 年夏天首次发布,利用Caffe 深度学习库编写实现(比TensorFlow 首次公开发布还
要早几个月)a。它很快在互联网上引起了轰动,这要归功于它所生成的迷幻图片(示例可参见图
12-4),图片中充满了算法生成的错觉式伪影、鸟的羽毛和狗的眼睛。这是DeepDream 卷积神经网
络在ImageNet 上训练的副作用,因为ImageNet 中狗和鸟的样本占了很大比例。

DeepDream 算法与第9 章介绍的卷积神经网络滤波器可视化技术几乎相同,二者都是反向
运行卷积神经网络:对卷积神经网络的输入做梯度上升,以便将卷积神经网络靠近顶部某一层
的某个滤波器的激活值最大化。DeepDream 的原理与之相似,但有以下几点简单的区别。

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

用Keras 实现DeepDream

我们首先获取一张用于DeepDream 的测试图像。我们使用美国北加州冬季崎岖海岸的景色,
如代码清单12-9 和图12-5 所示。

代码清单12-9 获取测试图像

fromtensorflowimportkerasimportmatplotlib.pyplotasplt base_image_path=keras.utils.get_file("coast.jpg",origin="https://img-datasets.s3.amazonaws.com/coast.jpg")plt.axis("off")plt.imshow(keras.utils.load_img(base_image_path))


接下来,我们要使用预训练卷积神经网络。Keras 中有许多这样的卷积神经网络,如VGG16、
VGG19、Xception、ResNet50 等,它们的权重都是在ImageNet 上预训练得到的。你可以用任意
一个来实现DeepDream,但你选择的基模型会影响可视化效果,因为不同的模型架构会学到不
同的特征。在最初发布的DeepDream 中,使用的卷积神经网络是Inception 模型。在实践中,人
们已经知道Inception 能够生成漂亮的DeepDream 图像,所以我们将使用Keras 内置的Inception
V3 模型,如代码清单12-10 所示。

代码清单12-10 将预训练的InceptionV3 模型实例化

fromtensorflow.keras.applicationsimportinception_v3 model=inception_v3.InceptionV3(weights="imagenet",include_top=False)

我们使用预训练卷积神经网络来创建一个特征提取器模型,返回各中间层的激活值,如代
码清单12-11 所示。对于每一层,我们选定一个标量值,用于加权该层对损失的贡献,我们试图
在梯度上升过程中将这个损失最大化。如果你想获得层名称的完整列表,以选择要处理哪些层,
只需使用model.summary()。

代码清单12-11 设置每一层对DeepDream 损失的贡献大小


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

代码清单12-12 DeepDream 损失


下面来设置在每个八度上运行的梯度上升过程,如代码清单12-13 所示。你会发现,它与
第9 章的滤波器可视化技术是一样的。DeepDream 算法只是多尺度的滤波器可视化。

代码清单12-13 DeepDream 梯度上升过程


最后是DeepDream 算法的外层循环。首先,我们定义一个列表,其中包含处理图像的尺
度(也叫八度)。我们将在3 个“八度”上处理图像。对于从小到大的每个八度,我们将利用
gradient_ascent_loop() 运行20 次梯度上升步骤,以便将前面定义的损失最大化。在每个
八度之间,我们将图像放大40%(也就是放大到1.4 倍),也就是说,首先处理小图像,然后逐
渐增大图像尺寸,如图12-6 所示。


我们还需要几个实用函数来加载和保存图像,如代码清单12-14 所示。

代码清单12-14 图像处理函数


外层循环如代码清单12-15 所示。为避免在每次放大后丢失大量图像细节(导致图像越来
越模糊或像素化),我们可以使用一个简单的技巧:在每次放大后,将丢失的细节重新注入图像
中。这种方法之所以可行,是因为我们知道原始图像放大到这个尺度应该是什么样子。给定较
小的图像尺寸S 和较大的图像尺寸L,我们可以计算出将原始图像调整为L 与将原始图像调整
为S 之间的差异,这个差异可以定量描述从S 到L 的细节损失。

代码清单12-15 在多个连续的“八度”上运行梯度上升

注意 由于原始Inception V3 网络是为识别299 × 299 图像中的概念而训练的,而上述过程将图像尺
寸缩小了一定比例,因此DeepDream 实现对于尺寸在300 × 300 和400 × 400 之间的图像能
够得到更好的结果。但不管怎样,你都可以在任意尺寸和任意比例的图像上运行同样的代码。

在GPU 上运行代码只需几秒。在测试图像上的梦境效果如图12-7 所示。

我强烈建议你改变在损失中所使用的层,从而探索各种可能得到的结果。神经网络中更靠
近底部的层包含更加局部、不太抽象的表示,得到的梦境图案看起来更像是几何图形。更靠近
顶部的层能够得到更容易识别的视觉图案,这些图案都基于ImageNet 中最常见的对象,比如狗
的眼睛、鸟的羽毛等。你可以随机生成layer_settings 字典中的参数,快速探索不同的层组
合。对于一张自制美味糕点的图像,利用不同的层设置所得到的一系列结果如图12-8 所示。

完整代码

importnumpyasnpimporttensorflowastffromtensorflowimportkerasfromtensorflow.keras.applicationsimportinception_v3importmatplotlib.pyplotasplt# 最简单的DeepDream实现defsimple_deepdream_test():print("测试DeepDream...")# 1. 加载图像try:image_path=keras.utils.get_file("coast.jpg",origin="https://img-datasets.s3.amazonaws.com/coast.jpg")print(f"下载图像到:{image_path}")except:print("无法下载图像,请检查网络连接")return# 2. 加载和显示原始图像img=keras.utils.load_img(image_path,target_size=(300,400))img_array=keras.utils.img_to_array(img)img_array=np.expand_dims(img_array,axis=0)plt.figure(figsize=(8,6))plt.imshow(img)plt.title('原始图像')plt.axis('off')plt.show()# 3. 加载模型model=inception_v3.InceptionV3(weights='imagenet',include_top=False)# 4. 选择层(简化版本只用一个层)layer_name='mixed4'layer=model.get_layer(layer_name)# 创建模型输出指定层的激活dream_model=keras.Model(inputs=model.input,outputs=layer.output)# 5. 预处理图像preprocessed_img=inception_v3.preprocess_input(img_array.copy())# 6. 计算激活和梯度withtf.GradientTape()astape:tape.watch(preprocessed_img)activations=dream_model(preprocessed_img)loss=tf.reduce_mean(activations)# 计算梯度grads=tape.gradient(loss,preprocessed_img)# 7. 标准化梯度并更新图像grads/=tf.math.reduce_std(grads)+1e-8preprocessed_img+=grads*0.1preprocessed_img=tf.clip_by_value(preprocessed_img,-1.0,1.0)# 8. 反处理图像result=preprocessed_img.numpy()result=result.reshape((300,400,3))result/=2.0result+=0.5result*=255.0result=np.clip(result,0,255).astype('uint8')# 9. 显示结果plt.figure(figsize=(10,5))plt.subplot(1,2,1)plt.imshow(img)plt.title('原始图像')plt.axis('off')plt.subplot(1,2,2)plt.imshow(result)plt.title('DeepDream效果(单次迭代)')plt.axis('off')plt.tight_layout()plt.show()print("测试完成!")if__name__=="__main__":simple_deepdream_test()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:36:01

OpCore Simplify:终极Hackintosh EFI自动化配置解决方案

OpCore Simplify:终极Hackintosh EFI自动化配置解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCore配置而烦恼吗…

作者头像 李华
网站建设 2026/4/18 5:32:55

26、Samba 命令与守护进程使用指南

Samba 命令与守护进程使用指南 1. Samba 程序概述 Samba 是一套让 Unix/Linux 系统能够与 Windows 系统进行文件和打印机共享的软件。它包含多个程序,每个程序都有特定功能和命令行参数。 2. smbd 程序 功能 :提供 Samba 的文件和打印机服务,为每个客户端使用一个 TCP/…

作者头像 李华
网站建设 2026/4/18 5:36:02

FF14快速启动器完全使用指南:从新手到专家的简单教程

FF14快速启动器完全使用指南:从新手到专家的简单教程 【免费下载链接】FFXIVQuickLauncher Custom launcher for FFXIV 项目地址: https://gitcode.com/GitHub_Trending/ff/FFXIVQuickLauncher FF14快速启动器(XIVLauncher)是专为《最…

作者头像 李华
网站建设 2026/4/14 16:20:06

Llama 3.3 70B模型推理异常:从诊断到优化的完整技术路线

Llama 3.3 70B模型推理异常:从诊断到优化的完整技术路线 【免费下载链接】text-generation-inference text-generation-inference - 一个用于部署和提供大型语言模型(LLMs)服务的工具包,支持多种流行的开源 LLMs,适合需…

作者头像 李华
网站建设 2026/4/18 5:18:04

中药材图像识别与分类 RetinaNet-R101-FPN模型详解

1. 中药材图像识别与分类 RetinaNet-R101-FPN模型详解 🌿 中药材识别是中医药现代化的重要环节,传统识别方法依赖专家经验,效率低下且易受主观因素影响。随着深度学习技术的发展,基于计算机视觉的中药材自动识别系统成为研究热点…

作者头像 李华
网站建设 2026/4/15 5:57:12

RomM终极API密钥配置指南:快速打造专业游戏库

RomM终极API密钥配置指南:快速打造专业游戏库 【免费下载链接】romm A beautiful, powerful, self-hosted rom manager 项目地址: https://gitcode.com/GitHub_Trending/rom/romm 想要让你的RomM游戏库管理工具发挥最大威力?正确的API密钥配置是关…

作者头像 李华