无法编译用于多类预测的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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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