Hinton과 Salakhutdinov의 2006 Science 논문의 주요 수치는 다음과 같습니다.
원래 784 치수에서 MNIST 데이터 세트 ( 한 자릿수의 흑백 이미지)의 치수 축소를 보여줍니다 .28 × 28
그것을 재현 해 봅시다. 이와 같은 간단한 딥 러닝 작업에는 Keras (Tensorflow 위에서 실행되는 고급 라이브러리)를 사용하는 것이 훨씬 쉽기 때문에 Tensorflow를 직접 사용하지 않을 것입니다. H & S 는 물류 장치가있는 아키텍처를 사용했으며, 제한된 Boltzmann 머신 스택으로 사전 교육을 받았습니다. 10 년 후, 이것은 매우 오래된 학교 인 것 같습니다. 더 간단한 784 → 512 → 128 → 2 → 128 → 512 →
784 → 1000 → 500 → 250 → 2 → 250 → 500 → 1000 → 784
사전 훈련없이 지수 선형 단위를 가진
784 아키텍처. 나는 Adam 옵티 마이저 (모멘텀에 따른 적응 적 확률 구배 하강의 특정 구현)를 사용할 것이다.
784 → 512 → 128 → 2 → 128 → 512 → 784
코드는 Jupyter 노트북에서 복사하여 붙여 넣습니다. Python 3.6에서는 matplotlib (pylab 용), NumPy, seaborn, TensorFlow 및 Keras를 설치해야합니다. Python 셸에서 실행할 때 plt.show()
플롯을 표시 하기 위해 추가해야 할 수 있습니다 .
초기화
%matplotlib notebook
import pylab as plt
import numpy as np
import seaborn as sns; sns.set()
import keras
from keras.datasets import mnist
from keras.models import Sequential, Model
from keras.layers import Dense
from keras.optimizers import Adam
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784) / 255
x_test = x_test.reshape(10000, 784) / 255
PCA
mu = x_train.mean(axis=0)
U,s,V = np.linalg.svd(x_train - mu, full_matrices=False)
Zpca = np.dot(x_train - mu, V.transpose())
Rpca = np.dot(Zpca[:,:2], V[:2,:]) + mu # reconstruction
err = np.sum((x_train-Rpca)**2)/Rpca.shape[0]/Rpca.shape[1]
print('PCA reconstruction error with 2 PCs: ' + str(round(err,3)));
이 결과는 다음과 같습니다.
PCA reconstruction error with 2 PCs: 0.056
오토 인코더 훈련
m = Sequential()
m.add(Dense(512, activation='elu', input_shape=(784,)))
m.add(Dense(128, activation='elu'))
m.add(Dense(2, activation='linear', name="bottleneck"))
m.add(Dense(128, activation='elu'))
m.add(Dense(512, activation='elu'))
m.add(Dense(784, activation='sigmoid'))
m.compile(loss='mean_squared_error', optimizer = Adam())
history = m.fit(x_train, x_train, batch_size=128, epochs=5, verbose=1,
validation_data=(x_test, x_test))
encoder = Model(m.input, m.get_layer('bottleneck').output)
Zenc = encoder.predict(x_train) # bottleneck representation
Renc = m.predict(x_train) # reconstruction
내 작업 데스크탑에서 약 35 초가 걸리고 출력됩니다.
Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - 7s - loss: 0.0577 - val_loss: 0.0482
Epoch 2/5
60000/60000 [==============================] - 7s - loss: 0.0464 - val_loss: 0.0448
Epoch 3/5
60000/60000 [==============================] - 7s - loss: 0.0438 - val_loss: 0.0430
Epoch 4/5
60000/60000 [==============================] - 7s - loss: 0.0423 - val_loss: 0.0416
Epoch 5/5
60000/60000 [==============================] - 7s - loss: 0.0412 - val_loss: 0.0407
두 번의 훈련 시대 만에 PCA 손실을 능가했음을 이미 알 수 있습니다.
( activation='linear'
그러므로 모든 활성화 기능을 변경 하고 손실이 PCA 손실에 정확하게 수렴하는 방식을 관찰하는 것이 유익합니다. 이는 선형 자동 인코더가 PCA와 동일하기 때문입니다.)
병목 현상 표현과 함께 PCA 프로젝션 플로팅
plt.figure(figsize=(8,4))
plt.subplot(121)
plt.title('PCA')
plt.scatter(Zpca[:5000,0], Zpca[:5000,1], c=y_train[:5000], s=8, cmap='tab10')
plt.gca().get_xaxis().set_ticklabels([])
plt.gca().get_yaxis().set_ticklabels([])
plt.subplot(122)
plt.title('Autoencoder')
plt.scatter(Zenc[:5000,0], Zenc[:5000,1], c=y_train[:5000], s=8, cmap='tab10')
plt.gca().get_xaxis().set_ticklabels([])
plt.gca().get_yaxis().set_ticklabels([])
plt.tight_layout()
재건
이제 재구성 (첫 번째 행-원본 이미지, 두 번째 행-PCA, 세 번째 행-자동 인코더)을 살펴 보겠습니다.
plt.figure(figsize=(9,3))
toPlot = (x_train, Rpca, Renc)
for i in range(10):
for j in range(3):
ax = plt.subplot(3, 10, 10*j+i+1)
plt.imshow(toPlot[j][i,:].reshape(28,28), interpolation="nearest",
vmin=0, vmax=1)
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.tight_layout()
더 깊은 네트워크, 정규화 및 더 긴 교육으로 훨씬 더 나은 결과를 얻을 수 있습니다. 실험. 딥 러닝은 쉽습니다!