在 CelebA 数据集上训练的 PyTorch 中的基本变分自动编码器

一、说明
我最近发现自己需要一种方法将图像编码到潜在嵌入中,调整嵌入,然后生成新图像。有一些强大的方法可以创建嵌入或从嵌入生成。如果你想同时做到这两点,一种自然且相当简单的方法是使用变分自动编码器。
这样的深度网络不仅可以进行编码和解码,而且相当简单,我可以在以后的研究中使用它,而不必过多担心编码解码阶段的各种隐藏复杂性。我也更喜欢对软件内部有尽可能多的控制。
因此,考虑到所有这些规范,我从 GitHub 收集了一些零碎的东西,施展了一些我自己的魔法,最终得到了一个漂亮、简单的变分自动编码器。我将在下面描述主要部分,完整的包可在以下位置找到:
vae-torch-celeba,PyTorch 中 CelebA 数据集的变分自动编码器,下载vae-torch-celeba的源码_GitHub_帮酷
PyTorch 中用于 CelebA 数据集的变分自动编码器 - GitHub - moshesipper/vae-torch-celeba:变分...
它相当小并且完全独立——这就是我的意图!
二、自动编码器
为了使本文简短易懂,我将避免提供变分自动编码器的冗长概述。此外,您还可以在 Medium 上找到有关基础知识的优秀文章。我只提供三张快速图片。
这是基本自动编码器的样子:
来源: https: //commons.wikimedia.org/wiki/File :Autoencoder_schema.png
简而言之,网络将输入数据压缩为潜在向量(也称为嵌入),然后将其解压缩回来。这两个阶段称为编码和解码。
变分自动编码器(VAE)看起来非常相似,除了中间的嵌入部分。对于每个输入,VAE 的编码器输出潜在空间中预定义分布的参数,而不是潜在空间中的向量:
来源:https ://commons.wikimedia.org/wiki/File:Reparameterized_Variational_Autoencoder.png
最后一张图片:如果我们处理的是图像输入,我们需要一个卷积VAE,如下所示:
来源:https://github.com/arthurmeyer/Saliency_Detection_Convolutional_Autoencoder
注意#1:观察编码器部分如何在每一层中添加越来越多的滤波器,图像变得越来越小;解码器则相反。
注意#2:注意符号。如果只有一个通道,则术语“过滤器”和“内核”基本相同。对于多个通道,每个过滤器都是一组内核。查看这篇很棒的 Medium 文章:“直观地理解深度学习的卷积”。
三、CelebA数据集
我将使用的数据集是 CelebA,其中包含 202,599 张名人面孔图像。
CelebA 数据集
CelebFaces Attributes Dataset (CelebA) 是一个大规模人脸属性数据集,包含超过 20 万张名人图像……
可以通过以下方式访问它torchvision:
from torchvision.datasets import CelebAtrain_dataset = CelebA(path, split='train')
test_dataset = CelebA(path, split='valid') # or 'test'
四、VAE类
我的 VAE 基于此PyTorch 示例和存储库的普通 VAE模型(将我使用的普通 VAE 替换为中的任何其他模型PyTorch-VAE
应该不会太难)。PyTorch-VAE
该文件vae.py
包含VAE
类以及图像大小的定义、两个潜在向量的维度(均值和方差)以及数据集的路径:
CELEB_PATH = './data/'
IMAGE_SIZE = 150
LATENT_DIM = 128
image_dim = 3 * IMAGE_SIZE * IMAGE_SIZE
在课堂上VAE
,我使用了以下隐藏过滤器维度:
hidden_dims = [32, 64, 128, 256, 512]
编码器看起来像这样:
in_channels = 3
modules = []
for h_dim in hidden_dims:modules.append(nn.Sequential(nn.Conv2d(in_channels, out_channels=h_dim,kernel_size=3, stride=2, padding=1),nn.BatchNorm2d(h_dim),nn.LeakyReLU()))in_channels = h_dim
self.encoder = nn.Sequential(*modules)
然后是潜在向量:
self.fc_mu = nn.Linear(hidden_dims[-1] * self.size * self.size, LATENT_DIM)
self.fc_var = nn.Linear(hidden_dims[-1] * self.size * self.size, LATENT_DIM)
最后我们用解码器“倒退”:
hidden_dims.reverse()for i in range(len(hidden_dims) - 1):modules.append(nn.Sequential(nn.ConvTranspose2d(hidden_dims[i],hidden_dims[i + 1],kernel_size=3,stride=2,padding=1,output_padding=1),nn.BatchNorm2d(hidden_dims[i + 1]),nn.LeakyReLU()))self.decoder = nn.Sequential(*modules)
这就是它的要点——还有一些零碎的内容vae.py
可以完成这VAE
门课。
五、训练
该文件trainvae.py
包含训练我们刚刚编码的 VAE 的代码。老实说,没什么花哨的......有 3 个主要函数:(train
随着训练的进行,它也输出损失值),test
(它还构建一个重建图像的小样本)和loss_function
。训练和测试相当普通,损失函数是标准 VAE,带有重建组件 (MSE) 和 KL 散度组件。
epoch 上的主循环执行 4 个操作:1) train
、2) test
、3) 生成随机潜在向量并调用decode
以输出相应的输出图像,以及 4) 将 epoch 的模型保存到文件中pth
。
以下是示例运行的输出。通过 20 个训练周期,您最终会得到 20 个重建图像文件、20 个潜在采样文件和 20 个 python 模型文件:
这里reconstruction_20.png
,顶行显示 8 张原始图片,底行显示经过训练的 VAE 的相应重建。
在 epoch 20 时从模型重建(输出)图像。
这里的sample_20.png
,显示了从随机潜在向量生成的 64 张图像:
只是为了好玩,我添加了一小段代码 — genpics.py
— 从数据集中挑选一个随机图像并生成 7 个重建。以下是一些示例(最左边的图像是原始图像):
最后,我再次放置 GitHub 链接。享受!
相关文章:

在 CelebA 数据集上训练的 PyTorch 中的基本变分自动编码器
摩西西珀博士 一、说明 我最近发现自己需要一种方法将图像编码到潜在嵌入中,调整嵌入,然后生成新图像。有一些强大的方法可以创建嵌入或从嵌入生成。如果你想同时做到这两点,一种自然且相当简单的方法是使用变分自动编码器。 这样的深度网络不…...

利用Ansible实现批量Linux服务器安全配置
1.摘要 在上一篇<<初步利用Ansible实现批量服务器自动化管理>>文章中, 我初步实现了通过编写清单和剧本来实现多台服务器的自动化管理,在本章节中, 我将利用Ansible的剧本来实现更实用、更复杂一点的功能, 主要功能包括三个:1.同时在三台服务器中增加IP访问控制,只…...
读书笔记:彼得·德鲁克《认识管理》第8章 战略规划:企业家技能
一、章节内容概述 战略规划帮助做好当前的业务以迎接未来。战略规划需要思考业务应该是什么,当前必须做什么才能赢得未来。战略规划需要进行风险决策,需要有组织地抛弃过去的业务,要求清晰界定和明确安排为实现理想的未来而开展的工作。战略…...
HarmonyOS应用开发-视频播放器与弹窗
Viedo组件 在手机、平板或是智慧屏这些终端设备上,媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集,还是视频的播放、切换、循环,亦或是相机的预览、拍照等功能,媒体组件都是必不可少的。以视频功能为…...
java中对象的引用是什么?
引用和指向 例如: new Student(); 代表创建了一个Student对象,但是也仅仅是创建了一个对象,没有办法访问它。 为了访问这个对象,会使用引用来代表这个对象 Student s new Student(); s这个变量是Student类型,又叫做引…...
jenkins插件迁移
将Jenkins插件迁移至不同的Jenkins实例或更新插件版本是一项常见的任务。以下是迁移Jenkins插件的一般步骤: 备份现有插件: 在开始迁移之前,首先备份你当前的Jenkins实例以及所有相关的插件。这可以通过复制Jenkins的JENKINS_HOME目录来实现…...
RK356X Android13.0 HDMI和喇叭同时出声音
补丁适用范围:RK356X Android13.0 Android默认音频输出逻辑,不接HDMI默认喇叭音频输出,若检测到HDMI接入后,关闭喇叭输出,开启HDMI音频输出,但是BOX产品的使用场景需要插入HDMI后,喇叭仍然输出,可加入此补丁 $ vim frameworks/base/services/core/java/com/android/s…...
vue sass-loader,webpack安装卸载操作命令
检查 node-sass 的可用版本:运行下面的命令,查看 node-sass 的可用版本列表。 查看 npm view node-sass versions卸载 npm uninstall node-sass安装指定版本 npm install node-sass4.14.1安装最新版本 npm install sass-loaderlatest如果没有指定特定…...

nacos应用——占用内存过多问题解决(JVM调优初步)
问题描述 最近搞了一台1年的阿里云服务器,安装了一下常用的MySQL,Redis,rabbitmq,minio,然后有安装了一下nacos,结果一启动nacos内存占用就很高,就比较限制我继续安装其他镜像或者启动别的服务…...

大漠插件(二、Qt使用插件时注意事项)
本章目的 在上篇已经注册完毕大漠,那么怎么使用大漠来制作脚本,我选择了我最熟悉的Qt来开发,毕竟只是小软件,用脚本或者c都差不了多少。本章就是开发途中的一些坑。 本人开发环境是 win11 64、Qt 5.15.2安装了5.10.0的msvc2015 32…...

CSS 浮动
目标target✓ 能够说出来为什么需要浮动能够说出来浮动的排列特性能够说出来三种最常见的布局方式能够说出来为什么需要清除浮动,能够至少写出两种清楚浮动的方法能够利用Photoshop实现基本的切图能够利用Photoshop插件实现切图能够完成学成在线的页面布 传统网页布局的三种模…...
基于STM32+华为云IOT设计的火灾感知系统
一、设计需求 【1】 项目背景 随着城市化进程的加快和人们生活水平的提高,火灾事故频繁发生,给人们的生命财产安全带来巨大威胁。因此,开发一种可靠的火灾感知系统对于预防和减少火灾事故具有重要意义。近年来,随着物联网技术的发展,基于物联网的火灾感知系统逐渐成为研…...
算法通关村第八关|白银|二叉树的深度和高度问题【持续更新】
1.最大深度问题(后序遍历) 只需要一直递归,维护一个最大值。每一层只要有一个子节点,这个最大值就可以增加。 public int maxDepth(TreeNode root) {if (root null) {return 0;}int leftHeight maxDepth(root.left);int right…...

cmake 之add_definitions使用误区
需求 需要实现,在cmake中定义宏定义,可以:1) 在code中可以使用;2) 在cmake中可以识别是否已定义 问题 宏定义,cmake有add_definitions函数,直观的实现方法如下。 cmake_minimum…...

Leetcode—515.在每个树行中找最大值【中等】
2023每日刷题(二十三) Leetcode—515.在每个树行中找最大值 DFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned arra…...

安防监控系统EasyCVR平台设备通道绑定AI算法的功能设计与开发实现
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…...

element 弹窗浏览器后退-遮照层还存在问题 以及跟vue keep-alive冲突
问题:element 弹窗浏览器后退-遮照层还存在问题 查询官网可以设置 modal-append-to-body“false” 可以全局设置 ElementUI.Dialog.props.modalAppendToBody.default false 后续 基本到这能解决问题,不过本项目比较特殊,使用了 keep-alive…...

C++(Qt)软件调试---自动注册AeDebug(17)
C(Qt)软件调试—自动注册AeDebug(17) 文章目录 C(Qt)软件调试---自动注册AeDebug(17)1、什么是AeDebug2、使用调试工具3、WinDbg注册到AeDebug4、ProcDump注册到AeDebug5、Dr.MinGW注册到AeDebug6、Visual Studio 注册到AeDebug 1…...
云原生周刊:Gateway API 1.0.0 发布 | 2023.11.6
开源项目推荐 Kueue Kueue 是一套用于作业队列的 API 和控制器。它是作业级管理器,可决定何时允许作业启动(如创建 pod),何时停止作业(如删除活动 pod)。 Reloader 一个 Kubernetes 控制器,…...

Java2 - 数据结构
5 数据类型 5.1 整数类型 在Java中,数据类型用于定义变量或表达式可以存储的数据的类型。Java的数据类型可分为两大类:基本数据类型和引用数据类型。 byte,字节 【1字节】表示范围:-128 ~ 127 即:-2^7 ~ 2^7 -1 sho…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...