Допустимо ли обучение автоэнкодера перед построением моделей кодировщика / декодера? - PullRequest
0 голосов
/ 23 марта 2019

Я следую учебному пособию 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)

1 Ответ

2 голосов
/ 23 марта 2019

Мои вопросы: действительна ли стратегия B или я изменяю реконструкции?

A и B эквивалентны; нет, ты не обманывал

В случае стратегии A, должен ли Keras автоматически обновлять веса моделей кодера и декодера, поскольку их модели были построены на основе слоев автоэнкодера?

Модель декодера просто использует слои автоэнкодера. В случае A:

decoder.layers
Out:
[<keras.engine.input_layer.InputLayer at 0x7f8a44d805c0>,
 <keras.layers.core.Dense at 0x7f8a44e58400>,
 <keras.layers.core.Dense at 0x7f8a44e746d8>,
 <keras.layers.core.Dense at 0x7f8a44e14940>,
 <keras.layers.core.Dense at 0x7f8a44e2dba8>]

autoencoder.layers
Out:[<keras.engine.input_layer.InputLayer at 0x7f8a44e91c18>,
 <keras.layers.core.Dense at 0x7f8a44e91c50>,
 <keras.layers.core.Dense at 0x7f8a44e91ef0>,
 <keras.layers.core.Dense at 0x7f8a44e89080>,
 <keras.layers.core.Dense at 0x7f8a44e89da0>,
 <keras.layers.core.Dense at 0x7f8a44e58400>,
 <keras.layers.core.Dense at 0x7f8a44e746d8>,
 <keras.layers.core.Dense at 0x7f8a44e14940>,
 <keras.layers.core.Dense at 0x7f8a44e2dba8>]

шестнадцатеричные числа (идентификаторы объектов) для 4 последних строк каждого списка одинаковы - потому что это одни и те же объекты. Конечно, они тоже делятся своим весом.

В случае B:

decoder.layers
Out:
[<keras.engine.input_layer.InputLayer at 0x7f8a41de05f8>,
 <keras.layers.core.Dense at 0x7f8a41ee4828>,
 <keras.layers.core.Dense at 0x7f8a41eaceb8>,
 <keras.layers.core.Dense at 0x7f8a41e50ac8>,
 <keras.layers.core.Dense at 0x7f8a41e5d780>]

autoencoder.layers
Out:
[<keras.engine.input_layer.InputLayer at 0x7f8a41da3940>,
 <keras.layers.core.Dense at 0x7f8a41da3978>,
 <keras.layers.core.Dense at 0x7f8a41da3a90>,
 <keras.layers.core.Dense at 0x7f8a41da3b70>,
 <keras.layers.core.Dense at 0x7f8a44720cf8>,
 <keras.layers.core.Dense at 0x7f8a41ee4828>,
 <keras.layers.core.Dense at 0x7f8a41eaceb8>,
 <keras.layers.core.Dense at 0x7f8a41e50ac8>,
 <keras.layers.core.Dense at 0x7f8a41e5d780>]

- слои одинаковые, к.

Итак, порядки обучения для A и B эквивалентны. В более общем плане, если вы разделяете слои (и, следовательно, веса), то порядок построения, компиляции и обучения в большинстве случаев не имеет значения, поскольку они находятся в одном и том же графе тензорного потока.

Я запускаю эти примеры для набора данных mnist, они показывают ту же производительность и хорошо восстанавливают изображения. Полагаю, если у вас проблемы с делом A, вы упустили другое (например, потому что я скопировал и вставил ваш код, и все в порядке).

Если вы используете jupyter, иногда перезапускайте и запускайте подсказки сверху вниз.

...