自编码器模型详解与实现(采用TensorFlow2实现)

简介: 自编码器的基本构建块是编码器和解码器。编码器负责将高维输入减少为一些低维潜(隐)变量。解码器是将隐变量转换回高维空间的模块。本文对自编码器的原理进行详解,同时使用tensorflow2实现自编码器。

使用自编码器学习潜变量

由于高维输入空间中有很多冗余,可以压缩成一些低维变量,自编码器于 1980 年代 Geoffrey Hinton 等人首次推出。在传统的机器学习技术中用于减少输入维度的技术,包括主成分分析 (Principal Component Analysis, PCA)。

但是,在图像生成中,我们还将希望将低维空间还原为高维空间。可以将其视为图像压缩,其中将原始图像压缩为 JPEG 之类的文件格式,该文件格式较小且易于存储和传输。然后,计算机可以将 JPEG 恢复为原始像素。换句话说,原始像素被压缩为低维 JPEG 格式,并恢复为高维原始像素以进行显示。

自编码器是一种无监督的机器学习技术,不需要训练标签就可以对模型进行训练。但是,由于我们确实需要使用图像本身作为标签,因此有人将其称为自监督机器学习( auto 在拉丁语中表示 self)。

自编码器的基本构建块是编码器和解码器。编码器负责将高维输入减少为一些低维潜(隐)变量。解码器是将隐变量转换回高维空间的模块。编码器-解码器 体系结构还用于其他机器学习任务中,例如语义分割,其中神经网络首先了解图像表示,然后生成像素级标签。下图显示了自编码器的一般体系结构:

自编码器.png

输入和输出是相同维度的图像,z 是低维度的潜矢量。编码器将输入压缩为 z,解码器将处理反向以生成输出图像。

编码器

编码器由多个神经网络层组成,我们将使用 MNIST 数据集构建编码器,该编码器接受的输入尺寸为 28x28x1。我们需要设置潜变量的维数,这里使用一维向量。潜变量的大小应小于输入尺寸。它是一个超参数,首先尝试使用 10,它具有 28 * 28 / 10 = 78.4 的压缩率。

这种网络拓使模型学习重要的知识,并逐层丢弃次要的特征,最终得到 10 个最重要的特征。它看起来与 CNN 分类非常相似,在 CNN 分类中,特征图的大小自上到下逐渐减小。

使用卷积层构建编码器,前期的 CNN (例如 VGG )使用最大池化进行特征图下采样,但是较新的网络倾向于通过在卷积层中使用步幅为 2 的卷积来实现此目的。

我们将遵循约定并将潜在变量命名为 z:

defEncoder(z_dim):
inputs=layers.Input(shape=[28,28,1])
x=inputsx=Conv2D(filters=8, kernel_size=(3,3), strides=2, padding='same', activation='relu')(x)
x=Conv2D(filters=8, kernel_size=(3,3), strides=1, padding='same', activation='relu')(x)
x=Conv2D(filters=8, kernel_size=(3,3), strides=2, padding='same', activation='relu')(x)
x=Conv2D(filters=8, kernel_size=(3,3), strides=1, padding='same', activation='relu')(x)
x=Flatten()(x)
out=Dense(z_dim, activation='relu')(x)
returnModel(inputs=inputs, outputs=out, name='encoder')

在典型的 CNN 架构中,滤波器的数量增加,而特征图的大小减小。但是,我们的目标是减小特征尺寸,因此滤波器的数量保持不变,这对于诸如 MNIST 之类的简单数据就足够了。最后,我们将最后一个卷积层的输出展平,并将其馈送到密集层以输出潜变量。

解码器

解码器的工作本质上与编码器相反,其将低维潜变量转换为高维输出以近似输入图像。此处,在解码器中使用卷积层将特征图从 7x7 上采样到 28x28:

defDecoder(z_dim):
inputs=layers.Input(shape=[z_dim])
x=inputsx=Dense(7*7*64, activation='relu')(x)
x=Reshape((7,7,64))(x)
x=Conv2D(filters=64, kernel_size=(3,3), strides=1, padding='same', activation='relu')(x)
x=UpSampling2D((2,2))(x)
x=Conv2D(filters=32, kernel_size=(3,3), strides=1, padding='same', activation='relu')(x)
x=UpSampling2D((2,2))(x)    
x=Conv2D(filters=32, kernel_size=(3,3), strides=2, padding='same', activation='relu')(x)
out=Conv2(filters=1, kernel_size=(3,3), strides=1, padding='same', activation='sigmoid')(x)
returnModel(inputs=inputs, outputs=out, name='decoder')

与编码器不同,解码器的目的不是降低尺寸,因此我们应该使用更多的滤波器来赋予其更强大的生成能力。

UpSampling2D 对像素进行插值以提高分辨率。这是一个仿射变换(线性乘法和加法),因此可以反向传播,但是它使用固定权重,因此是不可训练的。另一种流行的上采样方法是使用转置卷积层 (transpose convolutional layer),该层是可训练的,但是它可能在生成的图像中创建类似于棋盘方格的伪像

因此,最近的图像生成模型通常不使用转置卷积:绘图130.png


构建自编码器

将编码器和解码器放在一起以创建自编码器。首先,我们分别实例化编码器和解码器。然后,我们将编码器的输出馈送到解码器的输入中,并使用编码器的输入和解码器的输出实例化一个Model:  

z_dim=10encoder=Encoder(z_dim)
decoder=Decoder(z_dim)
model_input=encoder.inputmodel_output=decoder(encoder.output)
autoencoder=Model(model_input, model_output)

为了进行训练,使用 L2 损失,这是通过均方误差(MSE)来比较输出和预期结果之间的每个像素而实现的。在此示例中,添加了一些回调函数,它们将在训练每个 epoch 之后进行调用:

1. ModelCheckpoint(monitor='val_loss') 用于在当前验证损失低于先前 epoch 情况下保存模型。

2. 如果验证损失在 10 个 epoch 内没有得到改善,则 EarlyStopping(monitor='val_loss', patience = 10) 可以更早地停止训练。

生成的图像如下:

20210522141118340.png

从潜变量生成图像

那么,自动编码器有什么用途呢?自编码器的应用之一是图像去噪,即在输入图像中添加一些噪声并训练模型以生成清晰图像。

如果对使用自编码器生成图像感兴趣,则可以忽略编码器,而仅使用解码器从潜变量中采样以生成图像。我们面临的第一个挑战是确定如何从潜在变量中采样。

为了进行说明,使用z_dim = 2训练另一个自动编码器,以便我们可以在两个维度上探索潜在空间:

绘图131.png

通过将 1,000 个样本传递到经过训练的编码器中并在散点图上绘制两个潜在变量来生成该图。右侧的颜色栏指示数字标签的强度。我们可以从图中观察到:

潜在变量的类别不是均匀分布的。可以在左上方和右上方看到与其他类别完全分开的群集。但是,位于图中心的类别趋于更密集地排列,并且彼此重叠。

下图中,这些图像是通过以 1.0 为间隔在潜变量 [-5, +5] 范围中生成的:

绘图132.png

我们可以看到数字 0 和 1 在样本分布中得到了很好的表示,被很好地绘制。但中间的数字是模糊的,甚至样本中也缺少一些数字。

我们也可以在 .ipynb 代码中添加控件,允许滑动改变潜变量以交互方式生成图像。

绘图133.png

相关文章
|
3月前
|
机器学习/深度学习 TensorFlow API
TensorFlow与Keras实战:构建深度学习模型
本文探讨了TensorFlow和其高级API Keras在深度学习中的应用。TensorFlow是Google开发的高性能开源框架,支持分布式计算,而Keras以其用户友好和模块化设计简化了神经网络构建。通过一个手写数字识别的实战案例,展示了如何使用Keras加载MNIST数据集、构建CNN模型、训练及评估模型,并进行预测。案例详述了数据预处理、模型构建、训练过程和预测新图像的步骤,为读者提供TensorFlow和Keras的基础实践指导。
256 59
|
1天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
30 11
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
21天前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
27 1
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
58 1
|
21天前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
44 0
|
21天前
|
C# 开发者 前端开发
揭秘混合开发新趋势:Uno Platform携手Blazor,教你一步到位实现跨平台应用,代码复用不再是梦!
【8月更文挑战第31天】随着前端技术的发展,混合开发日益受到开发者青睐。本文详述了如何结合.NET生态下的两大框架——Uno Platform与Blazor,进行高效混合开发。Uno Platform基于WebAssembly和WebGL技术,支持跨平台应用构建;Blazor则让C#成为可能的前端开发语言,实现了客户端与服务器端逻辑共享。二者结合不仅提升了代码复用率与跨平台能力,还简化了项目维护并增强了Web应用性能。文中提供了从环境搭建到示例代码的具体步骤,并展示了如何创建一个简单的计数器应用,帮助读者快速上手混合开发。
30 0
|
21天前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
32 0
|
21天前
|
前端开发 开发者 设计模式
揭秘Uno Platform状态管理之道:INotifyPropertyChanged、依赖注入、MVVM大对决,帮你找到最佳策略!
【8月更文挑战第31天】本文对比分析了 Uno Platform 中的关键状态管理策略,包括内置的 INotifyPropertyChanged、依赖注入及 MVVM 框架。INotifyPropertyChanged 方案简单易用,适合小型项目;依赖注入则更灵活,支持状态共享与持久化,适用于复杂场景;MVVM 框架通过分离视图、视图模型和模型,使状态管理更清晰,适合大型项目。开发者可根据项目需求和技术栈选择合适的状态管理方案,以实现高效管理。
28 0
|
21天前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
14 0
|
21天前
|
机器学习/深度学习 API TensorFlow
深入解析TensorFlow 2.x中的Keras API:快速搭建深度学习模型的实战指南
【8月更文挑战第31天】本文通过搭建手写数字识别模型的实例,详细介绍了如何利用TensorFlow 2.x中的Keras API简化深度学习模型构建流程。从环境搭建到数据准备,再到模型训练与评估,展示了Keras API的强大功能与易用性,适合初学者快速上手。通过简单的代码,即可完成卷积神经网络的构建与训练,显著降低了深度学习的技术门槛。无论是新手还是专业人士,都能从中受益,高效实现模型开发。
11 0