مقدمه ای بر آموزش Autoencoderها


هوش مصنوعی، طیف گسترده‌ای از فناوری‌ها و تکنیک‌ها را در برمی‌گیرد که سیستم‌های کامپیوتری را قادر می‌سازد تا مسائلی مانند فشرده سازی داده‌ها که در بینایی ماشین، شبکه‌های کامپیوتری، معماری کامپیوتر و بسیاری از زمینه های دیگر وجود دارند را حل کنند. Autoencoderها یا خودرمزنگارها، شبکه‌های عصبی بدون ناظر هستند که از یادگیری ماشین برای فشرده سازی داده استفاده می‌کنند. در این مقاله به معرفی این شبکه‌ها می‌پردازیم.

خودرمزنگار یا Autoencoder چیست؟

یک شبکه عصبی خودرمزنگار یک الگوریتم یادگیری ماشین بدون ناظر است که از پس انتشار خطا (backpropagation) استفاده می‌کند که مقادیر هدف را با ورودی‌ها تنظیم کند. خودرمزنگارها برای کاهش اندازه ورودی‌ها به کار می‌روند. اگر کسی به داده های اصلی هم نیاز داشته باشد، می‌تواند آن را از روی داده‌های فشرده بازسازی کند.

Autoencoder

ما یک الگوریتم یادگیری ماشین مشابه داریم مانند PCA که همین کار را انجام می‌دهد. بنابراین ممکن است به این مسئله فکر کنید که چرا پس به Autoencoderها نیاز داریم؟ در ادامه دلیل استفاده از Autoencoderها را متوجه می‌شویم.

Autoencoder-vs-PCA

یک Autoencoder می‌تواند تبدیلات غیرخطی را با یک تابع فعالسازی غیرخطی و چندین لایه یاد بگیرد. نیازی به یادگیری لایه های dense نیست. این شبکه از لایه‌های کانولوشنی استفاده می‌کند تا بفهمد که کدام یک برای داده‌های ویدیو، تصویر و سری زمانی بهتر است. یادگیری چندین لایه با یک autoencoder بسیار کارآمدتر از یک تبدیل عظیم با PCA است. یک Autoencoder یک بازنمایی از هر لایه به عنوان خروجی ارائه می‌دهد. می‌تواند از لایه‌های پیش آموزش دیده مدل دیگری استفاده کند و از یادگیری انتقالی برای encoder/decoder استفاده می‌کند.

حال بیایید به چند کاربرد صنعتی Autoencoder نگاهی بیندازیم

کاربردهای Autoencoderها

1)رنگ آمیزی تصویر

Autoencoderها برای تبدیل هر تصویر سیاه و سفیدی به تصویر رنگی استفاده می‌شوند. بسته به آنچه که در تصویر هست، می‌توان تشخیص داد که رنگ هر شی چه چیزی باید باشد.

Image coloring using AE

2)تغییر ویژگی

در این کاربرد، Autoencoder تنها ویژگی‌های موردنیاز یک تصویر را استخراج می‌کند و با حذف هر گونه نویز یا وقفه غیرضروری، خروجی را تولید می‌کند.

Feature variation using AE

3)کاهش ابعاد

تصویر بازسازی شده مشابه ورودی است اما تنها ابعادش کاهش یافته است. این روند کمک می‌کند تا تصویری مشابه با مقدار پیکسل کاهش یافته تولید شود.

Dimension-Reduction-using-AE

4)حذف نویز تصویر

ورودی مشاهده شده توسط autoencoder یک ورودی خام نیست بلکه یک نسخه‌ی تصادفی تخریب شده از ورودی است. یک autoencoder حذف نویز به گونه‌ای آموزش داده می‌شود که ورودی اصلی را از نسخه‌ی نویزی، بازسازی کند.

 

 

Image-Denoising-using-AE

 

 

5)حذف واترمارک (watermark)

همچنین این شبکه برای حذف واترمارک از تصاویر یا حذف هر شی در حین فیلمبرداری ویدیو استفاده می‌شود.

Watermark-deletion-using-AE.

حال که ایده‌ی کلی از کاربردهای صنعتی autonencoderها داریم می‌خواهیم معماری آنها را یاد بگیریم.

معماری Autoencoderها

یک autoencoder از سه لایه تشکیل شده است:

Encoder (رمزگذار)

کد

Decoder (رمزگشا)

Autoencoder-Architecture

رمزگذار: این بخش از شبکه، ورودی را در یک بازنمایی فضای پنهان، فشرده می‌کند. لایه‌ی رمزگذار، تصویر ورودی را به عنوان یک بازنمایی فشرده در ابعاد کاهش یافته، رمزگذاری می‌کند. این تصویر فشرده شده، نسخه تحریف شده‌ی تصویر اصلی است.

کد: این بخش از شبکه، ورودی فشرده شده‌ای را نشان می‌دهد که به رمزگشا تزریق می‌شود.

رمزگشا: این لایه، تصویر رمزگذاری شده را به بعد اصلی رمزگشایی می‌کند. تصویر رمزگشایی شده، بازسازی تصویر اصلی است و از بازنمایی فضای پنهان، بازتولید شده است.

لایه‌ی بین رمزگذار و رمزگشا که به Bottleneck نیز معروف است یک رویکرد خوب طراحی شده برای تصمیم گیری است که کدام جنبه از داده‌های مشاهده شده، اطلاعات مرتبط هستند و کدام بخش‌ها را می‌توان حذف کرد. این کار با دو معیار انجام می‌شود:

فشردگی بازنمایی که به عنوان قابلیت فشرده سازی (compressibility) سنجیده می‌شود.

Bottleneck-in-AE

حال می‌خواهیم ویژگی‌های مختلف هایپرپارامترهای موجود در آموزش autoencoderها را بررسی کنیم.

ویژگی‌ها و هایپرپارامترها

ویژگی‌های autoencoderها:

مختص به داده: شبکه‌های autoencoder تنها می‌توانند داده‌های مشابه آن چیزی که در زمان آموزش دیده‌اند را فشرده کنند.

Lossy: خروجی‌های فشرده شده در مقایسه با ورودی‌های اصلی، کاهش می‌یابند.

یاد گرفته شده به طور خودکار از مثال‌ها: بسیار ساده است که نمونه‌های اختصاصی از الگوریتم‌ها را آموزش داد که روی نوع خاصی از ورودی عملکرد خوبی دارند.

هایپرپارامترهای Autoencoder

4 هایپرپارامتر وجود دارند که باید قبل از آموزش autoencoder تنظیم شوند:

سایز کد: این هایپرپارامتر نشانگر تعداد نورون ها در لایه‌ی میانی است. اندازه کوچکتر آن باعث فشرده‌سازی بیشتر ورودی می‌شود.

تعداد لایه‌ها: یک autoencoder را می‌توان با هر تعداد لایه که بخواهیم تشکیل بدهیم.

تعداد نورون‌ها در هر لایه: تعداد نورون‌ها در هر لایه با لایه‌ی بعدی رمزگذار کاهش می‌یابد و سپس در قسمت رمزگشا افزایش می‌یابد. رمزگشا از نظر ساختار لایه با رمزگذار، متقارن است.

تابع Loss: ما یا از میانگین مربعات خطا یا cross-entropy باینری باید استفاده کنیم. اگر مقادیر ورودی در محدوده‌ی [0,1] باشند ما معمولا‍ً از cross-entropy استفاده می‌کنیم و در غیر این صورت از میانگین مربعات خطا استفاده می‌کنیم.

Autoencoder-properties

انواع Autoencoderها

1) Convolution Autoencoderها

شبکه‌های autoencoder در فرمول اولیه‌ی خود این واقعیت را در نظر نمی‌گیرند که یک سیگنال را می‌توان به عنوان مجموع سیگنال‌های دیگر دید. Convolutional autoencoderها از عملگر کانولوشن استفاده می‌کنند تا از این مشاهدات بهره ببرند. آنها یاد می‌گیرند که ورودی را در مجموعه‌ای از سیگنال‌های ساده رمزگذاری کنند و سعی می‌کنند ورودی را از آنها بازسازی کنند و هندسه یا بازتاب تصویر را تغییر دهند.

Convolution-Autoencoder

کاربردهای مدل کانولوشنی این شبکه عبارتند از:

-بازسازی تصویر

-رنگ آمیز تصویر

-خوشه بندی فضای پنهان

-تولید تصاویر با رزولوشن بالاتر

2)Autoencoderهای پراکنده

Autoencoderهای پراکنده، روشی جایگزین ارائه می‌دهند تا یک bottleneck اطلاعاتی معرفی شود بدون اینکه نیاز باشد تعداد نورون‌ها در لایه‌ی پنهان کاهش یابد. در عوض ما loss function را به گونه‌ای می‌سازیم که فعالسازی‌های درون یک لایه را جریمه کنیم.

sparse autoencoder

3)Autoencoderهای عمیق

اولین لایه‌ی Autoencoder عمیق برای ویژگی‌های مرتبه اول در ورودی خام استفاده می‌شود. لایه‌ی دوم برای ویژگی‌های مرتبه دوم مربوط به الگوهای ویژگی مرتبه اول استفاده می‌شود. لایه‌های عمیق‌تر Autoencoder عمیق، ویژگی‌های مرتبه بالاتری را می‌آموزند.

یک شبکه Autoencoder عمیق از دو شبکه باور عمیق متقارن تشکیل شده است:

-چهار یا پنج لایه کم عمق نشانگر نیمه‌ی رمزگذاری شبکه هستند.

مجموعه دوم چهار یا پنج لایه، نشانگر نیمه‌ی رمزگشایی هستند.

Deep autoencoder.

کاربردهای autoencoder عمیق عبارتند از:

-جستجوی تصویر

-فشرده سازی داده

-بازیابی اطلاعات (IR)

4)Autoencoderهای انقباضی

یک autoencoder انقباضی یک تکنیک یادگیری عمیق بدون ناظر است که به شبکه عصبی کمک می‌کند تا داده‌های آموزشی بدون برچسب را رمزگذاری کند. این کار با ایجاد یک loss انجام می‌شود که مشتقات بزرگ فعالسازی لایه‌ی پنهان را با توجه به نمونه‌های آموزشی ورودی جریمه می‌کند، اساساً مواردی را جریمه می‌کند که یک تغییر کوچک در ورودی منجر به تغییر بزرگی در فضای رمزگذاری می‌شود.

contractive autoencoder

حال می‌خواهیم پیاده سازی ساده از Autoencoderها را در تنسورفلو آموزش دهیم که به منظور فشرده سازی داده انجام شده است.

فشرده سازی داده با استفاده از Autoencoderها در تنسورفلو

Autoencoder implementation in

1-ابتدا باید کتابخانه‌های موردنیاز را import کنیم

Python

import numpy as np
from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
import matplotlib.pyplot as plt

2حال باید لایه‌های پنهان و متغیرها را مشخص کنیم

Python

#this is the size of our encoded representations
encoding_dim = 32 # 32 floats -> compression of factor 24.5, assuming the input is 784 floats
#this is our input placeholder
input_img = Input(shape=(784,))
# "encoded" is the encoded representation of the input
encoded = Dense(encoding_dim, activation='relu')(input_img)
# "decoded" is the lossy reconstruction of the input
decoded = Dense(784, activation='sigmoid')(encoded)
#this model maps an input to its reconstruction#
autoencoder = Model(input_img, decoded)
#this model maps an input to its encoded representation
encoder = Model(input_img, encoded)
#create a placeholder for an encoded (32-dimensional) input
encoded_input = Input(shape=(encoding_dim,))
# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
#create the decoder model
decoder = Model(encoded_input, decoder_layer(encoded_input))
#configure our model to use a per-pixel binary crossentropy loss, and the Adadelta optimize
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

3-آماده‌سازی داده‌ی ورودی (دیتاست MNIST)

Python

(x_train, _), (x_test, _) = mnist.load_data()
normalize all values between 0 and 1 and we will flatten the 28x28 images into vectors of size 78
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
print x_train.shape
print x_test.shape

4-آموزش Autoencoderها با 50تا epoch

Python

(autoencoder.fit(x_train, x_train
epochs=50
batch_size=256
shuffle=True
validation_data=(x_test, x_test)
# encode and decode some digits
#note that we take them from the *test* set
decoded_imgs = decoder.predict(encoded_imgs)

5-نمایش ورودی‌های بازسازی شده و بازنمایی‌های رمزگذاری شده با استفاده از کتابخانه‌ی Matplotlib

Python

n = 20 # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
    #display original
    ax = plt.subplot(2, n, i + 1)
    plt.imshow(x_test[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    # display reconstruction
    ax = plt.subplot(2, n, i + 1 + n)
    plt.imshow(decoded_imgs[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    plt.show()

15-MNIST data compression using AE in keras

امیدواریم این مقاله برای شما مفید بوده باشد، نظرات خود را در بخش کامنت برای ما بنویسید.


دیدگاه ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

code