无法编译用于多类预测的Keras模型

我的问题是对这个问题的一个小扩展。我的图像尺寸为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个输出类别

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注