对于Keras来说,我还比较陌生,并且正在尝试使用TensorFlow后端实现U-Net架构,以便在许多256x256图像上进行像素级,多类分类。输入形状和输出形状均为256x256x1(批大小也为1)。
我有30多个类,因此我尝试使用sparse_categorical_crossentropy
作为损失函数(常规分类交叉熵给我带来了内存错误),正如许多在线论坛建议的那样。当我将“ metric”参数从“ accuracy”更改为“ sparse_categorical_accuracy”时,出现此错误:
InvalidArgumentError: Incompatible shapes: [65536] vs. [1,256,256]
[[{{node metrics_3/sparse_categorical_accuracy/Equal}} =
Equal[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics_3/sparse_categorical_accuracy/Reshape, metrics_3/sparse_categorical_accuracy/Cast)]]
[[{{node metrics_3/sparse_categorical_accuracy/Mean/_749}} =
_Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_3000_metrics_3/sparse_categorical_accuracy/Mean", tensor_type=DT_FLOAT,
_device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
似乎期望我的输出是1D而不是2D?我需要更改数据格式吗?但是,当我尝试在我的U-Net的末尾使用平坦层紧随其后的是一层致密层(产生65536个矢量输出)来平坦化输出时,出现另一个错误,表示预期的输出尺寸为1。我也尝试过将最后一层中的通道数更改为我正在使用的类的总数(以使输出为256x256xnum_classes),但是出现相同的错误。
此外,当我只是将“ metric”参数保留为“ accuracy”时,代码会运行,但损失始终为NaN
,精度非常快地收敛到约0.008。在这种情况下,“准确性”默认为什么?
sparse_categorical_accuracy
有这些已知问题吗?我一直无法在网上找到很多信息,关于此特定损失函数的Keras文档也很稀少。任何帮助表示赞赏!请让我知道是否还需要代码的其他部分来帮助调试。