2019-04-14

作者: sea_monster | 来源:发表于2019-04-14 09:36 被阅读0次

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

    原文:
    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情况。

    相关文章

      网友评论

        本文标题:2019-04-14

        本文链接:https://www.haomeiwen.com/subject/okkjwqtx.html