تولید داده های جدید با Variational_Autoencoder_VAE

این کاراکترها توسط یک انسان نوشته نشده‌اند!! ما به شبکه عصبی یاد دادیم که چگونه این کار را انجام دهیم !نویسنده: کمیل آقابابایی_ارشد نرم افزاربرای مشاهده کامل کد VAE لطفا به github من مراجعه کنید.یک Variational Autoencoders چیست؟رمزگذارهای خودکار، شبکه های عصبی هستند که برای تولید داده‌های جدید (آموزش بدون نظارت) استفاده می‌شوند. این مدل برای تولید داده‌های جدید برای ساخت مجموعه داده‌ها یا در مواردی که بخواهیم نویز از داده‌های خود را حذف کنیم، استفاده می شود.این شبکه‌ها توسط چندین شبکه عصبی تشکیل شده‌اند: یک رمزگذار و یک رمزگشا. که توسط یک گلوگاه که فضای پنهانی(latent) است که در تصویر زیر نشان داده شده است به هم متصل شده‌اند:رمزگذار داده ها را تا فضای پنهان (Latent space) پردازش می کند و ابعاد را کاهش می دهد و رمزگشا داده ها را می گیرد و ساختار داده را بازسازی می کند تا خروجی مشابه داده های اصلی ما را بدهد. ما می توانیم از فضای پنهان برای نمایش داده های خود استفاده کنیم.در اینجا، ما در حال خواندن اعداد (Mnist Dataset) با تصاویری به اندازه 28x28 و پیکسل (784 المان)هستیم، می‌خواهیم آنها را به 32 عنصر فضای پنهان (Latent space) بازآفرینی(احیا) کنیم تا دوباره تصایری به اندازه 28x28 و 784پیکسل ایجاد کنیم.مجموعه داده MNIST مجموعه‌ای بزرگ از ارقام دست‌نویس است که معمولا ً برای پردازش تصویر استفاده می‌شود .می‌توانیم تمام کتابخانه‌های مورد نیاز را وارد کنیم :import numpy as npimport pandas as pdimport matplotlib.pyplot as plt%matplotlib inlinefrom keras import models,layersfrom tensorflow import kerasopt = keras.optimizers.Adam()from keras.datasets import mnistما برای ساخت مدل از keras.models و برای به کارگیری از Deep Learing از keras functional API بهره خواهیم برد. این راهی است که باید برای تعریف مدل‌های پیچیده مانند multi-output models یا مدل هایی با لایه های مشترک.پس از اتمام وارد کردن کتابخانه های مورد نیاز ، ما باید مجموعه داده را وارد کنیم، که در این از دیتاست های موجود در keras استفاده می کنیم.تصاویر مورد استفاده ما تصاویر سیاه و سفید با ابعاد 28x28 پیکسل هستند. هر پیکسل با یک عدد در مقیاس 1 تا 255 نشان داده می شود.پس از وارد کردن داده ها، آنها را با تقسیم هر پیکسل بر 255 نرمال می کنیم، که همه مقادیر را در مقیاس 0-1 قرار خواهند گرفت.(x_train, _), (x_test, _) = mnist.load_data() #Normalizationx_train = x_train.astype('float32')/255.0x_test = x_test.astype('float32')/255.0x_train = x_train.reshape((-1,784)) #to go from (60000,28,28) to new shape and -1 let#numpy to calculate the number for youx_test = x_test.reshape((-1,784))print(x_train.shape,x_test.shape)بعد از نرمال سازی، می باییست داده را برای لایه ورودی به آرایه تغییر شکل بدهیم.# dimensionality of the latents space embedding_dim = 32 #Input layerinput_img = layers.Input(shape=(784,)) #Encoding layerencoded = layers.Dense(embedding_dim, activation='relu')(input_img)#Decoding layerdecoded = layers.Dense(784,activation='sigmoid')(encoded) #Autoencoder --> in this API Model, we define the Input tensor and the output layer#wraps the 2 layers of Encoder e Decoderautoencoder = models.Model(input_img,decoded)autoencoder.summary()#Encoderencoder = models.Model(input_img,encoded)encoder.summary()#Decoderencoded_input = layers.Input(shape=(embedding_dim,))decoder_layers = autoencoder.layers[-1] #applying the last layerdecoder = models.Model(encoded_input,decoder_layers(encoded_input))print(input_img)print(encoded)هنگامی که همه داده ها را در اختیار داریم، می توانیم مدل خود را تعریف کنیم، که در آن می‌توانیم به وضوح سه بخش (Encoding، Bottleneck و Decoding) را ببینیم. با ساختار مدل خود می‌توانیم ببینیم که ما بیش از 25k پارامتر برای آموزش داریم که با وزن‌ها و بایاس‌ها نشان داده می‌شوند. این پارامترها به شما در تولید داده های جدید کمک می‌کنند.پس از ساخت مدل می‌بایست مدل را (با تعریف بهینه ساز optimizer و تابع ضررloss funtcion) کامپایل کنیم و آن را با مجموعه آموزشی مان هماهنگ(fit)می کنیم . autoencoder.compile(optimizer=opt,loss='binary_crossentropy')history = autoencoder.fit(x_train,x_train,epochs=50,batch_size=256,shuffle=True,validation_ data=(x_test,x_test))برای نمایش نمودارهای loss و val_loss :plt.plot(history.history['loss'],label='loss')plt.plot(history.history['val_loss'],label='val_loss')plt.legend()plt.show()plt.close()The validation loss, compared to the training loss, tells us how much our model is good in generalising.از مقایسه validation loss با از training loss به این نتجه می رسیم که که مدل ما چقدر در تعمیم(generalising) خوب است.اکنون که مدل را کامپایل و آموزش داده ایم، می توانیم داده های جدیدی را با پیش بینی مدل، تولید کنیم.encoded_imgs = encoder.predict(x_test)decoded_imgs = decoder.predict(encoded_imgs)print(encoded_imgs.shape,decoded_imgs.shape)n = 10plt.figure(figsize=(20,4))for i in range(n): ax = plt.subplot(2, n, i+1) plt.imshow(x_test[i].reshape((28,28)),cmap='gray') ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) ax = plt.subplot(2,n,i+1+n) plt.imshow(decoded_imgs[i].reshape((28,28)),cmap='gray') ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False)plt.show()plt.close()با این کدها می توانیم 2 ردیف 10 عددی ترسیم کنیم. در ردیف اول تصاویر واقعی و در ردیف دوم تصاویر تولید شده را داریم. همانطور که می بینیم، با اینکه برخی از اطلاعات را از دست می دهیم، اما داده های مشابه های را تولید کردیم.این مدل بسیار قدرتمندی است که می‌تواند با مدل‌های دیگر یادگیری ماشین و مدل‌های از پیش آموزش‌دیده ترکیب شود .همچنین برای کاهش نویز در داده‌ها نیز می توان استفاده نمود.