【问题标题】:Keras LSTM VAE invalid output shapeKeras LSTM VAE 无效的输出形状
【发布时间】: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


【解决方案1】:

如果您正在训练文本 VAE,您可以尝试使用 TimeDistributed 层,如下所示:

decoder1 = tf.keras.layers.RepeatVector(timesteps)(z)
decoder1 = tf.keras.layers.LSTM(inter_dim, return_sequences=True)(decoder1)
output =  tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(24, activation='linear'))(decoder1)

在你的损失函数中使用SparseCategoricalCrossentropy:

def vae_loss2(input_x, output, z_log_sigma, z_mean):

    cross_entropy = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    recon = cross_entropy(input_x, output))

    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, output, z_log_sigma, z_mean))
m.compile(optimizer='adam', metrics=['accuracy'])

TimeDistributed 层只是将具有 softmax 激活函数的 Dense 层应用于来自LSTM 层的序列中的每个时间步。

【讨论】:

  • 感谢您的友好回复。但是,我收到此错误:File "/usr/local/lib/python3.7/dist-packages/keras/backend.py", line 4994, in categorical_crossentropy target.shape.assert_is_compatible_with(output.shape) ValueError: Shapes (None, 24) and (None, 96, 24) are incompatible 这是因为 input_x 是 (None, 96, 24) 而output 是 (None, 24)?
  • 是的,请确保您设置了return_sequences=True
  • 我检查了decoder1 = tf.keras.layers.LSTM(inter_dim, return_sequences=True)(decoder1) 这个但它仍然给我同样的错误.. input_9 (InputLayer) [(None, 96, 24)] 0 [] output_layer (TimeDistributed) (None, 96, 24) 792 ['lstm_17[0][0]'] 这些来自m.summary()。它们的尺寸看起来相同,但不确定为什么会引发错误。
  • 你的数据是什么形状的?在调用model.compile 时,您是否确保向您的模型添加另一个损失函数?它应该只是m.compile(optimizer='adam', metrics=['accuracy'])
  • 是否符合我的建议? @NoSleep
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2018-02-27
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多