我正在尝试使用多层编码器 - 解码器类型的网络。最后几层网络架构的屏幕截图如下。这就是我设置模型编译和培训过程的方法。
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_train
和imgs_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不包含有关如何设置目标张量的详细信息。任何建议都非常感谢!
答案 0 :(得分:0)
我目前正在尝试解决同样的问题,据我所知,它需要对目标类别进行稀疏表示。这意味着整数作为目标标签而不是单热编码二进制类矩阵。
关于您的问题,您的掩蔽中是否有类别,或者您是否只有关于对象轮廓的信息?对于轮廓信息,它变成像素二进制损失而不是分类丢失。如果您有类别,则解码器的输出应具有维度(None,number_of_classes,128,128)。在那你应该能够使用稀疏的目标面具,但我自己没有尝试过这个... 希望有所帮助