news 2026/5/7 14:01:05

生成式深度学习(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/5/1 4:51:47

10、Samba网络配置、虚拟服务器与日志管理全解析

Samba网络配置、虚拟服务器与日志管理全解析 1. Samba网络配置选项 当在多宿主机器(即连接多个子网的机器)上运行Samba,或者想在自己的子网实施安全策略时,需要仔细研究网络配置选项。 假设Samba服务器连接到多个子网,如能访问192.168.220. 和134.213.233. 子网,以下…

作者头像 李华
网站建设 2026/5/5 15:56:11

13、Samba 文件命名与锁定机制详解

Samba 文件命名与锁定机制详解 1. 文件命名规则差异 在早期的 DOS 和 Windows 3.1 系统中,文件名被限制为 8.3 格式,即八个大写字符后跟一个点,再加上三个大写字符,这给用户带来了极大的不便。随着技术的发展,Windows 95/98、Windows NT 和 Unix 等系统放宽了这一限制,…

作者头像 李华
网站建设 2026/5/1 0:38:51

Apollo桌面流媒体:重新定义您的远程桌面体验

Apollo桌面流媒体:重新定义您的远程桌面体验 【免费下载链接】Apollo Sunshine fork - The easiest way to stream with the native resolution of your client device 项目地址: https://gitcode.com/gh_mirrors/apollo18/Apollo 还在为远程桌面连接卡顿、画…

作者头像 李华
网站建设 2026/5/7 10:21:31

24、Samba的SSL配置与性能调优指南

Samba的SSL配置与性能调优指南 1. SSL代理设置 SSL代理程序可作为独立二进制文件或源代码获取,可从 http://obdev.at/Products/sslproxy.html 下载。以下为在Windows NT系统上配置的步骤: 1. 下载文件 :下载适用于Windows NT的二进制文件后,指定目录下应包含以下文件…

作者头像 李华
网站建设 2026/5/4 23:37:17

25、Samba性能调优与配置指南

Samba性能调优与配置指南 1. Samba服务器规模确定 在Samba服务器的使用中,确定服务器规模是预防性能瓶颈的关键。其核心在于了解客户端每秒所需的请求数量或每秒所需的千字节数,并确保服务器的所有组件都能满足这些需求。 1.1 潜在瓶颈分析 CPU :对于大多数机器而言,C…

作者头像 李华
网站建设 2026/5/3 9:28:28

从零构建智能仪表盘,R Shiny多模态交互核心技术全解析

第一章:从零构建智能仪表盘,R Shiny多模态交互核心技术全解析在数据驱动决策的时代,构建直观、响应迅速的智能仪表盘成为数据分析的核心需求。R Shiny 作为 R 语言中最强大的 Web 应用框架,能够将静态分析转化为动态交互式可视化系…

作者头像 李华