无法挤压dim [1],预期尺寸为1,得到499

时间:2019-03-17 01:25:59

标签: python keras lstm

我正在尝试制作自动编码器,并且卡在上述错误中。在Stack Exchange上查看与此相关的其他帖子没有帮助。

这是完整的错误:

InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 499
 [[{{node metrics_12/acc/Squeeze}}]]
 [[{{node ConstantFoldingCtrl/loss_12/time_distributed_6_loss/broadcast_weights/assert_broadcastable/AssertGuard/Switch_0}}]]

我可以编译我的模型。在这里:

  

图层(类型)输出形状参数#
  ================================================== ============== lambda_7(Lambda)(None,499,22)0
  _________________________________________________________________ cu_dnnlstm_14(CuDNNLSTM)(无,300)388800
  _________________________________________________________________ repeat_vector_12(RepeatVect(无,499,300)0
  _________________________________________________________________ cu_dnnlstm_15(CuDNNLSTM)(无,499,50)70400
  _________________________________________________________________ time_distributed_6(TimeDist(None,499,22)1122
  ================================================== ===============总参数:460,322可训练参数:460,322非可训练参数:   0

lambda层采用填充序列的形状(1,499),并将其转换为具有22个可能值的onehot。然后,我将其传递给编码的CuDNNLSTM,重复矢量,另一个CuDNNLSTM,然后传递带有softmax激活的时间分布密集层。

我使用:

model.compile('rmsprop', 'sparse_categorical_crossentropy', metrics=['acc'])

并且:

model.fit(s_min_one, s_min_one,
   batch_size=batchS,
   epochs=epochS,
   verbose = 1,  
   shuffle=True)

这给了我我的错误。

我使用稀疏分类,因此我的数据可以是整数格式,取值范围为0到21(对于22个要素)。而且我不明白为什么该错误期望任何东西的尺寸为1。好像要我翻转列和行?

1 个答案:

答案 0 :(得分:1)

您的问题与输出的形状有关。 sparse_categorical_crossentropy需要整数目标(请参阅the documentation:“使用sparse_categorical_crossentropy损失时,您的目标应为整数目标。”)

您正在传递形状为(batch_size, 1, 499)的数据作为输入和标签:

model.fit(s_min_one, s_min_one, ...)

那是行不通的,标签的形状必须为(batch_size, 1)或仅仅是(batch_size,)

我不能完全确定我了解您要完成的工作,但是您似乎需要相应地调整损失函数。