Özkodlamanın yaptığının bir tür “veriyi sıkıştırma” işlemi olduğu söylenebilir. Yapay öğrenmede algoritmaların denetimli ve denetimsiz olarak ikiye ayrıldığından bahsetmiştik, özkodlama denetimsiz çalışır yani ortada etiket yoktur, daha doğrusu özkodlama verinin kendisini etiket olarak kullanır.
Yani girdi olarak verilen veriyi çıktı olarak ta kullanırsak, YSA’yı kendi çıktısını tekrar oluşturmayı öğrenmeye zorlamış oluruz, bu YSA’yı veriyi özetlemeye doğru yöneltecektir, ve bu tekrar oluşturma için ileri besleme sırasında veriyi dar bir noktadan geçmeye zorlarsak (üstteki resimde görülüyor, 7 nöronluk girdi 5 nöronluk “daha dar” bir katmandan geçmeye zorlanıyor), bu YSA’yı “sıkıştırma” yapmaya daha da meyillendirecektir.
from keras.layers import Input, Dense
from keras.models import Model
# gizli katman
= 32
encoding_dim
def get_model():
# girdi
= Input(shape=(784,))
input_img # kodlanmis temsil
= Dense(encoding_dim, activation='relu')(input_img)
encoded # kodcozulmus temsil
= Dense(784, activation='sigmoid')(encoded)
decoded
# bu model girdiyi tekrar olusturulmus hale cevirir
= Model(input_img, decoded)
autoencoder
# bu model girdiyi kodlanmis hale getirir
= Model(input_img, encoded)
encoder
= Input(shape=(encoding_dim,))
encoded_input # ozkodlayicinin son tabakasini al bu kodcozulmus katman
= autoencoder.layers[-1]
decoder_layer # kodcozucu model
= Model(encoded_input, decoder_layer(encoded_input))
decoder
compile(optimizer='adadelta', loss='binary_crossentropy')
autoencoder.return autoencoder, encoder, decoder
if __name__ == "__main__":
= get_model()
autoencoder, encoder, decoder
from keras.datasets import mnist
import numpy as np
= mnist.load_data()
(x_train, _), (x_test, _)
= x_train.astype('float32') / 255.
x_train = x_test.astype('float32') / 255.
x_test = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_train = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
x_test print (x_train.shape)
print (x_test.shape)
autoencoder.fit(x_train, x_train,=50,
epochs=256,
batch_size=True,
shuffle=(x_test, x_test))
validation_data
'mod-autoenc-1.h5')
autoencoder.save('mod-enc-1.h5')
encoder.save('mod-dec-1.h5') decoder.save(
Üstteki kodla modeli eğittikten sonra herhangi bir sayı resmini alıyoruz, kodluyoruz, kodçözme yapıyoruz ve tekrar oluşturulmuş hali ekrana basıyoruz,
from keras.datasets import mnist
import mnist_autoenc
= mnist.load_data()
(x_train, _), (x_test, y_test) = x_test.astype('float32') / 255.
x_test = mnist_autoenc.get_model()
autoencoder, encoder, decoder "mod-enc-1.h5")
encoder.load_weights("mod-dec-1.h5") decoder.load_weights(
= 1090 # herhangi bir sayi resmini al
idx print y_test[idx]
= x_test[idx, :, :].reshape(1,28*28)
tmp = encoder.predict(tmp)
encoded print (encoded.shape)
= decoder.predict(encoded).reshape(28,28)
decoded print (decoded.shape)
plt.imshow(decoded)
plt.gray()'autoenc_01.png') plt.savefig(
9
(1, 32)
(28, 28)
9 resmini elde ettik.
Biraz onceki resmin kodlanmis halini gosterelim,
print (encoded)
[[ 13.18540382 9.90277767 2.81214857 14.67686176 3.90287089
0.95043498 4.25797892 13.59305477 8.71218967 2.61786652
8.67911053 5.27269077 3.68898463 6.26301765 0. 3.73920846
4.90339994 6.61260319 8.80308342 5.41205883 0. 6.12768221
11.42174625 3.13173342 3.79943371 11.27116108 6.003757
10.82552242 8.44533443 4.84582376 5.63021088 11.27607727]]
32 boyutlu bir vektör içinde reel sayılar bunlar. Şimdi bu sayıları alıp başka bir sınıflayıcı içinde kullanabilirdim. Öyle bir uygulama düşünelim ki mesela müşterilerin yaşı, cinsiyeti bilgisi var, biz ayrıca herkesin fotoğrafları üzerinden bir özkodlayıcı eğitiyoruz, ve müşterinin resmi üzerinden elde edilen üstteki gibi bir temsili sıkıştırılmış gizli tabaka verisini yaş, cinsiyet ile beraber bu ayrı sınıflayıcıya verip cevap bekliyoruz. Bu sınıflayıcı “potansiyel yaz alışverişçisi mi / değil mi’’ şeklinde bir sınıflama yapıyor olabilir mesela, belki kişilerin resminde bu sınıflayıcıya yardım edecek bir şeyler vardır.. Bu ayrı sınıflayıcı bir YSA olabilir, ama çoğu zaman basit lojistik regresyon bile kullanılabiliyor. Ayrıca sadece bir değil, farklı veriler üzerinde işletilmiş pek çok özkodlayıcıdan gelen özet bilgisini de yan yana aynı lojistik regresyona verebiliriz.
Zaman Serisi Özkodlaması, RNN
Eğer zamana bağlı bir veri yapısını özkodlamak istesek nasıl bir model kullanırdık? Mesela birkaç boyutlu bir finans verisini (bir andaki hisse fiyatı, satım miktarı çok boyutlu bir vektörde olabilirdi) modelliyor olabilidiik. MNIST verisini bu şekilde kullanabiliriz aslında, 28 x 28 boyutlu veride sanki 28 tane 28 boyutlu veriyi zamana bağlı alıyormuşuz gibi görebilirdik, sanki resimde soldan sağa doğru dikey şeritler alıp teker teker bunları işlediğimizi düşünebiliriz. MNIST sayı görüntülerine bu şekilde bakmak aslında çok anlamsız değil, mesela bir altı görüntüsünü düşünürsek soldan sağa giderken kavisli yukarı doğru bir gidiş vardır, bu gidişi zamana bağlı bir NN yakalayabilir.
from keras.layers import Input, Dense, concatenate
from keras.layers import LSTMCell, RNN
from keras.layers import Input, LSTM, RepeatVector
from keras.models import Model
= 20; timesteps = 28; input_dim = 28; hist_dim = 5
latent_dim
def get_model():
= Input(shape=(timesteps, input_dim))
inputs
= LSTM(latent_dim,return_sequences=True)(inputs)
encoded = encoded
decoded = LSTM(input_dim, return_sequences=True)(decoded)
decoded
= Model(inputs, decoded)
seq_autoencoder
= Model(inputs, encoded)
encoder return seq_autoencoder, encoder
if __name__ == "__main__":
from keras.datasets import mnist
import numpy as np
= mnist.load_data()
(x_train, _), (x_test, _)
= x_train.astype('float32') / 255.
x_train = x_test.astype('float32') / 255.
x_test print (x_train.shape)
print (x_test.shape)
= get_model()
seq_autoencoder, encoder
compile(optimizer='adadelta', loss='binary_crossentropy')
seq_autoencoder.
seq_autoencoder.fit(x_train, x_train,=50,
epochs=256,
batch_size=True,
shuffle=(x_test, x_test))
validation_data
'mod-rnn-autoenc-sim.h5')
seq_autoencoder.save('mod-rnn-enc-sim.h5') encoder.save(
import mnist_autoenc_rnn_simple
= mnist_autoenc_rnn_simple.get_model()
seq_autoencoder, encoder "mod-rnn-autoenc-sim.h5")
seq_autoencoder.load_weights("mod-rnn-enc-sim.h5") encoder.load_weights(
= seq_autoencoder.predict(tmp).reshape(28,28)
decoded print (decoded.shape)
plt.imshow(decoded)
plt.gray()'autoenc_03.png') plt.savefig(
Varyasyonel Özkodlayıcılar (Variational Autoencoder -VAE-)
Standard özkodlayıcıların bir problemi kodlama yaptıkları daralmış alandaki vektörlerin sürekli olmayabileceği, ve buradaki değerlerin kolay bir şekilde interpolasyon yapılmasındaki bazı zorluklar.
VAE özkodlayıcılarda, kodlayıcı tabaka bir tamamen bağlanmış / yoğun (dense) bir katmandan geçiyor ama bir değişiklik var; yoğun katman \(\mu,\sigma\) rasgele değişkenleri haline geliyor ve ondan bir sonraki katman bu değişkenlerden örneklem alıyor! Bu dahiyene bir düşünce. Fakat akla gelebilir - YSA yapısı deterministik bir yapıdır, örneklem, yani zar atma rasgele (stochastic) bir hesap. Bu kavramı YSA mekanizmasına nasıl dahil ediyoruz?
Çözüm örneklem operasyonunu gürültü, yani Gaussian \(N(0,1)\) + \(\mu\) çarpı \(\sigma\) olarak modellemek, bu şekilde sanki \(N(\mu,\sigma)\)’dan örneklem alıyoruz, ama eğitilen, optimize edilen çarpma, toplama üzerinden \(\mu,\sigma\) değişkenleri, ve halen YSA mekanizması devrede ve bu değişkenler deterministik değişkenler. Gürültü işin içinde var, ama gürültü eh, Gaussian sıfır merkezli bir stardart sapmalı gürültü. Bir gürültü bir diğerinden farklı değil, model için hepsi aynı gürültü.
Üstteki mantığın temelinde şu bilgi var: Biliyoruz ki herhangi bir dağılıma sahip rasgele değişken \(z\)’yi bir \(g\) fonksiyonu kullanarak \(X=g(z)\) ile başka bir dağılıma çevirebiliyoruz. Altta örneği görülüyor, soldaki resim Gaussian dağılımdan, sağdaki resim soldaki verilerin \(g(z) = z/10 + z/||z||\) ile başka bir dağılıma eşlenmiş hali ve bu yeni dağılım bir çember şeklini oluşturmuş. VAE’nin rasgele dağılımlar yaratabilmesinin arkasında yatan gizem bu işte. Eğitim ile VAE \(g\)’yi öğrenmiş oluyor, ki bu bir determinstik fonksiyon.
import random, numpy.linalg as lin, pandas as pd
= np.random.randn(1000,2)
x = pd.DataFrame(x)
x 'n'] = np.sqrt(x[0]*x[0] + x[1]*x[1])
x['g0'] = (x[0]/10.0) + x[0]/x['n']
x['g1'] = (x[1]/10.0) + x[1]/x['n']
x[
plt.figure()= plt.subplot(1, 2, 1)
ax 0],x[1],'.')
plt.plot(x[= plt.subplot(1, 2, 2)
ax 'g0'],x['g1'],'.')
plt.plot(x[-4,4)
plt.xlim(-4,4)
plt.ylim('autoenc_10.png') plt.savefig(
"""
Based on https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder.py
"""
import keras
from keras.datasets import mnist
import numpy as np
from keras import backend as K
from keras.models import Sequential, Model
from keras.layers import Input, LSTM, RepeatVector
from keras.layers.core import Flatten, Dense, Dropout, Lambda
from keras.optimizers import SGD, RMSprop, Adam
from keras import objectives
import numpy as np
= 28; input_dim = 28;
timesteps = 1
batch_size = 30
latent_dim
def create_lstm_vae(input_dim,
timesteps,
batch_size,
intermediate_dim,
latent_dim,=1.):
epsilon_std
= Input(shape=(timesteps, input_dim,))
x print (x)
# LSTM encoding
= LSTM(intermediate_dim)(x)
h print (h)
# VAE Z layer
= Dense(latent_dim)(h)
z_mean = Dense(latent_dim)(h)
z_log_sigma
def sampling(args):
= args
z_mean, z_log_sigma = K.random_normal(shape=(batch_size, latent_dim),
epsilon =0., stddev=epsilon_std)
meanreturn z_mean + z_log_sigma * epsilon
= Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_sigma])
z print (z)
# decoded LSTM layer
= LSTM(intermediate_dim, return_sequences=True)
decoder_h = LSTM(input_dim, return_sequences=True)
decoder_mean
= RepeatVector(timesteps)(z)
h_decoded print (h_decoded)
= decoder_h(h_decoded)
h_decoded print (h_decoded)
# decoded layer
= decoder_mean(h_decoded)
x_decoded_mean print (x_decoded_mean)
# end-to-end autoencoder
= Model(x, x_decoded_mean)
vae
# encoder, from inputs to latent space
= Model(x, z_mean)
encoder
# generator, from latent space to reconstructed inputs
= Input(shape=(latent_dim,))
decoder_input print (decoder_input)
= RepeatVector(timesteps)(decoder_input)
_h_decoded print (_h_decoded)
= decoder_h(_h_decoded)
_h_decoded print (_h_decoded)
= decoder_mean(_h_decoded)
_x_decoded_mean = Model(decoder_input, _x_decoded_mean)
generator
def vae_loss(x, x_decoded_mean):
= objectives.mse(x, x_decoded_mean)
xent_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma))
kl_loss = xent_loss + kl_loss
loss return loss
compile(optimizer='rmsprop', loss=vae_loss)
vae.
return vae, encoder, generator
if __name__ == "__main__":
= mnist.load_data()
(x_train, _), (x_test, _) = x_train.astype('float32') / 255.
x_train #x_train = x_train[:200]
= x_test.astype('float32') / 255.
x_test #x_test = x_test[:200]
print (x_train.shape)
print (x_test.shape)
= x_train
x = create_lstm_vae(input_dim,
vae, enc, gen =timesteps,
timesteps=batch_size,
batch_size=latent_dim,
intermediate_dim=latent_dim,
latent_dim=1.)
epsilon_std
=(x_test, x_test), epochs=30)
vae.fit(x, x, validation_data
'mnist_lstm_vae.h5')
vae.save('mnist_lstm_enc.h5')
enc.save('mnist_lstm_gen.h5')
gen.save(
#preds = vae.predict(x, batch_size=batch_size)
import mnist_lstm_vae
= mnist_lstm_vae.create_lstm_vae(mnist_lstm_vae.input_dim,
vae, enc, gen =mnist_lstm_vae.timesteps,
timesteps=mnist_lstm_vae.batch_size,
batch_size=mnist_lstm_vae.latent_dim,
intermediate_dim=mnist_lstm_vae.latent_dim,
latent_dim=1.)
epsilon_std'mnist_lstm_vae.h5')
vae.load_weights('mnist_lstm_enc.h5') enc.load_weights(
import random
= 400 # herhangi bir imaji sec
idx print (tmp.shape)
= x_test[idx]
x_test_tmp = vae.predict(x_test_tmp.reshape((1, 28, 28)))
res
plt.figure()= plt.subplot(1, 2, 1)
ax = res.reshape((28, 28))
pixels
plt.imshow(pixels)
plt.gray()= plt.subplot(1, 2, 2)
ax
plt.imshow(x_test_tmp)
plt.gray()
'autoenc_04.png') plt.savefig(
Gördüğümüz gibi zamansal işlem yaptık ama VAE çok iyi sonuç verdi. Hatta test imajını daha netleştirdi!
Hasımsal Özkodlayıcı (Adverserial Autoencoder -AA-)
Üretici Hasımsal Ağlar (Generative Adverserial Networks -GAN-) kavramının özkodlayıcılara uygulanmış hali AA olur.
Burada bir kodlayıcı / kodçözücü yapısı var (üst blok) bu yapıdan kodlanmış ara tabaka \(z \sim q(z)\) “kötü’’ örnekler çekilip \(p(z)\)’den gelen”iyi’’ örnekler ile birleştiriliyor ve ayırdedici yine bu iki grup arasında ayırım yapmayı öğreniyor. Bu durumda üst bloktaki kodçözücü GAN’deki üretici gibi olur, ona dönüşür bir bakıma, çünkü öyle iyi üretim yapmaya çalışacaktır ki \(p(z)\) gürültüsü ile onun aldığı kodlanmış tabaka verisi ayiredilemez hale gelmelidir. Tabii ki üst soldaki kodlayıcı bu ara tabakaya o şekilde temsili veri üretmeye çalışacaktır, bu arada kodlayıcı / kodçözücü yapısı da eğitilmiş olur. Yani \(z\) bir anlamda alt soldaki gerçek gürültüye yaklaşır, bu gürültüden sayı üretebilir hale geliriz, bu klasik GAN, ayrıca bu “kodlanmış’’ gürültüyü üreten kodlayıcı / kodçözücü tabaka da ayrı bir şekilde kendini optimize eder ve kodlama işini yapar hale gelir.
# import os
# os.environ["THEANO_FLAGS"] = "mode=FAST_COMPILE,device=cpu,floatX=float32"
# This line allows mpl to run with no DISPLAY defined
from keras.layers import Dense, Reshape, Flatten, Input, merge
from keras.models import Sequential, Model
from keras.optimizers import Adam
from legacy import l1l2
import keras.backend as K
import pandas as pd, os
import numpy as np
from adversarial_model import AdversarialModel
from adversarial_utils import fix_names, n_choice, normal_latent_sampling
from adversarial_optimizers import AdversarialOptimizerSimultaneous
from keras.layers import LeakyReLU, Activation
import numpy as np
from keras.datasets import mnist
def mnist_process(x):
= x.astype(np.float32) / 255.0
x return x
def mnist_data():
= mnist.load_data()
(xtrain, ytrain), (xtest, ytest) return mnist_process(xtrain), mnist_process(xtest)
def model_generator(latent_dim, input_shape,
=512,
hidden_dim=lambda: l1l2(1e-7, 0)):
regreturn Sequential([
="generator_h1",
Dense(hidden_dim, name=latent_dim,
input_dim=reg()),
W_regularizer0.2),
LeakyReLU(
Dense(hidden_dim,="generator_h2",
name=reg()),
W_regularizer0.2),
LeakyReLU(
Dense(np.prod(input_shape),="generator_x_flat",
name=reg()),
W_regularizer'sigmoid'),
Activation(="generator_x")],
Reshape(input_shape, name="generator")
name
def model_encoder(latent_dim, input_shape,
=512,
hidden_dim=lambda: l1l2(1e-7, 0)):
reg= Input(input_shape, name="x")
x = Flatten()(x)
h = Dense(hidden_dim, name="encoder_h1", W_regularizer=reg())(h)
h = LeakyReLU(0.2)(h)
h = Dense(hidden_dim, name="encoder_h2", W_regularizer=reg())(h)
h = LeakyReLU(0.2)(h)
h = Dense(latent_dim, name="encoder_mu", W_regularizer=reg())(h)
mu = Dense(latent_dim, name="encoder_log_sigma_sq", W_regularizer=reg())(h)
log_sigma_sq = merge([mu, log_sigma_sq], mode=lambda p: p[0] + K.random_normal(K.shape(p[0])) * K.exp(p[1] / 2),
z =lambda p: p[0])
output_shapereturn Model(x, z, name="encoder")
def model_discriminator(latent_dim, output_dim=1, hidden_dim=512,
=lambda: l1l2(1e-7, 1e-7)):
reg= Input((latent_dim,))
z = z
h = Dense(hidden_dim, name="discriminator_h1", W_regularizer=reg())(h)
h = LeakyReLU(0.2)(h)
h = Dense(hidden_dim, name="discriminator_h2", W_regularizer=reg())(h)
h = LeakyReLU(0.2)(h)
h = Dense(output_dim, name="discriminator_y", activation="sigmoid", W_regularizer=reg())(h)
y return Model(z, y)
def train(adversarial_optimizer):
# z \in R^100
= 100
latent_dim # x \in R^{28x28}
= (28, 28)
input_shape
# generator (z -> x)
= model_generator(latent_dim, input_shape)
generator # encoder (x ->z)
= model_encoder(latent_dim, input_shape)
encoder # autoencoder (x -> x')
= Model(encoder.inputs, generator(encoder(encoder.inputs)))
autoencoder # discriminator (z -> y)
= model_discriminator(latent_dim)
discriminator
# assemple AAE
= encoder.inputs[0]
x = encoder(x)
z = generator(z)
xpred = normal_latent_sampling((latent_dim,))(x)
zreal = discriminator(zreal)
yreal = discriminator(z)
yfake = Model(x, fix_names([xpred, yfake, yreal], ["xpred", "yfake", "yreal"]))
aae
# print summary of models
generator.summary()
encoder.summary()
discriminator.summary()
autoencoder.summary()
# build adversarial model
= generator.trainable_weights + encoder.trainable_weights
generative_params = AdversarialModel(base_model=aae,
model =[generative_params, discriminator.trainable_weights],
player_params=["generator", "discriminator"])
player_names=adversarial_optimizer,
model.adversarial_compile(adversarial_optimizer=[Adam(1e-4, decay=1e-4), Adam(1e-3, decay=1e-4)],
player_optimizers={"yfake": "binary_crossentropy", "yreal": "binary_crossentropy",
loss"xpred": "mean_squared_error"},
=[{"loss_weights": {"yfake": 1e-2, "yreal": 1e-2, "xpred": 1}}] * 2)
player_compile_kwargs
# load mnist data
= mnist_data()
xtrain, xtest
# callback for image grid of generated samples
def generator_sampler():
= np.random.normal(size=(10 * 10, latent_dim))
zsamples return generator.predict(zsamples).reshape((10, 10, 28, 28))
# callback for image grid of autoencoded samples
def autoencoder_sampler():
= n_choice(xtest, 10)
xsamples = np.repeat(xsamples, 9, axis=0)
xrep = autoencoder.predict(xrep).reshape((10, 9, 28, 28))
xgen = xsamples.reshape((10, 1, 28, 28))
xsamples = np.concatenate((xsamples, xgen), axis=1)
samples return samples
# train network
# generator, discriminator; pred, yfake, yreal
= xtrain.shape[0]
n = [xtrain, np.ones((n, 1)), np.zeros((n, 1)), xtrain, np.zeros((n, 1)), np.ones((n, 1))]
y = xtest.shape[0]
ntest = [xtest, np.ones((ntest, 1)), np.zeros((ntest, 1)), xtest, np.zeros((ntest, 1)), np.ones((ntest, 1))]
ytest = model.fit(x=xtrain, y=y, validation_data=(xtest, ytest), nb_epoch=100, batch_size=32)
history
# save model
"aae-norm-encoder.h5")
encoder.save("aae-norm-generator.h5")
generator.save("aae-norm-discriminator.h5")
discriminator.save(
if __name__ == "__main__":
train(AdversarialOptimizerSimultaneous())
import aae_normal
= 100
latent_dim = (28, 28)
input_shape = aae_normal.model_encoder(latent_dim, input_shape)
encoder 'aae-norm-encoder.h5')
encoder.load_weights(= aae_normal.model_generator(latent_dim, input_shape)
generator 'aae-norm-generator.h5') generator.load_weights(
= 100 # herhangi bir imaji sec
idx print (x_test[idx, :].shape)
= encoder.predict(x_test[idx, :].reshape(1,28,28))
res print (res.shape)
= generator.predict(res)
pixels = pixels.reshape((28, 28))
pixels
plt.imshow(pixels)
plt.gray()'autoenc_05.png') plt.savefig(
# import os
# os.environ["THEANO_FLAGS"] = "mode=FAST_COMPILE,device=cpu,floatX=float32"
# This line allows mpl to run with no DISPLAY defined
from keras.layers import Dense, Reshape, Flatten, Input, merge
from keras.models import Sequential, Model
from keras.optimizers import Adam
from legacy import l1l2
import keras.backend as K
from keras.datasets import mnist
import numpy as np, os, pandas as pd
from adversarial_model import AdversarialModel
from adversarial_utils import fix_names, n_choice, normal_latent_sampling
from adversarial_optimizers import AdversarialOptimizerSimultaneous
from keras.layers import LeakyReLU, Activation, LSTM, GRU, RepeatVector
def mnist_process(x):
= x.astype(np.float32) / 255.0
x return x
def mnist_data():
= mnist.load_data()
(xtrain, ytrain), (xtest, ytest) return mnist_process(xtrain), mnist_process(xtest)
='relu'
activation
def model_generator(latent_dim, input_shape,
=100,
hidden_dim=lambda: l1l2(1e-7, 0)):
regreturn Sequential([
=activation,
Dense(np.prod(input_shape), activation="generator_h1", input_dim=latent_dim,
name=reg()),
W_regularizer="generator_x"),
Reshape(input_shape, name=True),
GRU(latent_dim,return_sequences28,return_sequences=True),
GRU(
],="generator")
name
def model_encoder(latent_dim, input_shape,
=100,
hidden_dim=lambda: l1l2(1e-7, 0)):
reg= Input(input_shape, name="x")
x = GRU(hidden_dim, return_sequences=True)(x)
h = GRU(hidden_dim)(h)
h = Dense(hidden_dim, activation=activation,
h ="encoder_h3",
name=reg())(h)
W_regularizer
= Dense(latent_dim, name="encoder_mu", W_regularizer=reg())(h)
mu
= Dense(latent_dim, name="encoder_log_sigma_sq",
log_sigma_sq =reg())(h)
W_regularizer
= merge([mu, log_sigma_sq],
z =lambda p: p[0] + K.random_normal(K.shape(p[0])) * K.exp(p[1] / 2),
mode=lambda p: p[0])
output_shape
return Model(x, z, name="encoder")
def model_discriminator(latent_dim, output_dim=1, hidden_dim=100,
=lambda: l1l2(1e-7, 1e-7)):
reg= Input((latent_dim,))
z = z
h = Dense(hidden_dim, name="discriminator_h1", W_regularizer=reg())(h)
h = LeakyReLU(0.2)(h)
h = Dense(hidden_dim, name="discriminator_h2", W_regularizer=reg())(h)
h = LeakyReLU(0.2)(h)
h = Dense(output_dim, name="discriminator_y", activation="sigmoid", W_regularizer=reg())(h)
y return Model(z, y)
def example_aae(adversarial_optimizer):
# z \in R^100
= 200
latent_dim # x \in R^{28x28}
= (28, 28)
input_shape
# generator (z -> x)
= model_generator(latent_dim, input_shape)
generator # encoder (x ->z)
= model_encoder(latent_dim, input_shape)
encoder # autoencoder (x -> x')
print (encoder.inputs)
= encoder(encoder.inputs)
e = generator(e)
g = Model(encoder.inputs, g)
autoencoder # discriminator (z -> y)
= model_discriminator(latent_dim)
discriminator
# assemple AAE
= encoder.inputs[0]
x = encoder(x)
z = generator(z)
xpred = normal_latent_sampling((latent_dim,))(x)
zreal = discriminator(zreal)
yreal = discriminator(z)
yfake = Model(x, fix_names([xpred, yfake, yreal], ["xpred", "yfake", "yreal"]))
aae
# print summary of models
generator.summary()
encoder.summary()
discriminator.summary()
autoencoder.summary()
# build adversarial model
= generator.trainable_weights + encoder.trainable_weights
generative_params = AdversarialModel(base_model=aae,
model =[generative_params, discriminator.trainable_weights],
player_params=["generator", "discriminator"])
player_names=adversarial_optimizer,
model.adversarial_compile(adversarial_optimizer=[Adam(1e-4, decay=1e-4), Adam(1e-3, decay=1e-4)],
player_optimizers={"yfake": "binary_crossentropy", "yreal": "binary_crossentropy",
loss"xpred": "mean_squared_error"},
=[{"loss_weights": {"yfake": 1e-2, "yreal": 1e-2, "xpred": 1}}] * 2)
player_compile_kwargs
# load mnist data
= mnist_data()
xtrain, xtest
# callback for image grid of generated samples
def generator_sampler():
= np.random.normal(size=(10 * 10, latent_dim))
zsamples return generator.predict(zsamples).reshape((10, 10, 28, 28))
# callback for image grid of autoencoded samples
def autoencoder_sampler():
= n_choice(xtest, 10)
xsamples = np.repeat(xsamples, 9, axis=0)
xrep = autoencoder.predict(xrep).reshape((10, 9, 28, 28))
xgen = xsamples.reshape((10, 1, 28, 28))
xsamples = np.concatenate((xsamples, xgen), axis=1)
samples return samples
# train network
# generator, discriminator; pred, yfake, yreal
= xtrain.shape[0]
n = [xtrain, np.ones((n, 1)), np.zeros((n, 1)), xtrain, np.zeros((n, 1)), np.ones((n, 1))]
y = xtest.shape[0]
ntest = [xtest, np.ones((ntest, 1)), np.zeros((ntest, 1)), xtest, np.zeros((ntest, 1)), np.ones((ntest, 1))]
ytest = model.fit(x=xtrain, y=y, validation_data=(xtest, ytest), nb_epoch=50, batch_size=32)
history
# save model
"aae-lstm-encoder.h5")
encoder.save("aae-lstm-generator.h5")
generator.save("aae-lstm-discriminator.h5")
discriminator.save(
if __name__ == "__main__":
example_aae(AdversarialOptimizerSimultaneous())
import aae_lstm
= 200
latent_dim = (28, 28)
input_shape = aae_lstm.model_encoder(latent_dim, input_shape)
encoder 'aae-lstm-encoder.h5')
encoder.load_weights(= aae_lstm.model_generator(latent_dim, input_shape)
generator 'aae-lstm-generator.h5') generator.load_weights(
= 1030 # herhangi bir imaji sec
idx = encoder.predict(x_test[idx, :].reshape(1, 28,28))
res = generator.predict(res)
pixels = pixels.reshape((28, 28))
pixels
plt.imshow(pixels)
plt.gray()'autoenc_08.png') plt.savefig(
Kaynaklar
[1] https://blog.keras.io/building-autoencoders-in-keras.html
[2] Adverserial Autoencoder Keras, https://github.com/bstriner/keras-adversarial/blob/master/examples/example_aae.py
[3] https://towardsdatascience.com/intuitively-understanding-variational-autoencoders-1bfe67eb5daf
[4] https://hsaghir.github.io/data_science/denoising-vs-variational-autoencoder/
[5] Doersch, Tutorial on Variational Autoencoders, https://arxiv.org/pdf/1606.05908.pdf
[6] Goodfellow, Adversarial Autoencoders, https://arxiv.org/pdf/1511.05644.pdf
[7] What is Adversarial Autoencoder?, https://www.quora.com/What-is-Adversarial-Autoencoder