【问题标题】:Keras shows shape error at the end of first epochKeras 在第一个纪元结束时显示形状错误
【发布时间】:2018-12-13 06:44:36
【问题描述】:

我尝试用 keras 创建一个 LSTM 自动编码器

同时,它在第一个 epoch 结束时显示值错误

ValueError: operands could not be broadcast together with shapes (32,20) (20,20) (32,20) 

模型输入的形状是(sample_size,20,31),下面是模型

采样函数:

def sampling(args):

    z_mean, z_log_var = args
    batch = K.shape(z_mean)[0]
    dim = K.int_shape(z_mean)[1]
    # by default, random_normal has mean=0 and std=1.0
    epsilon = K.random_normal(shape=(batch,dim))
    return z_mean + K.exp(0.5 * z_log_var) * epsilon 

编码器部分:

inputs = Input(shape=(lag,data.shape[1],), name='encoder_input')
x = LSTM(30,activation='relu',return_sequences=True) (inputs)
x = LSTM(60,activation='relu') (x)
z_mean = Dense(60, name='z_mean')(x)
z_log_var = Dense(60, name='z_log_var')(x)
z_temp = Lambda(sampling, output_shape=(60,), name='z')([z_mean, z_log_var])
z = RepeatVector(lag)(z_temp)
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')

解码器部分:

latent_inputs = Input(shape=(lag,60), name='z_sampling')
x_2 = LSTM(60, activation='relu',return_sequences= True)(latent_inputs)
x_2 = LSTM(data.shape[1], activation='relu',return_sequences= True)(x_2)
decoder = Model(latent_inputs, x_2, name='decoder')
outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs)

还有loss和fit部分:

outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs)
reconstruction_loss = mse(inputs, outputs)
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.mean(kl_loss)
kl_loss *= -0.1
vae_loss = reconstruction_loss + kl_loss
vae.add_loss(vae_loss) 
vae.compile(optimizer='adam')
vae.fit(train,epochs=100)

会导致这个错误:

Epoch 1/100
632256/632276 [============================>.] - ETA: 0s - loss: 0.0372
ValueError: operands could not be broadcast together with shapes (32,20) (20,20) (32,20) 

如果存在形状错误,剂量模型在上一步中的工作方式。这是我的主要问题,谢谢你的回答

【问题讨论】:

  • 您能提供可重现的代码吗?你如何定义sampling
  • 这是完整的错误信息吗?我没有看到 Op 和 Tensor。

标签: python keras lstm autoencoder


【解决方案1】:

您正在使用 32 的批量大小,但在最后,您的操作数会得到一个只有 20 个元素的张量,因为这个数量在 632256 和 632276 之后仍然存在:

632276 - 632256 = 20

基本上这是错误消息,这就是前面的步骤有效的原因。

最直接的解决方案:

使用fit() 方法的steps_per_epoch 选项:

steps_per_epoch:整数或无。
总步数(批次 样本)在宣布一个时期结束并开始下一个时期之前 时代。使用输入张量(例如 TensorFlow 数据)进行训练时 张量,默认无等于你的样本数 数据集除以批量大小,如果无法确定,则为 1。

steps_per_epoch = total_samples // batch_size

在这种情况下,基本上你会删除最后 20 个样本。

【讨论】:

  • 哦,它有效。我手动删除了最后 20 个样本。但我不明白为什么会这样。在我看来,fit() 函数会检测到 batch_size 本身。为什么这次还有余数。还是谢谢你。
  • @JackyTsai 实际上fit() 确实“检测”batchsize 但不检查它,例如keras make_batches 从 batchsize=32, number of samples=74 做这样的批次:[(0, 32), (32, 64), (64, 74)]。
  • 您的代码不起作用。 np.ceil(33/32) 得到 2.0。它不会删除 1 也不会给出 int。试过total_samples//batch_size,这是正确的。这次它在第二个纪元开始时失败了。 34240/34247 [====>.] xxxx Epoch 2/15 71/34247 [....] ValueError: 操作数无法与形状 (7,) (64,) (7,) 一起广播
  • @MeowCat2012 我真的不知道,为什么我使用 ceil,因为在实践中我总是使用 //。所以谢谢你的收获。关于值错误,这是由于其他一些问题。
猜你喜欢
  • 2020-05-21
  • 2019-03-23
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
相关资源
最近更新 更多