人工智能人工智能

2019-04-14

2019-04-14  本文已影响0人  sea_monster

自编码器,解码器,编码器模型

原文:
Manifold Learning和Autoencoders
不是我写的:)

autoencoder图0.jpg
自编码器是一种前馈神经网络,它试图学习数据的低维表示。它通过减少网络中间的层数(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情况。

上一篇下一篇

猜你喜欢

热点阅读