我的问题是对这个问题的一个小扩展。我的图像尺寸为256×256,我的掩码尺寸为65536×4,因为我对其进行了扁平化处理(重塑数组),我有4个类别,因此是4。现在,我想训练一个U-Net来进行多类预测。以下是我的代码:
...
正如我所怀疑的,我无法正确地输入真实值。但我不知道如何解决这个问题。我该如何告诉网络将真实值的每个维度视为其自身的类别呢?
产生的错误如下:
ValueError: 无法为形状为 (1, 65536, 4) 的值提供给张量 ‘conv2d_transpose_20_target:0’,其形状为 ‘(?, ?, ?, ?)’
更新
下面的被接受的答案似乎确实解决了上述问题,但它不让我使用 model.load_weights('model-dsbowl2018-1.h5')
加载权重,因为它给我以下错误:
ValueError: 两个形状中的维度0必须相等,但它们是1和32。形状为 [1,1,4,32] 和 [32,1,1,1]。对于 ‘Assign_148’(操作:’Assign’)的输入形状:[1,1,4,32],[32,1,1,1]。
更新已解决 在训练多类分割网络时,您必须至少有2张图像。不知何故,单张图像是不够的。(我只是使用一张图像来进行健全性检查)
回答:
根据您的模型架构,看起来您保留了原始图像的尺寸,因此您的标签应该具有尺寸 (256,256,4)
。由于Keras在训练时总是需要4维张量,因此您的Y_train应具有以下尺寸
Y_train = [batch_size,img_height,img_width,number_of_classes]
查看错误维度 (1, 65536, 4) 您传递的
1 = batch_size ,65536 扁平化图像和 4 = num_of_classes
这个 65536
应该重塑为 (256, 256)
所以Y_train将是
Y_train = [1,256,256,4]
如果您想扁平化图像,您可以在模型中使用以下方式扁平化图像
from keras import backend as KK.flatten()
因此,您应该更改读取图像并执行扁平化操作的代码,而是保持图像的空间维度。
还有另一个观察,您定义输出类别数量的层
outputs = Conv2DTranspose(1, (1, 1), activation='sigmoid') (c9)
那应该改为
outputs = Conv2DTranspose(4, (1, 1), activation='softmax') (c9)#因为您有4个输出类别