পিসিএকে ছাড়িয়ে যাওয়ার জন্য টেনসরফ্লোতে একটি অটোরকোডার তৈরি করা


31

নিউরাল নেটওয়ার্কের সাহায্যে ডেটার ডাইমেনশনালিটি হ্রাস করতে হিন্টন এবং সালখুতদিনভ , বিজ্ঞান 2006 একটি গভীর অটোরকোডার ব্যবহারের মাধ্যমে একটি অ-লিনিয়ার পিসিএ প্রস্তাব করেছিল। আমি বেশ কয়েকবার টেনসরফ্লো দিয়ে একটি পিসিএ অটোরকোডার তৈরি এবং প্রশিক্ষণের চেষ্টা করেছি তবে আমি লিনিয়ার পিসিএর চেয়ে ভাল ফলাফল কখনই অর্জন করতে পারিনি।

আমি কীভাবে একটি স্বয়ংক্রিয়কোডারকে দক্ষতার সাথে প্রশিক্ষণ দিতে পারি?

(পরে @amoeba দ্বারা সম্পাদনা করুন: এই প্রশ্নের মূল সংস্করণে পাইথন টেনসরফ্লো কোড রয়েছে যা সঠিকভাবে কাজ করে নি One এটি সম্পাদনা ইতিহাসে এটি খুঁজে পেতে পারে))


স্তর স্তরটির অ্যাক্টিভেশন ফাংশনে আমি একটি ত্রুটি পেয়েছি। এখন যদি এটি কাজ করে তবে আমি পরীক্ষা করছি
ডোনবিও

আপনি কি আপনার ত্রুটি ঠিক করেছেন?
পিনোচিও

হাই ডনবিও আপনার প্রশ্ন থেকে কোড সরিয়ে দিতে আমি স্বাধীনতা নিয়েছি (কোডটি সম্পাদনার ইতিহাসে সহজেই পাওয়া যাবে)। কোড সহ, আপনার প্রশ্নটি কিছুটা "আমাকে একটি বাগ খুঁজে পেতে সহায়তা করুন" ধরণের প্রশ্নের মতো দেখায় যা এখানে অফ-টপিক। একই সময়ে, এই থ্রেডটিতে 4 কে ভিউ রয়েছে, সম্ভবত এটির অর্থ হ'ল গুগল অনুসন্ধানের মাধ্যমে প্রচুর লোক এখানে আসে, তাই আমি আপনার প্রশ্নটি বন্ধ করতে চাইনি। আমি একটি স্বয়ংক্রিয়কোডার ওয়াক-থ্রো দিয়ে একটি উত্তর পোস্ট করার সিদ্ধান্ত নিয়েছি, তবে সরলতার কারণে আমি কাঁচা টেনসরফ্লোয়ের পরিবর্তে কেরাস (টেনসরফ্লোয়ের শীর্ষে চলছে) ব্যবহার করেছি। আপনি কি মনে করেন এটি আপনার প্রশ্নটির উত্তর দেয়?
অ্যামিবা বলছেন

উত্তর:


42

2006 সালে হিন্টন এবং সালখুদ্দিনভের বিজ্ঞান পত্রিকার মূল চিত্রটি এখানে:

এটি এমএনআইএসটি ডেটাসেটের আসল মাত্রা হ্রাস দেখায় ( একক অঙ্কের কালো এবং সাদা চিত্রগুলি) আসল 784 মাত্রা থেকে দুটি করে।28×28

এর পুনরুত্পাদন করার চেষ্টা করা যাক। আমি সরাসরি টেনসরফ্লো ব্যবহার করব না, কারণ এর মতো সহজ গভীর শেখার কাজের জন্য কেরাস (টেনসরফ্লোয়ের শীর্ষে একটি উচ্চ-স্তরের গ্রন্থাগার) ব্যবহার করা অনেক সহজ। এইচএন্ডএস লজিস্টিক ইউনিটগুলির সাথে আর্কিটেকচার ব্যবহার করেছে, সীমাবদ্ধ বল্টজম্যান মেশিনগুলির স্ট্যাকের সাথে প্রাক-প্রশিক্ষিত। দশ বছর পরে, এটি খুব পুরানো-স্কুল মনে হচ্ছে। আমি কোনও প্রাক-প্রশিক্ষণ ছাড়াই ঘৃণ্য রৈখিক ইউনিট সহ সহজতর আর্কিটেকচার ব্যবহার করব। আমি অ্যাডাম অপ্টিমাইজার ব্যবহার করব (গতির সাথে অভিযোজিত স্টোকাস্টিক গ্রেডিয়েন্ট বংশদ্ভুতের একটি বিশেষ প্রয়োগ)।

784100050025022505001000784
7845121282128512784

কোডটি একটি বৃহত্তর নোটবুক থেকে কপি-পেস্ট করা হয়েছে। পাইথন ৩.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()

এখানে চিত্র বর্ণনা লিখুন

গভীর নেটওয়ার্ক, কিছু নিয়মিতকরণ এবং দীর্ঘতর প্রশিক্ষণের মাধ্যমে কেউ আরও ভাল ফলাফল পেতে পারে। পরীক্ষা। গভীর শেখা সহজ!


2
আমি অবাক হয়েছি মাত্র 2 টি উপাদান নিয়ে পিসিএ কতটা ভাল কাজ করেছে! কোড পোস্ট করার জন্য ধন্যবাদ
ਅਕশকল

2
উদ্ভট! Stupendousness!
ম্যাথু

2
@ শাদী আমি আসলে এসভিডি () সহজ :) এর সরাসরি কল পেয়েছি
অ্যামিবা বলেছেন মনিকার

1
আরও উপাদান ব্যবহার করার সময় পারফরম্যান্সের পার্থক্য আরও বেশি। আমি দুটির পরিবর্তে 10 টি চেষ্টা করেছি এবং অটোরকোডারটি আরও ভাল ছিল। অসুবিধাটি হ'ল গতি এবং মেমরির খরচ
আকাকাল

1
অজগর 2 এর জন্য আপনাকে নিম্নলিখিত আমদানিগুলি যুক্ত করতে হবেfrom __future__ import absolute_import from __future__ import division from __future__ import print_function
ব্যবহারকারী 2589273

7

এই দুর্দান্ত উদাহরণটি দেওয়ার জন্য @ অ্যামিবার কাছে বিশাল প্রপস। আমি কেবল এটিই দেখাতে চাই যে সেই পোস্টে বর্ণিত অটো-এনকোডার প্রশিক্ষণ এবং পুনর্নির্মাণের পদ্ধতিটিও একই ধরণের স্বাচ্ছন্দ্যে আর করা যেতে পারে। নীচের অটো-এনকোডারটি সেটআপ করা হয়েছে যাতে এটি অ্যামিবার উদাহরণটিকে যথাসম্ভব নিকটস্থ করে তোলে - একই অপটিমাইজার এবং সামগ্রিক আর্কিটেকচার। টেনসরফ্লো ব্যাক-এন্ড একইভাবে বীজ না হওয়ার কারণে সঠিক ব্যয়গুলি পুনরুত্পাদনযোগ্য নয়।

Initialisation

library(keras)
library(rARPACK) # to use SVDS
rm(list=ls())
mnist   = dataset_mnist()
x_train = mnist$train$x
y_train = mnist$train$y
x_test  = mnist$test$x
y_test  = mnist$test$y

# reshape & rescale
dim(x_train) = c(nrow(x_train), 784)
dim(x_test)  = c(nrow(x_test), 784)
x_train = x_train / 255
x_test = x_test / 255

পিসিএ

mus = colMeans(x_train)
x_train_c =  sweep(x_train, 2, mus)
x_test_c =  sweep(x_test, 2, mus)
digitSVDS = svds(x_train_c, k = 2)

ZpcaTEST = x_test_c %*% digitSVDS$v # PCA projection of test data

Autoencoder

model = keras_model_sequential() 
model %>%
  layer_dense(units = 512, activation = 'elu', input_shape = c(784)) %>%  
  layer_dense(units = 128, activation = 'elu') %>%
  layer_dense(units = 2,   activation = 'linear', name = "bottleneck") %>%
  layer_dense(units = 128, activation = 'elu') %>% 
  layer_dense(units = 512, activation = 'elu') %>% 
  layer_dense(units = 784, activation='sigmoid')

model %>% compile(
  loss = loss_mean_squared_error, optimizer = optimizer_adam())

history = model %>% fit(verbose = 2, validation_data = list(x_test, x_test),
                         x_train, x_train, epochs = 5, batch_size = 128)

# Unsurprisingly a 3-year old laptop is slower than a desktop
# Train on 60000 samples, validate on 10000 samples
# Epoch 1/5
#  - 14s - loss: 0.0570 - val_loss: 0.0488
# Epoch 2/5
#  - 15s - loss: 0.0470 - val_loss: 0.0449
# Epoch 3/5
#  - 15s - loss: 0.0439 - val_loss: 0.0426
# Epoch 4/5
#  - 15s - loss: 0.0421 - val_loss: 0.0413
# Epoch 5/5
#  - 14s - loss: 0.0408 - val_loss: 0.0403

# Set the auto-encoder
autoencoder = keras_model(model$input, model$get_layer('bottleneck')$output)
ZencTEST = autoencoder$predict(x_test)  # bottleneck representation  of test data

বাধা-উপস্থাপনের পাশাপাশি পাশাপাশি পিসিএ প্রজেকশন প্লট করা হচ্ছে

par(mfrow=c(1,2))
myCols = colorRampPalette(c('green',     'red',  'blue',  'orange', 'steelblue2',
                            'darkgreen', 'cyan', 'black', 'grey',   'magenta') )
plot(ZpcaTEST[1:5000,], col= myCols(10)[(y_test+1)], 
     pch=16, xlab = 'Score 1', ylab = 'Score 2', main = 'PCA' ) 
legend( 'bottomright', col= myCols(10), legend = seq(0,9, by=1), pch = 16 )

plot(ZencTEST[1:5000,], col= myCols(10)[(y_test+1)], 
     pch=16, xlab = 'Score 1', ylab = 'Score 2', main = 'Autoencoder' ) 
legend( 'bottomleft', col= myCols(10), legend = seq(0,9, by=1), pch = 16 )

এখানে চিত্র বর্ণনা লিখুন

reconstructions

আমরা স্বাভাবিক পদ্ধতিতে অঙ্কগুলির পুনর্গঠন করতে পারি। (শীর্ষ সারিটি মূল অঙ্কগুলি, মাঝারি সারির পিসিএ পুনর্গঠন এবং নীচে সারিটি স্বয়ংক্রিয় কোডার পুনর্গঠন))

Renc = predict(model, x_test)        # autoencoder reconstruction
Rpca = sweep( ZpcaTEST %*% t(digitSVDS$v), 2, -mus) # PCA reconstruction

dev.off()
par(mfcol=c(3,9), mar = c(1, 1, 0, 0))
myGrays = gray(1:256 / 256)
for(u in seq_len(9) ){
  image( matrix( x_test[u,], 28,28, byrow = TRUE)[,28:1], col = myGrays, 
         xaxt='n', yaxt='n')
  image( matrix( Rpca[u,], 28,28, byrow = TRUE)[,28:1], col = myGrays , 
         xaxt='n', yaxt='n')
  image( matrix( Renc[u,], 28,28, byrow = TRUE)[,28:1], col = myGrays, 
         xaxt='n', yaxt='n')
}

এখানে চিত্র বর্ণনা লিখুন

0,03560,0359


2
+1 টি। খুশী হলাম। এটি দেখতে ভাল যে পাইথনের মতো আরে কেরাস ব্যবহার করা তত সহজ। আমি যতদূর দেখতে পাচ্ছি, গভীর শিক্ষার সম্প্রদায়টিতে আজকাল প্রত্যেকে পাইথন ব্যবহার করছে, তাই আমার ধারণা ছিল যে এটি অন্য কোথাও আরও কঠিন হওয়া উচিত।
অ্যামিবা বলছেন

2

এখানে আমার জুপিটার নোটবুকটি আমি নীচের পার্থক্য সহ আপনার ফলাফল প্রতিলিপি করার চেষ্টা করি:

  • সরাসরি টেনসরফ্লো ব্যবহার করার পরিবর্তে, আমি এটি কেরাস দেখতে ব্যবহার করি
  • স্যাচুরেশন এড়ানোর জন্য রিলুর পরিবর্তে ফাঁস হওয়া রিবু (যেমন এনকোড আউটপুট 0 হচ্ছে)
    • এটি AE এর খারাপ পারফরম্যান্সের কারণ হতে পারে
  • অটেনকোডার ইনপুটটি ডেটা মাপানো হয় [0,1]
    • আমি মনে করি আমি কোথাও পড়েছি যে রিলুযুক্ত অটোরকোডাররা [0-1] ডেটার সাথে সবচেয়ে ভাল কাজ করে
    • অটেনকোডারগুলির ইনপুটটি গড় = 0, স্টাড = 1 হওয়ায় আমার নোটবুকটি চালনা সমস্ত মাত্রিক হ্রাসের জন্য এই> 0.7 এর জন্য এমএসই দিয়েছে, তাই সম্ভবত এটি আপনার সমস্যাগুলির মধ্যে একটি
  • পিসিএ ইনপুটটিকে ডেটা = 0 এবং স্ট্যান্ড = 1 দিয়ে রাখা হচ্ছে
    • এর অর্থ এইও হতে পারে যে পিসিএর এমএসই ফলাফল পিসিএর এমএসই ফলাফলের সাথে তুলনীয় নয়
    • সম্ভবত আমি পিসিএ এবং এই উভয়ের জন্য [0-1] ডেটা দিয়ে এটি আবার চালাব
  • পিসিএ ইনপুটও [0-1] এ ছোট করা হয়েছে। পিসিএ (মানে = 0, স্টাডি = 1) ডেটাও নিয়ে কাজ করে তবে এমএসই এইয়ের তুলনায় অতুলনীয় হবে

আমার এমএসই ফলাফল পিসিএর জন্য মাত্রা হ্রাস থেকে 1 থেকে 6 হ্রাস করেছে (যেখানে ইনপুটটিতে 6 টি কলাম রয়েছে) এবং মেশানো থেকে এইয়ের জন্য। লাল। 1 থেকে 6 এর নীচে:

পিসিএ ইনপুট সহ (মানে = 0, স্টাড = 1) যখন এই ইনপুট [0-1] সীমা- 4e-15: PCA6 - .015: PCA5 - .0502: AE5 - .0508: AE6 - .051: AE4 - .053: AE3 - .157: PCA4 - .258: AE2 - .259: PCA3 - .377: AE1 - .483: PCA2 - .682: PCA1

  • 9e-15: পিসিএ 6
  • .0094: পিসিএ 5
  • .0502: এই 5
  • .0507: এই 6
  • .0514: এই 4
  • .0532: এই 3
  • .0772: পিসিএ 4
  • .1231: পিসিএ 3
  • .2588: এই 2
  • .2831: পিসিএ 2
  • .3773: এই 1
  • .3885: পিসিএ 1

কোন মাত্রিক হ্রাস সহ লিনিয়ার পিসিএ 9e-15 অর্জন করতে পারে কারণ এটি কেবলমাত্র শেষ উপাদানটিতে ফিট করতে না পেরে পারে যা তা চাপ দিতে পারে।


দয়া করুন, আপনার নোটবুক আমদানির একটি utils প্যাকেজের উদাহরণস্বরূপ অ-মানক ফাংশন অনেক utils.buildNetwork এবং utils.ae_fit_encode_plot_mse আছে মনে হচ্ছে যে ...
Berowne Hlavaty

এটি নোটবুকের মতো একই স্তরের একই সংগ্রহস্থলের কেবল একটি ফাইল।
দয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.