af00c4f4-3216-eb11-8da9-e4434bdf6706.png

前言

自编码器常被应用于数据降维、降噪、异常值检测以及数据生成等领域。目前基于PyTorch的自编码器示例基本都是使用手写数字图片 (Mnist) 这种3阶张量数据,而关于2阶张量数据的自编码器实现介绍较少。下面介绍如何利用PyTorch实现2阶张量数据的自编码器。

基本概念

1. PyTorch

PyTorch [1]是一个开源的 Python 机器学习库,基于 Torch,底层由 C++ 实现,应用于人工智能领域,主要有两大特征:

  • 类似于 NumPy 的 张量计算,可使用 GPU 加速
  • 基于带自动微分系统的深度神经网络

2. 自编码器

自编码器 (autoencoder, AE) 是一类在半监督学习和非监督学习中使用的人工神经网络,其功能是通过将输入信息作为学习目标,对输入信息进行表征学习 (representation learning)。[2]

b300c4f4-3216-eb11-8da9-e4434bdf6706.png
AE示意图(来源于:https://towardsdatascience.com/applied-deep-learning-part-3-autoencoders-1c083af4d798)

图中可以看出,AE主要由编码器 (encoder) 和 解码器 (decoder) 组成,输入数据通过编码器后得到的数据为隐含层 (图中的code部分),隐含层再通过解码器恢复为原始输入数据维度一直的重构数据。隐含层节点个数小于输入节点个数的,一般称之为欠完备自编码器;隐含层节点个数大于或等于输入节点个数的,则称之为过完备自编码器。

3. 张量

张量是PyTorch中的数据处理单元,如图所示:

b700c4f4-3216-eb11-8da9-e4434bdf6706.png
张量数据示意图(来源于:https://dev.to/juancarlospaco/tensors-for-busy-people-315k)
  • 0阶张量:标量
  • 1阶张量:行/列向量
  • 2阶张量:m*n 的矩阵A,一般 m 是样本/特征个数,n 是特征/样本个数,如果用索引表示就是A(i, j)。
  • 3阶张量:m*n*h的矩阵数组B,如果用索引表示就是B(i, j, k)。
  • 4阶张量
  • ...

实现过程

1. 实验对象

本实验中采用的数据来源于某工业过程,训练集为一个6000*32阶张量,即6000个数据样本,每个样本有3个属性。测试集为一个200*3的2阶张量,即200个数据样本,每个样本有3个属性。

2. 网络搭建

2.1 导入模块

import 

2.2 优化器 (Adam)

optimizer 

2.2 损失函数 (MSE)

loss_func 

2.3 编码器和解码器的网络结构

class 

编码器的输入节点为3个,与输入数据的特征个数一致;输出节点为隐含层节点个数 (48);

解码器的输入节点和隐含层节点个数一致,输出节点为3个,与输入数据的特征个数一致。总的网络结构如下,两个编码器 (3→12, 12→48),两个解码器 (48→12, 12→3)

b900c4f4-3216-eb11-8da9-e4434bdf6706.png
AE网络结构

3. 数据准备

数据以.mat格式存储为项目的子文件夹/data。

# 读取数据

4. 初始化

# 初始化

5. 网络训练

# 训练

6. 训练结果

Epoch

bb00c4f4-3216-eb11-8da9-e4434bdf6706.png
训练过程的 loss 变化

7. 测试结果

# 利用训练好的自编码器重构测试数据

测试数据的3种特征的重构结果

bd00c4f4-3216-eb11-8da9-e4434bdf6706.png

测试数据的3种特征的迭代重构效果动态图

第1个特征:

c100c4f4-3216-eb11-8da9-e4434bdf6706.png
第1个特征的迭代重构效果

第2个特征:

c700c4f4-3216-eb11-8da9-e4434bdf6706.png
第2个特征的迭代重构效果

第3个特征:

cb00c4f4-3216-eb11-8da9-e4434bdf6706.png
第3个特征的迭代重构效果


源代码

# -*- coding: utf-8 -*-

小尾巴

如果这篇文章对您有所帮助,欢迎点赞、关注、收藏,同时也欢迎专注我的个人专栏,分享与交流机器学习算法和编程实践心得。

机器学习与编程实践​zhuanlan.zhihu.com
cc00c4f4-3216-eb11-8da9-e4434bdf6706.png

参考

  1. ^https://www.wikiwand.com/zh/PyTorch
  2. ^https://baike.baidu.com/item/%E8%87%AA%E7%BC%96%E7%A0%81%E5%99%A8/23686966?fr=aladdin
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐