【问题标题】:keras autoencoder not convergingkeras 自动编码器不收敛
【发布时间】:2015-11-21 11:26:01
【问题描述】:

有人可以向我解释为什么自动编码器不收敛吗?对我来说,下面两个网络的结果应该是相同的。然而,下面的自动编码器没有收敛,而它下面的网络却是。

# autoencoder implementation, does not converge
autoencoder = Sequential()
encoder = containers.Sequential([Dense(32,16,activation='tanh')]) 
decoder = containers.Sequential([Dense(16,32)])
autoencoder.add(AutoEncoder(encoder=encoder, decoder=decoder, 
                        output_reconstruction=True))
rms = RMSprop()
autoencoder.compile(loss='mean_squared_error', optimizer=rms)

autoencoder.fit(trainData,trainData, nb_epoch=20, batch_size=64,
            validation_data=(testData, testData), show_accuracy=False)

 # non-autoencoder implementation, converges

model = Sequential()
model.add(Dense(32,16,activation='tanh')) 
model.add(Dense(16,32))
model.compile(loss='mean_squared_error', optimizer=rms)

model.fit(trainData,trainData, nb_epoch=numEpochs, batch_size=batch_size,
            validation_data=(testData, testData), show_accuracy=False)

【问题讨论】:

标签: autoencoder keras


【解决方案1】:

Keras 的新版本(0.3.0)不再在 AutoEncoder 中绑定权重,它仍然表现出不同的收敛性。这是因为权重的初始化方式不同。

在非 AE 示例中,首先初始化 Dense(32,16) 权重,然后是 Dense(16,32)。在AE示例中,首先初始化Dense(32,16)权重,然后是Dense(16,32),然后在创建AutoEncoder实例时,再次初始化Dense(32,16)权重(self.encoder.set_previous (node) 将调用 build() 来初始化权重)。

现在以下两个 NN 收敛完全相同:

autoencoder = Sequential()
encoder = containers.Sequential([Dense(32,16,activation='tanh')]) 
decoder = containers.Sequential([Dense(16,32)])
autoencoder.add(AutoEncoder(encoder=encoder, decoder=decoder, 
                        output_reconstruction=True))
rms = RMSprop()
autoencoder.compile(loss='mean_squared_error', optimizer=rms)
np.random.seed(0)
autoencoder.fit(trainData,trainData, nb_epoch=20, batch_size=64,
            validation_data=(testData, testData), show_accuracy=False)

# non-autoencoder
model = Sequential()
model.add(Dense(32,16,activation='tanh')) 
model.add(Dense(16,32))
model.set_weights(autoencoder.get_weights())
model.compile(loss='mean_squared_error', optimizer=rms)
np.random.seed(0)
model.fit(trainData,trainData, nb_epoch=numEpochs, batch_size=batch_size,
            validation_data=(testData, testData), show_accuracy=False)

【讨论】:

【解决方案2】:

我认为 Keras 的自动编码器实现将编码器和解码器的权重联系在一起,而在您的实现中,编码器和解码器具有不同的权重。如果您的实现在测试数据上带来了更好的性能,那么它可能表明您的问题可能需要未绑定的权重。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2018-01-25
相关资源
最近更新 更多