热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Keras搭建自编码器操作

这篇文章主要介绍了Keras搭建自编码器操作,具有很好的参考价值,希望对大家有所帮助。一

简介:

传统机器学习任务任务很大程度上依赖于好的特征工程,但是特征工程往往耗时耗力,在视频、语音和视频中提取到有效特征就更难了,工程师必须在这些领域有非常深入的理解,并且需要使用专业算法提取这些数据的特征。深度学习则可以解决人工难以提取有效特征的问题,大大缓解机器学习模型对特征工程的依赖。

深度学习在早期一度被认为是一种无监督的特征学习过程,模仿人脑对特征逐层抽象的过程。这其中两点很重要:一是无监督学习;二是逐层训练。例如在图像识别问题中,假定我们有许多汽车图片,要如何利用计算机进行识别任务呢?如果从像素级开始进行训练分类器,那么绝大多数算法很难工作。如果我们提取高阶特征,比如汽车的车轮、汽车的车窗、车身等。那么就可以使用这些高阶特征非常准确的对图像进行分类。不过高阶特征都是由底层特征组成,这便是深度学习训练过程中所做的特征学习。

早年有学者发现,可以使用少量的基本特征进行组合拼装得到更高层抽象的特征,这其实就是我们常说的特征的稀疏表达。对图像任务来说,一张原始图片可以由较少的图片碎片组合得到。对语音识别任务来讲,绝大多数的声音也可以由一些基本的结构线性组合得到。对人脸识别任务来说,根据不同的器官,如:鼻子、嘴、眉毛、眼睛瞪,这些器官可以向上拼出不同样式的人脸,最后模型通过在图片中匹配这些不同样式的人脸来进行识别。在深度神经网络中,对每一层神经网络来说前一层的输出都是未加工的像素,而这一层则是对像素进行加工组织成更高阶的特征的过程(即前面提到过的图片碎片进行线性组合加工的过程)。

根据上述基本概念的描述,特征是可以不断抽象转为高一层特征的,那我们如何找到这些基本结构,然后如何抽象?这里引出无监督的自编码器来提取特征。自编码器--顾名思义,可以使用自身高阶特征编码自己。它的输入和输出是一致的。因此,它的基本思想是使用稀疏一些高阶特征重新组合来重构自己。自编码器的刚开始提出是Hinton在Science上发表文章,用来解决数据降维问题。此外,Hinton还提出了基于深度信念网络的无监督逐层训练的贪心算法,为训练很深的网络提供了一个可行的方案。深度信念网络的提出是使用逐层训练的方式提取特征,使得在有监督学习任务之前,使得网络权重初始化到一个比较好的位置。其思想与自编码器的非常相似。在此基础上,国内外学者又提出了自编码器的各种版本,如:稀疏自编码器、去噪自编码器等。

本文使用Keras深度学习开发库,在MNIST数据集上实现了简单自编码器、深度稀疏自编码器和卷积自编码器。

自编码器用途:

目前自编码器的应用主要有两个方面,第一是数据去噪,第二是为进行可视化而降维。配合适当的维度和稀疏约束,自编码器可以学习到比PCA等技术更有意思的数据投影。此外,在数据共有特征建模方面,也有叫广泛的应用。

1、简单自编码器

简单自编码器

from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt
 
(x_train, _), (x_test, _) = mnist.load_data()
 
x_train = x_train.astype("float32") / 255.
x_test = x_test.astype("float32") / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
print(x_train.shape)
print(x_test.shape)
 
encoding_dim = 32
input_img = Input(shape=(784,))
 
encoded = Dense(encoding_dim, activation="relu")(input_img)
decoded = Dense(784, activation="sigmoid")(encoded)
 
autoencoder = Model(inputs=input_img, outputs=decoded)
encoder = Model(inputs=input_img, outputs=encoded)
 
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
 
decoder = Model(inputs=encoded_input, outputs=decoder_layer(encoded_input))
 
autoencoder.compile(optimizer="adadelta", loss="binary_crossentropy")
 
autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, 
  shuffle=True, validation_data=(x_test, x_test))
 
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)
 
n = 10 # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
 ax = plt.subplot(2, n, i + 1)
 plt.imshow(x_test[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 ax = plt.subplot(2, n, i + 1 + n)
 plt.imshow(decoded_imgs[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show()

测试效果:

2、深度自编码器、稀疏自编码器

为解决自编码重构损失大的问题,使用多层网络搭建自编码器。对隐层单元施加稀疏性约束的话,会得到更为紧凑的表达,只有一小部分神经元会被激活。在Keras中,我们可以通过添加一个activity_regularizer达到对某层激活值进行约束的目的

import numpy as np 
np.random.seed(1337) # for reproducibility 
 
from keras.datasets import mnist 
from keras.models import Model #泛型模型 
from keras.layers import Dense, Input 
import matplotlib.pyplot as plt 
 
# X shape (60,000 28x28), y shape (10,000, ) 
(x_train, _), (x_test, y_test) = mnist.load_data() 
 
# 数据预处理 
x_train = x_train.astype("float32") / 255. # minmax_normalized 
x_test = x_test.astype("float32") / 255. # minmax_normalized 
x_train = x_train.reshape((x_train.shape[0], -1)) 
x_test = x_test.reshape((x_test.shape[0], -1)) 
print(x_train.shape) 
print(x_test.shape) 
 
# 压缩特征维度至2维 
encoding_dim = 2 
 
# this is our input placeholder 
input_img = Input(shape=(784,)) 
 
# 编码层 
encoded = Dense(128, activation="relu")(input_img) 
encoded = Dense(64, activation="relu")(encoded) 
encoded = Dense(10, activation="relu")(encoded) 
encoder_output = Dense(encoding_dim)(encoded) 
 
# 解码层 
decoded = Dense(10, activation="relu")(encoder_output) 
decoded = Dense(64, activation="relu")(decoded) 
decoded = Dense(128, activation="relu")(decoded) 
decoded = Dense(784, activation="tanh")(decoded) 
 
# 构建自编码模型 
autoencoder = Model(inputs=input_img, outputs=decoded) 
 
# 构建编码模型 
encoder = Model(inputs=input_img, outputs=encoder_output) 
 
# compile autoencoder 
autoencoder.compile(optimizer="adam", loss="mse") 
 
autoencoder.summary()
encoder.summary()
 
# training 
autoencoder.fit(x_train, x_train, epochs=10, batch_size=256, shuffle=True) 
 
# plotting 
encoded_imgs = encoder.predict(x_test) 
 
plt.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], c=y_test,s=3) 
plt.colorbar() 
plt.show() 
 
decoded_imgs = autoencoder.predict(x_test)
# use Matplotlib (don"t ask)
import matplotlib.pyplot as plt
 
n = 10 # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
 # display original
 ax = plt.subplot(2, n, i + 1)
 plt.imshow(x_test[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 # display reconstruction
 ax = plt.subplot(2, n, i + 1 + n)
 plt.imshow(decoded_imgs[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show() 

运行结果:

3、卷积自编码器

卷积自编码器的编码器部分由卷积层和MaxPooling层构成,MaxPooling负责空域下采样。而解码器由卷积层和上采样层构成。

from keras.layers import Input, Dense, Convolution2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras.datasets import mnist
import numpy as np
 
(x_train, _), (x_test, _) = mnist.load_data()
 
x_train = x_train.astype("float32") / 255.
x_test = x_test.astype("float32") / 255.
print("---> x_train shape: ", x_train.shape)
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))
print("---> xtrain shape: ", x_train.shape)
print("---> x_test shape: ", x_test.shape)
input_img = Input(shape=(28, 28, 1))
 
x = Convolution2D(16, (3, 3), activation="relu", padding="same")(input_img)
x = MaxPooling2D((2, 2), padding="same")(x)
x = Convolution2D(8, (3, 3), activation="relu", padding="same")(x)
x = MaxPooling2D((2, 2), padding="same")(x)
x = Convolution2D(8, (3, 3), activation="relu", padding="same")(x)
encoded = MaxPooling2D((2, 2), padding="same")(x)
 
x = Convolution2D(8, (3, 3), activation="relu", padding="same")(encoded)
x = UpSampling2D((2, 2))(x)
x = Convolution2D(8, (3, 3), activation="relu", padding="same")(x)
x = UpSampling2D((2, 2))(x)
x = Convolution2D(16, (3, 3), activation="relu")(x)
x = UpSampling2D((2, 2))(x)
decoded = Convolution2D(1, (3, 3), activation="sigmoid", padding="same")(x)
 
autoencoder = Model(inputs=input_img, outputs=decoded)
autoencoder.compile(optimizer="adadelta", loss="binary_crossentropy")
 
# 打开一个终端并启动TensorBoard,终端中输入 tensorboard --logdir=/autoencoder
autoencoder.fit(x_train, x_train, epochs=10, batch_size=256,
  shuffle=True, validation_data=(x_test, x_test))
 
decoded_imgs = autoencoder.predict(x_test)
import matplotlib.pyplot as plt
decoded_imgs = autoencoder.predict(x_test)
 
n = 10
plt.figure(figsize=(20, 4))
for i in range(1, n+1):
 # display original
 ax = plt.subplot(2, n, i)
 plt.imshow(x_test[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 # display reconstruction
 ax = plt.subplot(2, n, i + n)
 plt.imshow(decoded_imgs[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show()

训练结果展示:

以上这篇Keras搭建自编码器操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程笔记。

原文链接:https://blog.csdn.net/mago2015/article/details/86164668


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 都会|可能会_###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了###haohaohao###图神经网络之神器——PyTorchGeometric上手&实战相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
zhefu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有