【发布时间】:2021-12-28 06:43:02
【问题描述】:
我正在尝试实现基于 LSTM 的 VAE。 输入形状为 (sample_number, 96, 24) 我希望模型的输出形状为 (24)
# encoder
latent_dim = 24
inter_dim = 32
timesteps, features = 96, 24
def sampling(args):
z_mean, z_log_sigma = args
batch_size = tf.shape(z_mean)[0] # <================
epsilon = K.random_normal(shape=(batch_size, latent_dim), mean=0., stddev=1.)
return z_mean + z_log_sigma * epsilon
# timesteps, features
input_x = Input(shape= (timesteps, features))
#intermediate dimension
h = LSTM(inter_dim)(input_x)
#z_layer
z_mean = Dense(latent_dim)(h)
z_log_sigma = Dense(latent_dim)(h)
z = Lambda(sampling)([z_mean, z_log_sigma])
# Reconstruction decoder
decoder1 = RepeatVector(timesteps)(z)
decoder1 = LSTM(inter_dim, return_sequences=True)(decoder1)
decoder1 = Dense(features)(decoder1)
output = (Dense(24, activation='softmax'))(decoder1)
def vae_loss2(input_x, decoder1, z_log_sigma, z_mean):
""" Calculate loss = reconstruction loss + KL loss for each data in minibatch """
# E[log P(X|z)]
recon = K.sum(K.binary_crossentropy(input_x, decoder1))
# D_KL(Q(z|X) || P(z|X)); calculate in closed form as both dist. are Gaussian
kl = 0.5 * K.sum(K.exp(z_log_sigma) + K.square(z_mean) - 1. - z_log_sigma)
return recon + kl
m = Model(input_x, output)
m.add_loss(vae_loss2(input_x, decoder1, z_log_sigma, z_mean)) #<===========
m.compile(loss=categorical_crossentropy, optimizer='adam', metrics=['accuracy'])
这是目前为止的代码,但是我如何设置这个模型以便它可以有 24 个并在其末尾激活 softmax?
【问题讨论】:
-
你可以在你的 LSTM 中设置
return_sequences=False。但是 VAE 通常应该像自动编码器一样工作 --> input.shape == output.shape -
@AloneTogether 然后,它抱怨维度:(
-
你的错误信息是什么?
-
@AloneTogether 这似乎与损失函数有关。
Errors may have originated from an input operation. Input Source operations connected to node model_29/tf.keras.backend.binary_crossentropy_28/mul: In[0] model_29/Cast (defined at /usr/local/lib/python3.7/dist-packages/keras/engine/functional.py:671) In[1] model_29/tf.keras.backend.binary_crossentropy_28/Log: -
您的模型的用例是什么?你想做什么?文字?
标签: python tensorflow keras deep-learning lstm