深度学习——keras训练AutoEncoder模型

来源:互联网 发布:淘宝女装好店铺推荐 编辑:程序博客网 时间:2024/06/05 21:03

深度学习——keras训练AutoEncoder模型

安装keras:

先安装anaconda,再运行conda install keras,参照:
http://blog.csdn.net/qq_32329377/article/details/53008019


下载AutoEncoder模型训练代码:

https://github.com/MorvanZhou/tutorials/tree/master/kerasTUT
注意:需给每个文件加# -*- coding: utf-8 -*,否则会出现noASCII错误。


训练代码细解:

自编码,简单来说就是把输入数据进行一个压缩和解压缩的过程。原来有很多特征,压缩成几个来代表原来的数据,解压之后恢复成原来的维度,再和原数据进行比较。它是一种非监督算法,只需要输入数据,解压缩之后的结果与原数据本身进行比较。程序的主要功能是把 datasets.mnist 数据的 28*28=784 维的数据,压缩成 2 维的数据,然后在一个二维空间中可视化出分类的效果。
首先,导入数据并进行数据预处理,本例使用Model模块的Keras的泛化模型来进行模型搭建,便于我们从模型中间导出数据并进行可视化。进行模型搭建的时候,注意要进行逐层特征提取,最终压缩至2维,解码的过程要跟编码过程一致相反。随后对Autoencoder和encoder分别建模,编译、训练。将编码模型的预测结果通过Matplotlib可视化出来,就可以看到原数据的二维编码结果在二维平面上的聚类效果,还是很明显的。

  • 导入相关Python和keras模块(module):
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  

需要注意的是,如果在Ubuntu下我们使用的远程命令行方式,因为在远程命令行的环境下显示不了图形界面,所以需要加入下面的两行代码(且需放在import matplotlib.pyplot as plt前),否则会运行报错。但是在Ubuntu的图形化界面下(比如,远程桌面或VNC Viewer)不需要。

import matplotlib  matplotlib.use('Agg')
  • 加载数据集
# x shape (60,000 28x28), y shape (10,000, )(x_train, _), (x_test, y_test) = mnist.load_data()
  • 数据预处理
# data pre-processingx_train = x_train.astype('float32') / 255. - 0.5       # minmax_normalizedx_test = x_test.astype('float32') / 255. - 0.5         # minmax_normalizedx_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

接下来就是建立encodeddecoded,再用 autoencoder 把二者组建在一起。训练时用 autoencoder

  • 建立编码层
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)

encoded 用4层 Dense 全联接层,激活函数用 relu,输入的维度就是前一步定义的 input_img
接下来定义下一层,它的输出维度是64,输入是上一层的输出结果。
在最后一层,我们定义它的输出维度就是想要的 encoding_dim=2

  • 建立解码层
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) 

解压的环节,它的过程和压缩的过程是正好相反的。相对应层的激活函数也是一样的,不过在解压的最后一层用到的激活函数是 tanh。 因为输入值是由 -0.5 到 0.5 这个范围,在最后一层用这个激活函数的时候,它的输出是 -1 到 1,可以是作为一个很好的对应。

  • 构建自编码模型
autoencoder = Model(inputs=input_img, outputs=decoded)

直接用 Model 这个模块来组建模型,输入就是图片,输出是解压的最后的结果。

  • 模型组建
encoder = Model(inputs=input_img, outputs=encoder_output) 

由 784维压缩到 2维,输入是图片,输出是压缩环节的最后结果。

  • 编译模型
autoencoder.compile(optimizer='adam', loss='mse')  

优化器用的是 adam,损失函数用的是 mse

  • 训练模型
autoencoder.fit(x_train, x_train, epochs=20, batch_size=256, shuffle=True)  

由于autocoder是一个压缩和解压的过程,所以它的输入和输出是一样的,都是训练集x。

  • 可视化
encoded_imgs = encoder.predict(x_test)  plt.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], c=y_test, s=3)  plt.colorbar()  plt.show() 

终端操作:
ubuntu上:
打开到代码目录:

cd ~/keras/tutorials/kerasTUT

开始训练:

python 9-Autoencoder_example.py

训练结果图:

这里写图片描述

文章借鉴https://morvanzhou.github.io/tutorials/machine-learning/keras/2-6-autoencoder/