首先,自动编码器的目的是要学习的表示(编码)为一组数据,典型地一毛钱的目的不变性减少。所以,autoencoder的目标输出是自动编码器输入本身。
如[1]所示,如果存在一个线性隐层并且使用均方误差准则来训练网络,那么隐藏单元学习将投入投影在first k principal components
的范围内数据。 在[2]中可以看到,如果隐藏层是非线性的,则自动编码器的行为与PCA的行为不同,能够捕获输入分布的多模态特征。
自动编码器是特定于数据的,这意味着它们只能压缩类似于他们所训练的数据。因此,隐藏层学到的特征的有用性可用于评估该方法的功效。
因此,评估自动编码器降维效果的一种方法是切割中间隐藏层的输出,并通过减少的数据比较所需算法的准确性/性能,而不是使用原始数据。 一般来说,PCA是一种线性方法,而自动编码器通常是非线性的。在数学上,很难将它们比较在一起,但直观上我使用Autoencoder提供了一个降低MNIST数据集维数的例子,以便更好地理解。该代码是在这里:
from keras.datasets import mnist
from keras.models import Model
from keras.layers import Input, Dense
from keras.utils import np_utils
import numpy as np
num_train = 60000
num_test = 10000
height, width, depth = 28, 28, 1 # MNIST images are 28x28
num_classes = 10 # there are 10 classes (1 per digit)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(num_train, height * width)
X_test = X_test.reshape(num_test, height * width)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255 # Normalise data to [0, 1] range
X_test /= 255 # Normalise data to [0, 1] range
Y_train = np_utils.to_categorical(y_train, num_classes) # One-hot encode the labels
Y_test = np_utils.to_categorical(y_test, num_classes) # One-hot encode the labels
input_img = Input(shape=(height * width,))
x = Dense(height * width, activation='relu')(input_img)
encoded = Dense(height * width//2, activation='relu')(x)
encoded = Dense(height * width//8, activation='relu')(encoded)
y = Dense(height * width//256, activation='relu')(x)
decoded = Dense(height * width//8, activation='relu')(y)
decoded = Dense(height * width//2, activation='relu')(decoded)
z = Dense(height * width, activation='sigmoid')(decoded)
model = Model(input_img, z)
model.compile(optimizer='adadelta', loss='mse') # reporting the accuracy
model.fit(X_train, X_train,
epochs=10,
batch_size=128,
shuffle=True,
validation_data=(X_test, X_test))
mid = Model(input_img, y)
reduced_representation =mid.predict(X_test)
out = Dense(num_classes, activation='softmax')(y)
reduced = Model(input_img, out)
reduced.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
reduced.fit(X_train, Y_train,
epochs=10,
batch_size=128,
shuffle=True,
validation_data=(X_test, Y_test))
scores = reduced.evaluate(X_test, Y_test, verbose=1)
print("Accuracy: ", scores[1])
它产生在\ mathbb {R}一$ Y \^{3} $(就像你通过decomposition.PCA(n_components=3)
得到什么)。例如,在这里你看到层y
的输出为数字5
例如在数据集:
class y_1 y_2 y_3
5 87.38 0.00 20.79
正如你在上面的代码中看到,当我们层y
连接到softmax
致密层:
mid = Model(input_img, y)
reduced_representation =mid.predict(X_test)
新模型mid
给我们提供了一个很好的关于95%
的分类精度。因此,可以说y
是数据集的高效提取特征向量。
参考文献:
[1]:Bourlard,埃尔韦,和Yves坎普。 “通过多层感知器和奇异值分解进行自动关联”。生物控制论59.4(1988):291-294。
[2]:Japkowicz,Nathalie,Stephen Jose Hanson和Mark A.Gluck。 “非线性自动关联不等同于PCA。”神经计算12.3(2000):531-545。
https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25/47847014#47847014有什么建议吗? –