如何修复 Logits 和 Labels 必须具有相同的形状?

Posted

技术标签:

【中文标题】如何修复 Logits 和 Labels 必须具有相同的形状?【英文标题】:How to fix Logits and Labels must have the same shape? 【发布时间】:2022-01-05 09:40:23 【问题描述】:

我正在构建一个神经网络,同时调用

model.compile(optimizer=Adam(learning_rate=0.1), loss="binary_crossentropy", metrics=['accuracy'])

我收到以下错误:

ValueError: logits 和 labels 必须具有相同的形状 ((5, 560, 2) vs (5, 1, 1))

一点背景知识,我使用的数据是来自图像的像素数据。 Data_x 是一个 3d NumPy 数组,其中第一维是不同的图像,第二维和第三维是该图像的像素数组,如下所示:

(32086, 560, 560)

我的 Data_Y 用于我的标签,NN 应该做出二元决策,因此标签是 1 或 0。 它看起来像这样:

(32086, 1, 1)

我访问数据如下:

f = gzip.GzipFile('Data_x.npy.gz', "r")
datax = np.load(f)[:5, :, :]
f.close()
f = gzip.GzipFile('Data_y.npy.gz', "r")
datay = np.load(f)[:5, :, :]
f.close()

错误表明它们应该是相同的形状,但每个像素应该只为每个单独的图像有一个标签是没有意义的。

这是我的模型架构:

model = Sequential(
[
    Dense(750, activation='relu'),
    Dropout(0.2),
    Dense(750, activation='relu'),
    Dropout(0.2),
    Dense(2, activation='sigmoid')
]

) 任何帮助将不胜感激。

【问题讨论】:

在最后一个 Dense/Dropout 之前尝试使用 Keepdims=True 的 GlobalMaxPooling1D,然后再次将最后一个 Dense 的单位从 2 更改为 1 @MarcoCerliani 这是图层的唯一输入,因为我收到了这个错误:ValueError: Input 0 of layer global_max_pooling1d is incompatible with the layer: expected ndim=3, found ndim=4。收到的完整形状:(无、5、560、750) 您声明输入的形状为 (32086, 560, 560) 而这不是 4D...也许您错过报告某些内容...但是如果您的数据是 4D,请使用 GlobalMaxPooling2D @MarcoCerliani 当我使用 1D 时,它说它的输入是 4D,但是当我切换到 2D 时,它说它的输入是 3D。你知道我该如何解决这个问题吗? 【参考方案1】:

您确定要直接在 2D 图像数据上使用密集连接的网络吗?这样,您的网络将立即应用于每一列而不是所有像素。更常见的是首先使用flatten 层将二维矩阵展开为一维向量并将网络应用于该向量。但是,如果有这么多像素,那将是一个非常大的模型。

【讨论】:

以上是关于如何修复 Logits 和 Labels 必须具有相同的形状?的主要内容,如果未能解决你的问题,请参考以下文章

Logits 和 Labels 必须具有相同的形状:Tensorflow

ValueError:logits 和标签必须具有相同的形状

logits 和标签必须是可广播的:logits_size=[0,2] labels_size=[32,2]

Tensorflow 卷积网络错误:无效参数:logits 和标签必须相同大小:logits_size=[512,4] labels_size=[128,4]

TensorFlow ValueError:logits 和标签必须具有相同的形状 ((25, 1) vs (1, 1))

Tensorflow:logits 和标签必须具有相同的第一维