Luc*_*eia 0 autoencoder tensorflow
我一直在尝试创建 LSTM VAE 来重建 Tensorflow 上的多元时间序列数据。首先,我尝试调整(更改为功能 API,更改层)此处采用的方法,并得出以下代码:
input_shape = 13
latent_dim = 2
prior = tfd.Independent(tfd.Normal(loc=tf.zeros(latent_dim), scale=1), reinterpreted_batch_ndims=1)
input_enc = Input(shape=[512, input_shape])
lstm1 = LSTM(latent_dim * 16, return_sequences=True)(input_enc)
lstm2 = LSTM(latent_dim * 8, return_sequences=True)(lstm1)
lstm3 = LSTM(latent_dim * 4, return_sequences=True)(lstm2)
lstm4 = LSTM(latent_dim * 2, return_sequences=True)(lstm3)
lstm5 = LSTM(latent_dim, return_sequences=True)(lstm4)
lat = Dense(tfpl.MultivariateNormalTriL.params_size(latent_dim))(lstm5)
reg = tfpl.MultivariateNormalTriL(latent_dim, activity_regularizer= tfpl.KLDivergenceRegularizer(prior, weight=1.0))(lat)
lstm6 = LSTM(latent_dim, return_sequences=True)(reg)
lstm7 = LSTM(latent_dim * 2, return_sequences=True)(lstm6)
lstm8 = LSTM(latent_dim * 4, return_sequences=True)(lstm7)
lstm9 = LSTM(latent_dim * 8, return_sequences=True)(lstm8)
lstm10 = LSTM(latent_dim * 16, return_sequences=True)(lstm9)
output_dec = TimeDistributed(Dense(input_shape))(lstm10)
enc = Model(input_enc, reg)
vae = Model(input_enc, output_dec)
vae.compile(optimizer='adam',
loss='mse',
metrics='mse'
)
es = callbacks.EarlyStopping(monitor='val_loss',
mode='min',
verbose=1,
patience=5,
restore_best_weights=True,
)
vae.fit(tf_train,
epochs=1000,
callbacks=[es],
validation_data=tf_val,
shuffle=True
)
Run Code Online (Sandbox Code Playgroud)
通过观察 MSE 作为指标,我注意到它在训练过程中没有变化,只是散度下降了。然后我将Activity_regularizer参数设置为None,事实上,MSE 确实下降了。因此,KL 散度似乎阻止了重构误差的优化。
这是为什么?我做错了什么吗?非常感谢任何帮助!
(我知道潜在维度相当小,我将其设置为两个以轻松可视化它,尽管这种行为仍然会在较大的潜在维度中发生,因此我认为问题不在那里。)
小智 5
是否您正在使用自动编码器并且损失中存在 KL 散度项?在(Beta-)VAE 中,损失为Loss = MSE + beta * KL。
由于 beta = 1 是正常的 VAE,因此您可以尝试使 beta 小于 1。这应该为 MSE 赋予更大的权重,而为 KL 散度赋予更少的权重。这应该有助于重建,但如果你想要一个解开的潜在空间,那就不好了。
| 归档时间: |
|
| 查看次数: |
2276 次 |
| 最近记录: |