关于为sparse_categorical_crossentropy设置目标张量形状

时间:2016-12-30 23:11:24

标签: tensorflow keras

我正在尝试使用多层编码器 - 解码器类型的网络。最后几层网络架构的屏幕截图如下。这就是我设置模型编译和培训过程的方法。

optimizer = SGD(lr=0.001, momentum=0.9, decay=0.0005, nesterov=False)
    autoencoder.compile(loss="sparse_categorical_crossentropy", optimizer=optimizer, metrics=['accuracy'])

model.fit(imgs_train, imgs_mask_train, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1,callbacks=[model_checkpoint])

imgs_trainimgs_mask_train的形状为(2000, 1, 128, 128)imgs_train代表原始图像,imgs_mask_train代表蒙版图像。我正在尝试解决语义分段问题。但是,运行该程序会生成以下错误消息,(我只保留主要相关部分)。

tensorflow.python.pywrap_tensorflow.StatusNotOK: Invalid argument: logits first dimension must match labels size.  logits shape=[4096,128] labels shape=[524288]                                                                                                      
         [[Node: SparseSoftmaxCrossEntropyWithLogits = SparseSoftmaxCrossEntropyWithLogits[T=DT_FLOAT, Tlabels=DT_INT64, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_364, Cast_158)]]                                                                    

在我看来,sparse_categorical_crossentropy的丢失函数导致当前(imgs_train,imgs_mask_train)形状设置的问题。 Keras API不包含有关如何设置目标张量的详细信息。任何建议都非常感谢!

enter image description here

1 个答案:

答案 0 :(得分:0)

我目前正在尝试解决同样的问题,据我所知,它需要对目标类别进行稀疏表示。这意味着整数作为目标标签而不是单热编码二进制类矩阵。

关于您的问题,您的掩蔽中是否有类别,或者您是否只有关于对象轮廓的信息?对于轮廓信息,它变成像素二进制损失而不是分类丢失。如果您有类别,则解码器的输出应具有维度(None,number_of_classes,128,128)。在那你应该能够使用稀疏的目标面具,但我自己没有尝试过这个... 希望有所帮助