2006 সালে হিন্টন এবং সালখুদ্দিনভের বিজ্ঞান পত্রিকার মূল চিত্রটি এখানে:
এটি এমএনআইএসটি ডেটাসেটের আসল মাত্রা হ্রাস দেখায় ( একক অঙ্কের কালো এবং সাদা চিত্রগুলি) আসল 784 মাত্রা থেকে দুটি করে।28 × 28
এর পুনরুত্পাদন করার চেষ্টা করা যাক। আমি সরাসরি টেনসরফ্লো ব্যবহার করব না, কারণ এর মতো সহজ গভীর শেখার কাজের জন্য কেরাস (টেনসরফ্লোয়ের শীর্ষে একটি উচ্চ-স্তরের গ্রন্থাগার) ব্যবহার করা অনেক সহজ। এইচএন্ডএস লজিস্টিক ইউনিটগুলির সাথে আর্কিটেকচার ব্যবহার করেছে, সীমাবদ্ধ বল্টজম্যান মেশিনগুলির স্ট্যাকের সাথে প্রাক-প্রশিক্ষিত। দশ বছর পরে, এটি খুব পুরানো-স্কুল মনে হচ্ছে। আমি কোনও প্রাক-প্রশিক্ষণ ছাড়াই ঘৃণ্য রৈখিক ইউনিট সহ সহজতর আর্কিটেকচার ব্যবহার করব। আমি অ্যাডাম অপ্টিমাইজার ব্যবহার করব (গতির সাথে অভিযোজিত স্টোকাস্টিক গ্রেডিয়েন্ট বংশদ্ভুতের একটি বিশেষ প্রয়োগ)।
784 → 1000 → 500 → 250 → 2 → 250 → 500 → 1000 → 784
784 → 512 → 128 → 2 → 128 → 512 → 784
কোডটি একটি বৃহত্তর নোটবুক থেকে কপি-পেস্ট করা হয়েছে। পাইথন ৩.6-এ আপনাকে ম্যাটপ্ল্লোলিব (পাইল্যাবের জন্য), নুমপি, সমুদ্র সৈকত, টেনসরফ্লো এবং কেরাস ইনস্টল করতে হবে। পাইথন শেলটিতে চলার 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
পিসিএ
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
সুতরাং আপনি ইতিমধ্যে দেখতে পাচ্ছেন যে আমরা কেবল দুটি প্রশিক্ষণ পর্বের পরে পিসিএ ক্ষতি ছাড়িয়েছি।
(যাইহোক, সমস্ত অ্যাক্টিভেশন ফাংশনগুলিতে পরিবর্তন হওয়া activation='linear'
এবং লোকসানটি কীভাবে পিসিএ ক্ষতির সাথে নিখুঁতভাবে রূপান্তরিত হয় তা পর্যবেক্ষণ করার জন্য এটি শিক্ষামূলক । কারণ এটি লিনিয়ার অটোইনকোডার পিসিএর সমতুল্য))
বাধা-উপস্থাপনের পাশাপাশি পাশাপাশি পিসিএ প্রজেকশন প্লট করা হচ্ছে
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()
reconstructions
এবং এখন পুনর্নির্মাণগুলি দেখি (প্রথম সারি - মূল চিত্রগুলি, দ্বিতীয় সারিতে - পিসিএ, তৃতীয় সারিতে - স্বতঃ কোডার):
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()
গভীর নেটওয়ার্ক, কিছু নিয়মিতকরণ এবং দীর্ঘতর প্রশিক্ষণের মাধ্যমে কেউ আরও ভাল ফলাফল পেতে পারে। পরীক্ষা। গভীর শেখা সহজ!