问题描述:

用keras实现DeepDream。我们将从一个在 ImageNet 上预训练的卷积神经网络开始。本次选择的模型是Inception模型

实现步骤:

下载数据集和设置DeepDream配置

from tensorflow import keras
import matplotlib.pyplot as pltbase_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))#instantiating a model
from tensorflow.keras.applications import inception_v3
model = inception_v3.InceptionV3(weights='imagenet',include_top=False)#配置各层对DeepDream损失的贡献
layer_settings = {"mixed4": 1.0,"mixed5": 1.5,"mixed6": 2.0,"mixed7": 2.5,
}
outputs_dict = dict([(layer.name, layer.output)for layer in [model.get_layer(name) for name in layer_settings.keys()]]
)
feature_extractor = keras.Model(inputs=model.inputs, outputs=outputs_dict)

定义最大化的损失和梯度上升过程

#定义损失函数
import tensorflow as tf
def compute_loss(input_image):features = feature_extractor(input_image)loss = tf.zeros(shape=())for name in features.keys():coeff = layer_settings[name]activation = features[name]loss += coeff * tf.reduce_mean(tf.square(activation[:, 2:-2, 2:-2, :]))return loss
#梯度上升过程
@tf.function
def gradient_ascent_step(image, learning_rate):with tf.GradientTape() as tape:tape.watch(image)loss = compute_loss(image)grads = tape.gradient(loss, image)grads = tf.math.l2_normalize(grads)image += learning_rate * gradsreturn loss, imagedef gradient_ascent_loop(image, iterations, learning_rate, max_loss=None):for i in range(iterations):loss, image = gradient_ascent_step(image, learning_rate)if max_loss is not None and loss > max_loss:breakprint(f"... Loss value at step {i}: {loss:.2f}")return image

在多个连续尺度上运行梯度上升

#在多个连续 上运行梯度上升
original_img = preprocess_image(base_image_path)
original_shape = original_img.shape[1:3]successive_shapes = [original_shape]
for i in range(1, num_octave):shape = tuple([int(dim / (octave_scale ** i)) for dim in original_shape])successive_shapes.append(shape)
successive_shapes = successive_shapes[::-1]shrunk_original_img = tf.image.resize(original_img, successive_shapes[0])img = tf.identity(original_img)
for i, shape in enumerate(successive_shapes):print(f"Processing octave {i} with shape {shape}")img = tf.image.resize(img, shape)img = gradient_ascent_loop(img, iterations=iterations, learning_rate=step, max_loss=max_loss)upscaled_shrunk_original_img = tf.image.resize(shrunk_original_img, shape)same_size_original = tf.image.resize(original_img, shape)lost_detail = same_size_original - upscaled_shrunk_original_imgimg += lost_detailshrunk_original_img = tf.image.resize(original_img, shape)keras.utils.save_img("DeepDream.png", deprocess_image(img.numpy()))

图像处理的辅助函数和超参数的设置

#hyperparameters
step = 20.
num_octave = 3
octave_scale = 1.4
iterations = 30
max_loss = 15.#图像处理方面
import numpy as npdef preprocess_image(image_path):img = keras.utils.load_img(image_path)img = keras.utils.img_to_array(img)img = np.expand_dims(img, axis=0)img = keras.applications.inception_v3.preprocess_input(img)return imgdef deprocess_image(img):img = img.reshape((img.shape[1], img.shape[2], 3))img /= 2.0img += 0.5img *= 255.img = np.clip(img, 0, 255).astype("uint8")return img

代码展示:

from tensorflow import keras
import matplotlib.pyplot as pltbase_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))#instantiating a model
from tensorflow.keras.applications import inception_v3
model = inception_v3.InceptionV3(weights='imagenet',include_top=False)#配置各层对DeepDream损失的贡献
layer_settings = {"mixed4": 1.0,"mixed5": 1.5,"mixed6": 2.0,"mixed7": 2.5,
}
outputs_dict = dict([(layer.name, layer.output)for layer in [model.get_layer(name) for name in layer_settings.keys()]]
)
feature_extractor = keras.Model(inputs=model.inputs, outputs=outputs_dict)#定义损失函数
import tensorflow as tf
def compute_loss(input_image):features = feature_extractor(input_image)loss = tf.zeros(shape=())for name in features.keys():coeff = layer_settings[name]activation = features[name]loss += coeff * tf.reduce_mean(tf.square(activation[:, 2:-2, 2:-2, :]))return loss#梯度上升过程
@tf.function
def gradient_ascent_step(image, learning_rate):with tf.GradientTape() as tape:tape.watch(image)loss = compute_loss(image)grads = tape.gradient(loss, image)grads = tf.math.l2_normalize(grads)image += learning_rate * gradsreturn loss, imagedef gradient_ascent_loop(image, iterations, learning_rate, max_loss=None):for i in range(iterations):loss, image = gradient_ascent_step(image, learning_rate)if max_loss is not None and loss > max_loss:breakprint(f"... Loss value at step {i}: {loss:.2f}")return image#hyperparameters
step = 20.
num_octave = 3
octave_scale = 1.4
iterations = 30
max_loss = 15.#图像处理方面
import numpy as npdef preprocess_image(image_path):img = keras.utils.load_img(image_path)img = keras.utils.img_to_array(img)img = np.expand_dims(img, axis=0)img = keras.applications.inception_v3.preprocess_input(img)return imgdef deprocess_image(img):img = img.reshape((img.shape[1], img.shape[2], 3))img /= 2.0img += 0.5img *= 255.img = np.clip(img, 0, 255).astype("uint8")return img#在多个连续 上运行梯度上升
original_img = preprocess_image(base_image_path)
original_shape = original_img.shape[1:3]successive_shapes = [original_shape]
for i in range(1, num_octave):shape = tuple([int(dim / (octave_scale ** i)) for dim in original_shape])successive_shapes.append(shape)
successive_shapes = successive_shapes[::-1]shrunk_original_img = tf.image.resize(original_img, successive_shapes[0])img = tf.identity(original_img)
for i, shape in enumerate(successive_shapes):print(f"Processing octave {i} with shape {shape}")img = tf.image.resize(img, shape)img = gradient_ascent_loop(img, iterations=iterations, learning_rate=step, max_loss=max_loss)upscaled_shrunk_original_img = tf.image.resize(shrunk_original_img, shape)same_size_original = tf.image.resize(original_img, shape)lost_detail = same_size_original - upscaled_shrunk_original_imgimg += lost_detailshrunk_original_img = tf.image.resize(original_img, shape)keras.utils.save_img("DeepDream.png", deprocess_image(img.numpy()))

运行截图:

参考:

《Python深度学习》

参考阅读:

tensorflow官方文档

https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/generative/deepdream.ipynb

【深度学习】DeepDream的实现相关推荐

  1. python深度学习--DeepDream

    #DeepDream 是一种艺术性的图像修改技术,它用到了卷积神经网络学到的表示 ''' #DeepDream 算法与前面的卷积神经网络过滤器可视化技术几乎相同,都是反向运行一个cnn:对cnn的输入 ...

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

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

  3. Python深度学习之DeepDream

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

  4. Python深度学习(8):DeepDream

    算法简介 DeepDream是Google在2015年发出的一个比较好玩的算法.它的本意是去可视化神经网络.其思想简介就是,对于深度学习,以图片分类为例,我们最终的网络可以识别图像,是因为在训练过程中 ...

  5. DeepDream:使用深度学习再造毕加索抽象风格艺术画

    毕加索是近代最成功的艺术家,是抽象画派的开山师祖,而且凭借那些惊悚的抽象线条创造出来的画作非常挣钱.毕加索这种抽象创造能力能不能用计算机实现呢,随着深度学习的进一步发展,答案是肯定的. 抽象艺术能给人 ...

  6. 深度学习框架哪家强?MXNet称霸CNN、RNN和情感分析,TensorFlow仅擅长推断特征提取

    深度学习框架哪家强:TensorFlow?Caffe?MXNet?Keras?PyTorch?对于这几大框架在运行各项深度任务时的性能差异如何,各位读者不免会有所好奇. 微软数据科学家Ilia Kar ...

  7. 【干货小铺】各种编程语言的深度学习库整理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|新机器视觉 本文总结了Python.Matlab.CPP. ...

  8. 带你测试对比深度学习框架!TensorFlow,Keras,PyTorch...哪家强?(附数据集)

    授权自AI科技大本营(ID: rgznai100) 本文长度为3556字,建议阅读7分钟 亚马逊MXNet在CNN.RNN与NLP情感分析任务上性能强劲,而TensorFlow仅擅长于特征提取. 深度 ...

  9. 自学python要到什么程度-学好深度学习,Python 得达到什么程度?

    如今,网络上的Python机器学习资源纷繁复杂,使得刚入门的小白们眼花缭乱.究竟从哪里开始?如何进行?云栖君给你推荐以下内容,相信读完你就会有自己的答案. "开始",是一个令人激动 ...

最新文章

  1. Win64 驱动内核编程-15.回调监控注册表
  2. 阿里来了位技术新童鞋,一秒K.O八位律师
  3. android实现重复动画,android – 多次重复AnimatorSet动画
  4. DeleteDC() 与 ReleaseDC() 的区别 [转]
  5. 【并查集】家谱(luogu 2814/ssl 2343)
  6. 20W+喜爱的Pathview网页版 | 整合表达谱数据KEGG通路可视化
  7. 用TensorFlow的Linear/DNNRegrressor预测数据
  8. mysql rpm server_记录一次最新版MySQL-server-5.6.20-1.el6.x86_64.rpm的安装
  9. 易基因综述:表观遗传学和表观育种在作物品种改良的重要作用(水稻+玉米+番茄+大豆+油菜)
  10. 一筐梨子一筐水果——协变性(covariant)
  11. 【杂谈】打工人如何喝一杯精致健康的咖啡
  12. 数值分析思考题(钟尔杰版)参考解答——第七章
  13. 什么是基本表?什么是视图?两者的联系和区别是什么?视图有哪些优点?
  14. go集成gin+swagger
  15. 关于2022年宣城市集成电路布图设计登记有效期及收费相关说明
  16. 安装python环境 0x80070001-函数不正确问题解决
  17. 鸿蒙整体战略发布会,“鸿蒙OS”能否用于手机?华为宣布:就看明天的整体战略!...
  18. aws lambda_7种使AWS Lambda更好的开源工具
  19. 如何进行内容分析?(部分内容分析理论)
  20. excel全文翻译怎么操作?这篇文章教你如何翻译excel

热门文章

  1. 搞懂回归和分类模型的评价指标的计算:混淆矩阵,ROC,AUC,KS,SSE,R-square,Adjusted R-Square
  2. 第十六章_Redis案例落地实战bitmap/hyperloglog/GEO
  3. cmake使用教程(实操版)
  4. thinkpad 左键变成右键 or 自动点右键
  5. 云端青柚UZ:将区块链技术切实落地,打造生态农业产业园
  6. OpenFalcon简介
  7. 基于参与意愿的物流联盟资源优化配置模型
  8. backtrace调试程序段错误
  9. 简单的图像特效(上)
  10. 2013年计算机网络原理,全国2013年4月自学考试计算机网络原理试题