自编码器,解码器,编码器模型
原文:
Manifold Learning和Autoencoders
不是我写的:)
自编码器是一种前馈神经网络,它试图学习数据的低维表示。它通过减少网络中间的层数(encoder),然后将其增加回原始图像的尺寸来实现(decoder)。
重要原则是自动编码器可以仅表示重建训练示例所需的变化。如果数据生成分布集中在低维流形附近,则会隐式捕获该流形在局部坐标系的表示:只有与x周围的流形相切的变化需要对应于h = f(x)的变化。
自编码器,解码器,编码器模型
import一些重要参数
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Model
from keras.layers import Dense, Flatten, Input
from keras.optimizers import adam
自编码器
input_img = Input(shape=(784,))
encoded = Dense(64, activation='relu')(input_img)
encoded = Dense(2)(encoded) #keep it linear here.
decoded = Dense(64, activation='relu')(encoded)
decoded = Dense(784, activation = 'sigmoid')(decoded)
autoencoder = Model(input=input_img, output=decoded)
#添加参数和训练
autoencoder.compile(optimizer = "adam", loss = "mse")
autoencoder.fit(X_flat, X_flat, batch_size = 128,nb_epoch = 10, verbose = 3)
编译和运行
autoencoder.compile(optimizer = "adam", loss = "mse")
autoencoder.fit(X_flat, X_flat, batch_size = 128,nb_epoch = 10, verbose = 3)
encoder
encoder = Model(input = input_img, output = encoded)
decoder
# building the decoder
encoded_input = Input(shape=(2,))
encoded_layer_1 = autoencoder.layers[-2]
encoded_layer_2 = autoencoder.layers[-1]
decoder = encoded_layer_1(encoded_input)
decoder = encoded_layer_2(decoder)
decoder = Model(input=encoded_input, output=decoder)
样本预测和作图
import seaborn as sns
X_proj = encoder.predict(X_flat[:10000])
X_proj.shape
proj = pd.DataFrame(X_proj)
proj.columns = ["comp_1", "comp_2"]
proj["labels"] = y_train[:10000]
sns.lmplot("comp_1", "comp_2",hue = "labels", data = proj, fit_reg=False)
结果图:
autoencoder.png我们可以看到autoencoder在分离某些类别(如1,0和4)方面做得不错。它比PCA好,但不如TSNE好。自编码器学可以学习到更好的表示,比较简单的方法,如PCA,因为它可以检测数据的非线性,因为它的relu激活。实际上,如果我们使用线性激活函数并且只使用一个隐藏层,我们就可以恢复PCA情况。
网友评论