【发布时间】:2019-08-14 05:09:11
【问题描述】:
我正在按照教程https://blog.keras.io/building-autoencoders-in-keras.html 构建我的自动编码器。为此,我有两个策略:
A) 第一步:构建自动编码器;第二步:构建编码器;第三步:构建解码器;第四步:编译自编码器;第 5 步:训练自动编码器。
B) 第一步:构建自动编码器;第二步:编译自编码器;第三步:训练自动编码器;第四步:构建编码器;第 5 步:构建解码器。
对于这两种情况,模型都收敛到损失 0.100。但是,在教程中所述的策略 A 的情况下,重建效果很差。在策略 B 的情况下,重建要好得多。
在我看来,这是有道理的,因为在策略 A 中,编码器和解码器模型的权重是在未经训练的层上构建的,结果是随机的。另一方面,在策略 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)
【问题讨论】:
-
不是编程问题,因此这里可以说是题外话;有关机器学习理论和方法的问题应发布在Cross Validated。
-
谢谢!我也在那里发布了我的问题。它与理论和编码都有关,因为它取决于 Keras 如何构建其模型以及我如何编码我的层。所以我把它保留在两个社区;)
-
恐怕你不能这样做 - 请参阅Is cross-posting a question on multiple Stack Exchange sites permitted if the question is on-topic for each site? 请选择一个并删除另一个(就我个人而言,我在这里没有看到任何特定于 Keras 的内容,所以我仍然认为你应该删除这个)。
-
嗯好的。我删除了关于交叉验证的问题。谢谢desertnaut!
标签: python tensorflow machine-learning keras autoencoder