Я следую учебному пособию https://blog.keras.io/building-autoencoders-in-keras.html для создания моего автоэнкодера. Для этого у меня есть две стратегии:
А) Шаг 1: построить автоэнкодер; Шаг 2: построить кодировщик; Шаг 3: построить декодер; Шаг 4: скомпилировать автоэнкодер; Шаг 5: обучить автоэнкодеру.
B) Шаг 1: построить автоэнкодер; Шаг 2: скомпилировать автоэнкодер; Шаг 3: обучить автоэнкодеру; Шаг 4: построить кодировщик; Шаг 5: построить декодер.
В обоих случаях модель сходится к потерям 0,100. Однако в случае стратегии А, которая изложена в учебном пособии, реконструкция очень плохая. В случае стратегии B реконструкция намного лучше.
По моему мнению, это имеет смысл, потому что в стратегии А веса моделей кодера и декодера были построены на неподготовленных слоях, и результат является случайным. В стратегии B, с другой стороны, веса лучше определены после тренировки, поэтому реконструкция лучше.
Мои вопросы: действует ли стратегия B или я изменяю реконструкции? В случае стратегии A, должен ли Keras обновлять веса моделей кодера и декодера автоматически, поскольку их модели были построены на основе слоев автоэнкодера?
###### Code for Strategy A
# Step 1
features = Input(shape=(x_train.shape[1],))
encoded = Dense(1426, activation='relu')(features)
encoded = Dense(732, activation='relu')(encoded)
encoded = Dense(328, activation='relu')(encoded)
encoded = Dense(encoding_dim, activation='relu')(encoded)
decoded = Dense(328, activation='relu')(encoded)
decoded = Dense(732, activation='relu')(decoded)
decoded = Dense(1426, activation='relu')(decoded)
decoded = Dense(x_train.shape[1], activation='relu')(decoded)
autoencoder = Model(inputs=features, outputs=decoded)
# Step 2
encoder = Model(features, encoded)
# Step 3
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-4](encoded_input)
decoder_layer = autoencoder.layers[-3](decoder_layer)
decoder_layer = autoencoder.layers[-2](decoder_layer)
decoder_layer = autoencoder.layers[-1](decoder_layer)
decoder = Model(encoded_input, decoder_layer)
# Step 4
autoencoder.compile(optimizer='adam', loss='mse')
# Step 5
history = autoencoder.fit(x_train,
x_train,
epochs=150,
batch_size=256,
shuffle=True,
verbose=1,
validation_split=0.2)
# Testing encoding
encoded_fts = encoder.predict(x_test)
decoded_fts = decoder.predict(encoded_fts)
###### Code for Strategy B
# Step 1
features = Input(shape=(x_train.shape[1],))
encoded = Dense(1426, activation='relu')(features)
encoded = Dense(732, activation='relu')(encoded)
encoded = Dense(328, activation='relu')(encoded)
encoded = Dense(encoding_dim, activation='relu')(encoded)
decoded = Dense(328, activation='relu')(encoded)
decoded = Dense(732, activation='relu')(decoded)
decoded = Dense(1426, activation='relu')(decoded)
decoded = Dense(x_train.shape[1], activation='relu')(decoded)
autoencoder = Model(inputs=features, outputs=decoded)
# Step 2
autoencoder.compile(optimizer='adam', loss='mse')
# Step 3
history = autoencoder.fit(x_train,
x_train,
epochs=150,
batch_size=256,
shuffle=True,
verbose=1,
validation_split=0.2)
# Step 4
encoder = Model(features, encoded)
# Step 5
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-4](encoded_input)
decoder_layer = autoencoder.layers[-3](decoder_layer)
decoder_layer = autoencoder.layers[-2](decoder_layer)
decoder_layer = autoencoder.layers[-1](decoder_layer)
decoder = Model(encoded_input, decoder_layer)
# Testing encoding
encoded_fts = encoder.predict(x_test)
decoded_fts = decoder.predict(encoded_fts)