Автоэнкодеры. Примеры кода

Материал из Материалы по машинному обучению
Перейти к: навигация, поиск

Полносвязный автоэнкодер

https://habr.com/ru/post/331382/

Сжимающий автоэнкодер (undercomplete)

from keras.layers import Input, Dense, Flatten, Reshape
from keras.models import Model
   
def create_dense_ae():
   # Размерность кодированного представления
   encoding_dim = 49
   
   # Энкодер
   # Входной плейсхолдер
   input_img = Input(shape=(28, 28, 1)) # 28, 28, 1 - размерности строк, столбцов, фильтров одной картинки, без батч-размерности
   # Вспомогательный слой решейпинга
   flat_img = Flatten()(input_img)
   # Кодированное полносвязным слоем представление
   encoded = Dense(encoding_dim, activation='relu')(flat_img)
   
   # Декодер
   # Раскодированное другим полносвязным слоем изображение
   input_encoded = Input(shape=(encoding_dim,))
   flat_decoded = Dense(28*28, activation='sigmoid')(input_encoded)
   decoded = Reshape((28, 28, 1))(flat_decoded)
   
   # Модели, в конструктор первым аргументом передаются входные слои, а вторым выходные слои
   # Другие модели можно так же использовать как и слои
   encoder = Model(input_img, encoded, name="encoder")
   decoder = Model(input_encoded, decoded, name="decoder")
   autoencoder = Model(input_img, decoder(encoder(input_img)), name="autoencoder")
   return encoder, decoder, autoencoder
   
encoder, decoder, autoencoder = create_dense_ae()
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
   
autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test))
 
imgs = x_test[:n]
encoded_imgs = encoder.predict(imgs, batch_size=n)
 
decoded_imgs = decoder.predict(encoded_imgs, batch_size=n)

Глубокий автоэнкодер

def create_deep_dense_ae():
   # Размерность кодированного представления
   encoding_dim = 49
 
   # Энкодер
   input_img = Input(shape=(28, 28, 1))
   flat_img = Flatten()(input_img)
   x = Dense(encoding_dim*3, activation='relu')(flat_img)
   x = Dense(encoding_dim*2, activation='relu')(x)
   encoded = Dense(encoding_dim, activation='linear')(x)
   
   # Декодер
   input_encoded = Input(shape=(encoding_dim,))
   x = Dense(encoding_dim*2, activation='relu')(input_encoded)
   x = Dense(encoding_dim*3, activation='relu')(x)
   flat_decoded = Dense(28*28, activation='sigmoid')(x)
   decoded = Reshape((28, 28, 1))(flat_decoded)
   
   # Модели
   encoder = Model(input_img, encoded, name="encoder")
   decoder = Model(input_encoded, decoded, name="decoder")
   autoencoder = Model(input_img, decoder(encoder(input_img)), name="autoencoder")
   return encoder, decoder, autoencoder
  
d_encoder, d_decoder, d_autoencoder = create_deep_dense_ae()
d_autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

Сверточные автоэнкодеры

Сверточный автоэнкодер

https://habr.com/ru/post/331382/

from keras.layers import Conv2D, MaxPooling2D, UpSampling2D

def create_deep_conv_ae():
   input_img = Input(shape=(28, 28, 1))
 
   x = Conv2D(128, (7, 7), activation='relu', padding='same')(input_img)
   x = MaxPooling2D((2, 2), padding='same')(x)
   x = Conv2D(32, (2, 2), activation='relu', padding='same')(x)
   x = MaxPooling2D((2, 2), padding='same')(x)
   encoded = Conv2D(1, (7, 7), activation='relu', padding='same')(x)
 
   # На этом моменте представление  (7, 7, 1) т.е. 49-размерное
 
   input_encoded = Input(shape=(7, 7, 1))
   x = Conv2D(32, (7, 7), activation='relu', padding='same')(input_encoded)
   x = UpSampling2D((2, 2))(x)
   x = Conv2D(128, (2, 2), activation='relu', padding='same')(x)
   x = UpSampling2D((2, 2))(x)
   decoded = Conv2D(1, (7, 7), activation='sigmoid', padding='same')(x)
 
   # Модели
   encoder = Model(input_img, encoded, name="encoder")
   decoder = Model(input_encoded, decoded, name="decoder")
   autoencoder = Model(input_img, decoder(encoder(input_img)), name="autoencoder")
   return encoder, decoder, autoencoder
 
c_encoder, c_decoder, c_autoencoder = create_deep_conv_ae()
c_autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

LSTM Autoencoder

LSTM Autoencoder for time series prediction

https://stackoverflow.com/a/49946407/10627576

def get_model(n_dimensions):
   inputs = Input(shape=(timesteps, input_dim))
   encoded = LSTM(n_dimensions, return_sequences=False, name="encoder")(inputs)
   decoded = RepeatVector(timesteps)(encoded)
   
   decoded = LSTM(input_dim, return_sequences=True, name='decoder')(decoded)
   autoencoder = Model(inputs, decoded)
   encoder = Model(inputs, encoded)
   return autoencoder, encoder
   
autoencoder, encoder = get_model(n_dimensions)
autoencoder.compile(optimizer='rmsprop', loss='mse', metrics=['acc', 'cosine_proximity'])
  
history = autoencoder.fit(x, x, batch_size=100, epochs=100)
encoded = encoder.predict(x)

Keras LSTM Autoencoder time-series reconstruction

https://stackoverflow.com/questions/53509911/keras-lstm-autoencoder-time-series-reconstruction

https://stackoverflow.com/a/57200195/10627576

   import numpy as np
   import keras
   from keras import Sequential
   from keras.layers import Dense, RepeatVector, TimeDistributed
   from keras.layers import LSTM
   
   N = 10000
   data = np.random.uniform(-0.1, 0.1, size=(N, 500))
   data = data.cumsum(axis=1)
   print(data.shape)
   window_size = 1
   features = 500
   data = data.reshape(N, window_size, features)
   
   model = Sequential()
   
   model.add(LSTM(32, input_shape=(window_size,features), return_sequences=True))
   model.add(LSTM(16, input_shape=(window_size, features), return_sequences=False))
   model.add(RepeatVector(window_size))
   
   model.add(LSTM(16, input_shape=(window_size, features), return_sequences=True))
   model.add(LSTM(32, input_shape=(window_size, features), return_sequences=True))
   model.add(TimeDistributed(Dense(500)))
   
   model.compile(optimizer='adam', loss='mse')
   model.fit(data, data, epochs=100, verbose=1)
   
   
   yhat = model.predict(np.expand_dims(data[1,:,:], axis=0), verbose=0)
   plot(np.arange(500), yhat[0,0,:])
   plot(np.arange(500), data[1,0,:])