AI备忘录 - TensorFlow
type: channel
link: http://www.aiuai.cn/tag/TensorFlow
items: Github项目 - Human Image Gender Classifier
items: TF-Serving - 核心概念与架构
items: StyleGAN2- Latent Space Exploration[译]
items: TF官方GAN教程-CycleGAN实现
items: TF官方GAN教程-CycleGAN
items: TF官方GAN教程-Pix2Pix实现
items: TF官方GAN教程-Pix2Pix
items: TF官方GAN教程-DCGAN实现
items: TF官方GAN教程-DCGAN
items: TF官方GAN教程-DeepDream

Github项目 - Human Image Gender Classifier
type: item
date: 2022-06-07T11:01:00+00:00
description: Github - Human Image Gender Classifier论文：Expressive Body Capture: 3D Hands, Face, and Body from a Single Image - CVPR2019主页：https://smpl-x.is.tue.mpg.de/基于OpenPose姿态估计结果，裁剪人体并识别人体性别.示例，如图：1. 项目环境Python 3.7TensorFlow 1.13.1ConfigerCUDA-10.0, cuDNN-7.5, Ubuntu 18.04requirements.txt:imageio==2.5.0 pillow numpy==1.16.3 scikit-image==0.15.0 scikit-learn==0.20.3 scipy==1.2.1 tensorflow==1.15.2安装：pip install git+https://github.com/nghorbani/homogenus模型下载，假设权重文件存放路径homogenus/trained_models/tf：https://smpl-x.is.tue.mpg.de/downloadsHomogenus: Human Image Gender Classifier2. 项目源码项目结构：├── homogenus │ ├── tf │ │ ├── homogenus_infer.py │ │ └── __init__.py │ ├── tools │ │ ├── body_cropper.py │ │ ├── image_tools.py │ │ ├── __init__.py │ │ └── omni_tools.py │ └── trained_models │ └── tf │ ├── checkpoint │ ├── TR02_E02_It_002010.ckpt.data-00000-of-00001 │ ├── TR02_E02_It_002010.ckpt.index │ ├── TR02_E02_It_002010.ckpt.meta │ └── version.txt ├── requirements.txt └── setup.py2.1. 模型预测 homogenus_infer.py#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- import tensorflow as tf import numpy as np import os, sys import json import cv2 import glob from homogenus.tools.image_tools import put_text_in_image, fontColors, read_prep_image, save_images from homogenus.tools.body_cropper import cropout_openpose, should_accept_pose from homogenus.tools.omni_tools import makepath class Homogenus_infer(object): def __init__(self, trained_model_dir, sess=None): ''' :param trained_model_dir: the directory where you have put the homogenus TF trained models :param sess: ''' best_model_fname = sorted(glob.glob(os.path.join(trained_model_dir , '*.ckpt.index')), key=os.path.getmtime) if len(best_model_fname): self.best_model_fname = best_model_fname[-1].replace('.index', '') else: raise ValueError('Couldnt find TF trained model in the provided directory --trained_model_dir=%s. Make sure you have downloaded them there.' % trained_model_dir) if sess is None: self.sess = tf.Session() else: self.sess = sess # Load g…

TF-Serving - 核心概念与架构
type: item
date: 2021-03-01T12:37:00+00:00
description: TensorFlow Serving 是一个适用于机器学习模型的灵活、高性能应用系统，专为生产环境而设计.借助 TensorFlow Serving，可以轻松部署新算法和实验，同时保留相同的服务器架构和 API.TensorFlow Serving 提供与 TensorFlow 模型的开箱即用型集成，但也可以轻松扩展以应用其他类型的模型和数据.TensorFlow Serving 可以将训练好的机器学习模型部署到线上，使用 gRPC 作为接口接受外部调用.TensorFlow Serving 支持模型热更新与自动模型版本管理。这意味着一旦部署 TensorFlow Serving 后，再也不需要为线上服务操心，只需要关心线下模型训练.https://www.tensorflow.org/tfx/serving/architecture1. 核心概念1.1. ServablesServables 是 TF Serving 的中心抽象.Servables 是客户端用来执行计算的底层对象，如查找和推断.Servables 的尺寸和粒度是灵活的. 单个 Servable 可以是任何东西，从查询表的一个分片，到推断模型元组的单个模型.Servables 可以是任意类型和任意推断，以确保灵活性和将来的进一步提升，如：流结果试验性 APIs异步操作Servables 并不管理其自己的生命周期.Servabels 一般包含如下：TensorFlow SavedModelBundle (tensorflow::Session)用于嵌入或词汇查询的查询表1.2. Servable VersionsTF Serving 可以在耽搁服务器实例的生命周期内，处理一个或多个版本的 servable. 其有助于随着时间更新加载新的算法配置、权重和其他数据. Servable Versions 支持同时加载多个版本的 servable，支持逐步展开和试验.在使用服务时，客户端可以请求特定的 version id 或最新版本的特定模型.1.3. Servable StreamsServable Streams 是 servable 版本的徐蕾，根据版本号增量排序.1.4. ModelsTF Serving 将 model 表示为一个或多个 servable. 一个机器学习模型包含一个或多个算法(包括学习的权重) 和查询表(或嵌入表).组合模型(composite model) 可以是如下情形之一：多个独立的 servables单个组合的 servable此外，一个 servable 还可以对应于一个模型的一部分. 例如，比较大的查询表可以跨很多 TF Serving 实例.1.5. LoadersLoaders 管理 servable 的生命周期.Loader API 支持独立于特定学习算法、数据或产品用例的公共基础设施.Loader API 标准化了用于 servable 的加载和卸载的 API.1.6. SourcesSources 是用于寻找和提供 servable 的插件模块.每个 Source 提供 0 个或多个 servable streams. 对于每个 servable stream，一个 Source 为每个可供加载的 version，提供一个 Loader 实例.TF Serving 的 Sources 接口可以用于从任意存储系统中发现 servables. TF Serving 内置了通用参考 Source 实现. 例如，Sources 能够访问诸如 RPC 之类的机制，且可以轮询文件系统.Sources 能够维护跨多个 servables 或版本所共享的状态. 其有助于使用 delta(diff) 更新不同 versions 间的 servables.1.7. Aspired VersionsAspired Versions 表示应该被加载和准备好了的 servable versions 的集合.Sources 每次为单个 servable stream 传递该 servable visions 集合.当一个 Source 向 Manager 给定新的 aspired versions 列表时，其将取代 servable stream 的现钱版本. Manager 将卸载列表中不再显示的所有以前加载的版本.1.8. ManagersManagers 处理 Servables 的完整生命周期，包括：加载 Servables部署 Servables 服务卸载 ServablesManagers 监听 Sources 并追踪所有的 versions.Managers 尝试完成 Sources 的请求，但如果所需的资源不可用时，则会拒绝加载 a…

StyleGAN2- Latent Space Exploration[译]
type: item
date: 2020-12-31T08:00:00+00:00
description: 原文：Latent Space Exploration with StyleGAN2 - 2020.08.10主要介绍 StyleGAN2 中潜空间（latent space）是什么，以及其能做什么.StyleGAN2关于 latent space + StyleGAN2 的博文：Latent Space Understanding - Ekin Tiu - Understanding Latent Space in Machine LearningStyleGAN2 结构 - Connor Shorten - StyleGAN2GANs 概述 + StyleGAN2 改变了什么 - akira - From GAN basic to StyleGAN2注：https://github.com/AmarSaini/Epoching_StyleGan2_Setup本文基于 TensorFlow 1.14本文不过多关注于模型，采用官方的 StyleGan2 Repo本文进行的结构：[0] Set-Up 只运行一次必要文件拉取[1] - GANs 概览回顾 z latent vector、Generator 和 DiscriminatorGANs vs VAEs[2] - 生成人脸采用官方 StyleGAN2 项目创建 Generator 输出可视化生成输出的 latent codes.[3] - Latent Codes 插值采用 Generator 输出的 latent codes 得到人脸图像[4] - 采用 landmark detection 方法进行人脸图像对齐对齐（归一化）输入图像，以进行 latent space 投影（projection）[5] - 将输入图像投影到 Latent Space学习对齐后输入图像的 latent codes投影的 latent codes 的插值[6] - Latent Directions/Controls 修改投影图像采用预先计算的 latent directions 来改变输入图像的人脸特征[7] - Widget-App 交互0. Set-Up下载项目：git clone https://github.com/AmarSaini/Epoching_StyleGan2_Setup.git项目处理：import shutil from pathlib import Path repo_root = Path('Epoching_StyleGan2_Setup/') # Pull contents out of the repo, into our current directory. for content in repo_root.iterdir(): shutil.move(str(content), '.') shutil.rmtree(repo_root)安装python依赖库：pip install requests pip install Pillow pip install tqdm pip install dlib pip install tensorflow-gpu==1.141. GANs 概述GANs，Generative Adversarial Networks，包含两个模型：[1] - Generator模型，将 latent code 转换为某种输出，如，人脸图像.[2] - Discriminator模型，判断某种输入，如，人脸图像，是真是假.Real: 图像来自于数据集Fake: 图像来自于 GeneratorGenerator 的输入是 latent code z，其可以是任意期望长度的向量，如，512维的向量.训练时，latent code 是随机采样的，512 维的随机向量当 latent code 随机采样时，称其为 latent random variable神奇的 latent code 存储的信息，使得 Generator 生成特定的输出如果可以找到特定输入的 latent code，则可以将其采用更少的数据来表示（如，将某人的图像表示为仅为 512 长度的 latent vector，相比于原始图像大小会小很多）.注：不要混淆了 GANs 和 VAEs, Variational Auto-EncodersGANs 学习从 random latent vectors 中生成输出，其模型输入数据的分布；但不必须是输入数据的精确样本VAEs 将输入样本编码为 latent vectors，并学习将 latent vectors 解码为与原始样本最接近的形式GANs 与 VAEs 的最大不同是，GANs 的 Generator 从未看到过输…

TF官方GAN教程-CycleGAN实现
type: item
date: 2020-11-08T12:59:00+00:00
description: CycleGAN 流程：[1] - 从域 A 中选择一张图片input_A，通过Generator A2B 变换为域 B 中的一张假图片Generated_B，计算分类器 Discrimination_B 的损失;[2] - 将生成的假图片通过Generator B2A 变换回域 A，得到 Cyclic_A，计算其与 input_A 之间的损失；[3] - 另一网络，执行相同的流程处理.1. CycleGAN#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- """ Pix2pix. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import time from absl import app from absl import flags import tensorflow as tf import tensorflow_datasets as tfds FLAGS = flags.FLAGS flags.DEFINE_integer('buffer_size', 400, 'Shuffle buffer size') flags.DEFINE_integer('batch_size', 1, 'Batch Size') flags.DEFINE_integer('epochs', 1, 'Number of epochs') flags.DEFINE_string('path', None, 'Path to the data folder') flags.DEFINE_boolean('enable_function', True, 'Enable Function?') IMG_WIDTH = 256 IMG_HEIGHT = 256 AUTOTUNE = tf.data.experimental.AUTOTUNE # 根据可用的CPU动态设置并行调用的数量 def random_crop(image): cropped_image = tf.image.random_crop(image, size=[IMG_HEIGHT, IMG_WIDTH, 3]) return cropped_image def normalize(image): image = tf.cast(image, tf.float32) image = (image / 127.5) - 1 return image @tf.function def random_jitter(image): # 调整大小为 286 x 286 x 3 image = tf.image.resize(image, [286, 286], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) # 随机裁剪到 256 x 256 x 3 image = random_crop(image) # 随机镜像 image = tf.image.random_flip_left_right(image) return image def preprocess_image_train(image, label): image = random_jitter(image) image = normalize(image) return image def preprocess_image_test(image, label): image = normalize(image) return image def create_horse2zebra_dataset(buffer_size, batch_size): """ Creates a tf.data Dataset. Args: path_to_train_images: Path to train images folder. path_to_test_images: Path to test images folder. buffer_size: Shuffle buffer size. batch_size: Batch size Returns: train dataset, test dataset """ dataset, metadata = tfds.load('cycle_gan/horse2zebra', with_info=True, as_supervised=True) train_horses, train_zebra…

TF官方GAN教程-CycleGAN
type: item
date: 2020-11-07T11:56:00+00:00
description: 原文：TensorFlow - CycleGAN该文主要介绍使用CycleGAN 进行未配对图像到图像转换，参考论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks - 2017， 提出了一种可以捕捉图像域特征并找出如何将这些特征转换为另一个图像域的方法，而无需任何成对的训练样本. 这里假定已经熟悉 Pix2Pix，可以参考 TF官方GAN教程-Pix2Pix. CycleGAN 的代码与其相似，主要区别在于额外的损失函数，以及非配对训练数据的使用. CycleGAN 使用循环一致损失来使训练过程无需配对数据. 换句话说，它可以从一个域转换到另一个域，而不需要在源域与目标域之间进行一对一映射. 这为完成许多有趣的任务开辟了可能性，例如照片增强、图片着色、风格迁移等. 所需要的只是源数据集和目标数据集(仅仅是图片目录).1. 配置pip install tensorflow_datasets #注 #pip install tensorflow-gpu==2.0 #pip install tensorflow_datasets==2.1.0导入相关库：import os import time import matplotlib.pyplot as plt import tensorflow as tf import tensorflow_datasets as tfds from tensorflow_examples.models.pix2pix import pix2pix tfds.disable_progress_bar() AUTOTUNE = tf.data.experimental.AUTOTUNE2. 输入 Pipline训练一个模型，以将普通马图片转换为斑马图片.如论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks - 2017, 将随机抖动和镜像应用到训练集. 这是一些避免过拟合的图像增强技术. 类似于 TF官方GAN教程-Pix2Pix:[1] - 在随机抖动中，图片大小调整为 286 x 286，随后被随机裁剪为 256 x 256. [2] - 在随机镜像中，图片会从左到右随机翻转.dataset, metadata = tfds.load('cycle_gan/horse2zebra', with_info=True, as_supervised=True) train_horses, train_zebras = dataset['trainA'], dataset['trainB'] test_horses, test_zebras = dataset['testA'], dataset['testB'] # BUFFER_SIZE = 1000 BATCH_SIZE = 1 IMG_WIDTH = 256 IMG_HEIGHT = 256 # def random_crop(image): cropped_image = tf.image.random_crop( image, size=[IMG_HEIGHT, IMG_WIDTH, 3]) return cropped_image # 将图像归一化到区间 [-1, 1] 内. def normalize(image): image = tf.cast(image, tf.float32) image = (image / 127.5) - 1 return image def random_jitter(image): # 调整大小为 286 x 286 x 3 image = tf.image.resize(image, [286, 286], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) # 随机裁剪到 256 x 256 x 3 image = random_crop(image) # 随机镜像 image = tf.image.random_flip_left_right(image) return image def preprocess_image_train(image, label): image = random_jitter(image) image = normalize(image) return image def preprocess_image_test(image, label): image = normalize(image) retu…

TF官方GAN教程-Pix2Pix实现
type: item
date: 2020-11-05T12:52:00+00:00
description: 出处：tensorflow_examples/models/pix2pix1. data_downloadhttps://github.com/tensorflow/examples/blob/master/tensorflow_examples/models/pix2pix/data_download.py""" Download facades data. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os from absl import app from absl import flags import tensorflow as tf FLAGS = flags.FLAGS flags.DEFINE_string('download_path', 'datasets', 'Download folder') _URL = 'https://people.eecs.berkeley.edu/~tinghuiz/projects/pix2pix/datasets/facades.tar.gz' def _main(argv): del argv download_path = FLAGS.download_path main(download_path) def main(download_path): path_to_zip = tf.keras.utils.get_file( 'facades.tar.gz', cache_subdir=download_path, origin=_URL, extract=True) path_to_folder = os.path.join(os.path.dirname(path_to_zip), 'facades/') return path_to_folder if __name__ == '__main__': app.run(_main)2. pix2pix#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- """ Pix2pix. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import time from absl import app from absl import flags import tensorflow as tf FLAGS = flags.FLAGS flags.DEFINE_integer('buffer_size', 400, 'Shuffle buffer size') flags.DEFINE_integer('batch_size', 1, 'Batch Size') flags.DEFINE_integer('epochs', 1, 'Number of epochs') flags.DEFINE_string('path', None, 'Path to the data folder') flags.DEFINE_boolean('enable_function', True, 'Enable Function?') IMG_WIDTH = 256 IMG_HEIGHT = 256 AUTOTUNE = tf.data.experimental.AUTOTUNE #根据可用的CPU动态设置并行调用的数量 def load(image_file): """Loads the image and generates input and target image. Args: image_file: .jpeg file Returns: Input image, target image """ image = tf.io.read_file(image_file) image = tf.image.decode_jpeg(image) w = tf.shape(image)[1] w = w // 2 real_image = image[:, :w, :] input_image = image[:, w:, :] input_image = tf.cast(input_image, tf.float32) real_image = tf.cast(real_image, tf.float32) ret…

TF官方GAN教程-Pix2Pix
type: item
date: 2020-11-05T10:50:00+00:00
description: 原文: TensorFlow - Pix2Pix该文主要是介绍采用 conditional GAN 进行图像转换(image to image translation), 可参考 Image-to-Image Translation with Conditional Adversarial Networks - 2016基于该技术,可以实现黑白图像的彩色化, 将谷歌地图转换为谷歌地球,等等. 这里,以建筑立面(building facades) 转换为真实建筑图(real buildings).采用的数据集为:CMP Facade Database 的 Image-to-Image Translation with Conditional Adversarial Networks - 2016 论文作者提供的一个预处理版本: https://people.eecs.berkeley.edu/~tinghuiz/projects/pix2pix/datasets/.每个 epoch 在 V100 GPU 上大概耗时 15s.如下图, 为训练 200 epochs 后模型生成的例图:1. 配置import os import time import matplotlib.pyplot as plt import tensorflow as tf2. 加载数据集2.1. 数据增强对于训练数据集, 进行随机抖动(random jittering) 和镜像(mirroring)处理.[1] - 随机抖动, 图像先缩放为286x286, 再随机裁剪 256x256.[2] - 随机镜像, 图像随机水平翻转,如, 左到右._URL = 'https://people.eecs.berkeley.edu/~tinghuiz/projects/pix2pix/datasets/facades.tar.gz' path_to_zip = tf.keras.utils.get_file('facades.tar.gz', origin=_URL, extract=True) PATH = os.path.join(os.path.dirname(path_to_zip), 'facades/') # BUFFER_SIZE = 400 BATCH_SIZE = 1 IMG_WIDTH = 256 IMG_HEIGHT = 256 # def load(image_file): image = tf.io.read_file(image_file) image = tf.image.decode_jpeg(image) w = tf.shape(image)[1] w = w // 2 real_image = image[:, :w, :] input_image = image[:, w:, :] input_image = tf.cast(input_image, tf.float32) real_image = tf.cast(real_image, tf.float32) return input_image, real_image # inp, re = load(PATH+'train/100.jpg') # casting to int for matplotlib to show the image plt.figure() plt.imshow(inp/255.0) plt.figure() plt.imshow(re/255.0)def resize(input_image, real_image, height, width): input_image = tf.image.resize(input_image, [height, width], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) real_image = tf.image.resize(real_image, [height, width], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) return input_image, real_image def random_crop(input_image, real_image): stacked_image = tf.stack([input_image, real_image], axis=0) cropped_image = tf.image.random_crop( stacked_image, size=[2, IMG_HEIGHT, IMG_WIDTH, 3]) return cropped_image[0]…

TF官方GAN教程-DCGAN实现
type: item
date: 2020-11-04T11:41:00+00:00
description: From: tensorflow_examples/models/dcgan1. dcgan.py#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- """ DCGAN. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import time from absl import app from absl import flags import tensorflow as tf import tensorflow_datasets as tfds FLAGS = flags.FLAGS flags.DEFINE_integer('buffer_size', 10000, 'Shuffle buffer size') flags.DEFINE_integer('batch_size', 64, 'Batch Size') flags.DEFINE_integer('epochs', 1, 'Number of epochs') flags.DEFINE_boolean('enable_function', True, 'Enable Function?') AUTOTUNE = tf.data.experimental.AUTOTUNE def scale(image, label): image = tf.cast(image, tf.float32) image = (image - 127.5) / 127.5 return image, label def create_dataset(buffer_size, batch_size): train_dataset = tfds.load('mnist', split='train', as_supervised=True, shuffle_files=True) train_dataset = train_dataset.map(scale, num_parallel_calls=AUTOTUNE) train_dataset = train_dataset.shuffle(buffer_size).batch(batch_size) return train_dataset def make_generator_model(): """ Generator. Returns: Keras Sequential model """ model = tf.keras.Sequential([ tf.keras.layers.Dense(7*7*256, use_bias=False), tf.keras.layers.BatchNormalization(), tf.keras.layers.LeakyReLU(), tf.keras.layers.Reshape((7, 7, 256)), tf.keras.layers.Conv2DTranspose(128, 5, strides=(1, 1), padding='same', use_bias=False), tf.keras.layers.BatchNormalization(), tf.keras.layers.LeakyReLU(), tf.keras.layers.Conv2DTranspose(64, 5, strides=(2, 2), padding='same', use_bias=False), tf.keras.layers.BatchNormalization(), tf.keras.layers.LeakyReLU(), tf.keras.layers.Conv2DTranspose(1, 5, strides=(2, 2), padding='same', use_bias=False, activation='tanh') ]) return model def make_discriminator_model(): """ Discriminator. Returns: Keras Sequential model """ model = tf.keras.Sequential([ tf.keras.layers.Conv2D(64, 5, strides=(2, 2), padding='same'), tf.keras.layers.LeakyReLU(), tf.keras.layers.Dropout(0.3), tf.keras.layers…

TF官方GAN教程-DCGAN
type: item
date: 2020-11-04T10:32:00+00:00
description: 原文：TensorFlow - 深度卷积生成对抗网络该文主要是介绍如何使用深度卷积生成对抗网络(DCGAN)生成手写数字图片. 代码是使用 Keras Sequential API 与 tf.GradientTape 训练循环编写的.1. 什么是生成对抗网络生成对抗网络(GANs)是当今计算机科学领域最有趣的想法之一. 两个模型通过对抗过程同时训练. 一个生成器(“艺术家”)学习创造看起来真实的图像，而判别器(“艺术评论家”)学习区分真假图像. 训练过程中，生成器在生成逼真图像方面逐渐变强，而判别器在辨别这些图像的能力上逐渐变强. 当判别器不再能够区分真实图片和伪造图片时，训练过程达到平衡. 本文在 MNIST 数据集上演示了该过程. 下方动画展示了当训练了 50 个epoch (全部数据集迭代50次) 时生成器所生成的一系列图片. 图片从随机噪声开始，随着时间的推移越来越像手写数字. 关于 GANs 更多信息：参阅 MIT的 深度学习入门 课程.2. 配置首先安装用于生成 GIF 图片的库 - imageio:pip install -q imageioimport glob import imageio import matplotlib.pyplot as plt import numpy as np import os import PIL import time import tensorflow as tf print(tf.__version__) #2.3.0 from tensorflow.keras import layers3. 加载和准备数据集# MNIST 数据集 (train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data() train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32') train_images = (train_images - 127.5) / 127.5 # 将图片标准化到 [-1, 1] 区间内 BUFFER_SIZE = 60000 BATCH_SIZE = 256 # 批量化和打乱数据 train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)4. 创建模型生成器和判别器均使用 Keras Sequential API 定义.4.1. 生成器生成器使用 tf.keras.layers.Conv2DTranspose (上采样)层来从种子(随机噪声)中产生图片. 以一个使用该种子作为输入的 Dense 层开始，然后多次上采样直到达到所期望的 28x28x1 的图片尺寸. 注：除了输出层使用 tanh 之外，其他每层均使用 tf.keras.layers.LeakyReLU 作为激活函数.def make_generator_model(): model = tf.keras.Sequential() model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,))) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Reshape((7, 7, 256))) assert model.output_shape == (None, 7, 7, 256) # 注意：batch size 没有限制 model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False)) assert model.output_shape == (None, 7, 7, 128) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False)) assert model.output_shape == (None, 14, 14, 64) model.add(layers.BatchNormaliz…

TF官方GAN教程-DeepDream
type: item
date: 2020-11-04T04:39:00+00:00
description: 原文：TensorFlow - DeepDream该文是关于 DeepDream 的简单实现，可参考 Alexander Mordvintsev 的 blog - Inceptionism: Going Deeper into Neural Networks.DeepDream 是对于神经网络所学习的模式(patterns)的可视化实验. 类似于孩子看着天空中的云，并尝试解释随机形状时，DeepDream 会过度解释并增强其在图像中看到的图案.DeepDream 首先将图像进行网络的前向计算，然后计算图像关于特定网络层的激活值的梯度. 则图像被修改，以增强这些激活值，增强网络可见的模式，并生成类似梦境的图像. 该过程被称为"Inceptionism".下面开始说明如何进行神经网络梦境化，并增强其在图像中看到的超现实模式.1. 配置import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl from PIL import Image import tensorflow as tf from tensorflow.keras.preprocessing import image2. 选择待梦境化的图片url = 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg' # Download an image and read it into a NumPy array. def download(url, max_dim=None): name = url.split('/')[-1] image_path = tf.keras.utils.get_file(name, origin=url) img = PIL.Image.open(image_path) if max_dim: img.thumbnail((max_dim, max_dim)) return np.array(img) # Normalize an image def deprocess(img): img = 255*(img + 1.0)/2.0 return tf.cast(img, tf.uint8) # Display an image def show(img): img = Image.fromarray(np.array(img)) plt.imshow(img) plt.show() # 图像下载 original_img = download(url, max_dim=500) show(original_img)3. 特征提取模型下载一个预训练的图像分类模型. 可以根据需要选择任意预训练模型， 仅需要调整网络层的名字.这里采用类似于 DeepDream 原始采用的 InceptionV3 模型.base_model = tf.keras.applications.InceptionV3(include_top=False, weights='imagenet')DeepDream 的思想是，选择一个网络层(或多个网络层)，以图像逐渐“刺激(excites)” 网络层的方式最大化损失函数. 合并的特征复杂度取决于所选择的网络层，如，越浅(lower)的网络层得到图像中简单的模式，而越深(deeper)的网络层得到图像中更复杂的特征.InceptionV3 网络结构是比较大的. 对于DeepDream 而言，其感兴趣的是连接卷积层的网络层. InceptionV3 中有 11 个这样的网络层，网络层名为 "mixed0" 到 "mixed10". 采用不同的网络层会得到不同的梦境化图像. 越深网络层对应于 higher-level 特征(例如，eyes 和 faces)，而越浅网络层对应于简单特征(如边缘、形状、纹理等). 其中，越深网络层的训练时间越久，因为梯度计算更深.# Maximize the activations of these layers names = ['mixed3', 'mixed5'] layers = [base_model.get_layer(name).output for name in names] # Create the feature extraction model dream_model = tf.keras.Model(inputs=base_model.input, outputs=layers)4. 计算损失损失值是所选择网络层的激活值之和. 损失值在每一…