我正在尝试制作一个自动编码器,但遇到了上述错误。在 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}}]]
我可以编译我的模型。在这里:
Layer (type) Output Shape Param #
================================================================= lambda_7 (Lambda) (None, 499, 22) 0
_________________________________________________________________ cu_dnnlstm_14 (CuDNNLSTM) (None, 300) 388800
_________________________________________________________________ repeat_vector_12 (RepeatVect (None, 499, 300) 0
_________________________________________________________________ cu_dnnlstm_15 (CuDNNLSTM) (None, 499, 50) 70400
_________________________________________________________________ time_distributed_6 (TimeDist (None, 499, 22) 1122
================================================================= Total params: 460,322 Trainable params: 460,322 Non-trainable params: 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。就好像它要我翻转我的列和行一样?
最佳答案
您的问题与输出的形状有关。 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,)
。
我不完全确定我理解你想要完成的事情,但看起来你需要相应地调整损失函数。
关于python - 无法挤压 dim[1],期望维度为 1,得到 499,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55203072/