Jak stworzyć autokoder wariacyjny?

Jak stworzyć autokoder wariacyjny?
V2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 86
0

Cześć! Własnie tworzę autokoder wariacyjny. Tylko moim zdaniem nie jest on wariacyjny. Czy mógłby ktoś podpowiedzieć czy ten kod jest poprawny a jesli nie to gdzie popełniam błąd. Dopiero ucze sie pythona stąd takie moze troche śmieszne pytanie.

Kopiuj
from keras import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=4,
 activation="linear",
 input_shape=(8,)))
model.add(Dense(8))
model.compile(optimizer="rmsprop",
 loss="quadratic",
 metrics=["accuracy"])
print(f"\n\nmodel = {model}")
model.summary()
lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
1

Jeśli chodzi Ci o variational autoencoder, (VAE), to nie wygląda, doczytaj tu:
https://blog.paperspace.com/how-to-build-variational-autoencoder-keras

V2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 86
0

@lion137: Tylko ze tam jest to bardzo rozbudowane i z graficznie przedstawione, a mi chodzi o taki prosty w 20 linijkach max

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

To trochę teorii musisz liznąć, czy to się da prosto zrobić, jak piszesz w dwudziestu linijkach max, bo ja mam wątpliwości.

V2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 86
0

@lion137:
A czy taki kod juz bardziej przypomina autokoder wariacyjny ?

Kopiuj
import keras.backend as K
from keras.layers import Dense, Input, Lambda
from keras.models import Model

input_shape = (10,)
intermediate_dim = 10
latent_dim = 5

inputs = Input(shape = input_shape, name = 'encoder_input')
x = Dense(intermediate_dim, activation='relu')(inputs)
mu = Dense(latent_dim, name='mu')(x)
log_var = Dense(latent_dim, name='log_sigma')(x)

def sample(a):
    mu, sigma = a
    epsilon = K.random_normal(shape=(1, latent_dim))
    return mu + K.exp(.5*log_var) * epsilon

z = Lambda(sample, output_shape=(latent_dim,), name='z')([mu, log_var])

encoder = Model(inputs, z, name='encoder')
encoder.summary()
Eldorad O.
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 517
0

@veks21: Ideą enkoderów wariacyjnych jest ekstrakcja "niskopoziomowych" danych tworzących jakby ogólny zarys obiektu wejściowego.
Jeżeli input to wektor 10 wymiarowy, to warstwa ukryta powinna być na moje mniejsza, gdyż neurony w niej umieszczone mogą w przeciwnym wypadku wydobywać zbyt specyficzne dane na temat obiektu wejściowego.

Więc to "intermediate_dim" bym zmniejszył i użył klasy "keras.Sequential" zamiast wywoływania ręcznego każdej warstwy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.