首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在建立编码器/解码器模型之前对自动编码器进行训练是否有效?

在建立编码器/解码器模型之前对自动编码器进行训练是否有效?
EN

Stack Overflow用户
提问于 2019-03-23 10:23:47
回答 1查看 185关注 0票数 0

我正在遵循教程https://blog.keras.io/building-autoencoders-in-keras.html来构建我的自动编码器。为此,我有两种策略:

A)步骤1:构建自动编码器;步骤2:生成编码器;步骤3:生成解码器;步骤4:编译自动编码器;步骤5:训练自动编码器。

B)步骤1:构建自动编码器;步骤2:编译自动编码器;步骤3:训练自动编码器;步骤4:生成编码器;步骤5:生成解码器。

对于这两种情况,模型收敛到损失0.100。然而,就本教程中所述的战略A而言,重建工作非常糟糕。在策略B的情况下,重建效果更好。

在我看来,这是有意义的,因为在策略A中,编码器和解码器模型的权重是在未经训练的层上建立的,并且结果是随机的。而在策略B中,训练后的权重定义得更好,因此重建效果更好。

我的问题是,B策略是有效的还是我在重建中作弊?在策略A中,Keras是否应该自动更新编解码模型的权重,因为它们的模型是建立在自动编码器层的基础上的?

代码语言:javascript
复制
###### 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-23 15:20:43

我的问题是,B策略是有效的还是我在重建中作弊?

AB是等价的;不,你没有作弊。

在策略A中,Keras是否应该自动更新编解码模型的权重,因为它们的模型是建立在自动编码器层的基础上的?

译码器模型只使用自动编码器层。万一A

代码语言:javascript
复制
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行的十六进制数(对象id)都是相同的--因为它是相同的对象。当然,他们也分享自己的重量。

万一B

代码语言:javascript
复制
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>]
  • 图层是一样的。

因此,AB的训练顺序是相等的。更一般的情况是,如果您共享层(以及相应的权重),那么在大多数情况下,构建、编译和培训的顺序并不重要,因为它们在相同的tensorflow图中。

我在mnist数据集上运行了这个示例,它们显示了相同的性能并很好地重建了图像。我想,如果您在case A上遇到了麻烦,那么您就错过了其他的事情(看看如何,因为我复制了粘贴您的代码,一切都很好)。

如果您使用jupyter,有时重新启动并运行自上而下的帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55312734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档