安装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可视化出来,就可以看到原数据的二维编码结果在二维平面上的聚类效果,还是很明显的。
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-processing
x_train = x_train.astype('float32') / 255. - 0.5 # minmax_normalized
x_test = x_test.astype('float32') / 255. - 0.5 # 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)
encoding_dim = 2
接下来就是建立encoded
和decoded
,再用 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/