如何将一个标签应用于 Keras 神经网络的 NumPy 维度?

Posted

技术标签:

【中文标题】如何将一个标签应用于 Keras 神经网络的 NumPy 维度?【英文标题】:How to apply one label to a NumPy dimension for a Keras Neural Network? 【发布时间】:2022-01-05 06:48:26 【问题描述】:

我目前正在使用 Keras 开发一个简单的神经网络,但我的标签遇到了问题。网络正在做出二元选择,因此,我的标签都是 1 和 0。我的数据由一个 3d NumPy 数组组成,基本上是来自一堆图像的像素数据。它的形状是 (560, 560, 32086)。但是,由于前两个维度只是像素,因此我不应该为每个维度分配标签,因此我尝试使用形状 (1, 1, 32086) 制作标签数组,以便每个图像只有 1 个标签。但是,当我尝试使用以下代码编译它时:

model = Sequential(
    [
        Rescaling(1.0 / 255),
        Conv1D(32, 3, input_shape=datax.shape, activation="relu"),
        Dense(750, activation='relu'),
        Dense(2, activation='sigmoid')
    ]
)
model.compile(optimizer=SGD(learning_rate=0.1), loss="binary_crossentropy", metrics=['accuracy'])
model1 = model.fit(x=datax, y=datay, batch_size=1, epochs=15, shuffle=True, verbose=2)

我收到此错误“ValueError:数据基数不明确: x 尺寸:560 y 尺寸:1 确保所有数组都包含相同数量的样本。”我假设这意味着标签必须与输入数据的大小相同,但这对于每个像素都有单独的标签没有意​​义。

数据是通过一个 for 循环来收集的,循环遍历目录中的文件并读取它们的像素数据。然后我将它添加到 NumPy 数组中,并将它们对应的标签添加到标签数组中。对此问题的任何帮助将不胜感激。

【问题讨论】:

也许您可以使用另一个数据集准备一个可重现的示例?例如。取MNIST 并删除除两位数之外的所有内容来模拟您的问题(二进制图像分类和只有一个通道)。这将有助于其他人帮助您的网络架构。 【参考方案1】:

出现ValueError 是因为第一个维度应该是样本数,并且xy 需要相同。在您的示例中,情况并非如此。你需要datax 才能拥有(32086, 560, 560) 的形状,而datay 应该是(32086,)

查看this example 并注意60000 张训练图像的形状(60000, 28, 28)

此外,我怀疑您的代码中还存在一些错误:

    您确定要Conv1D 层而不是Conv2D?也许this example 会提供信息。 由于您使用的是二元交叉熵损失,因此您的最后一层应该只有一个输出,而不是两个。

【讨论】:

我现在收到错误 ValueError: logits and labels must have the same shape ((32086, 560, 2) vs (32086, 1, 1)) 但实际形状是 32086, 560 , 560 和 32086, 1, 1

以上是关于如何将一个标签应用于 Keras 神经网络的 NumPy 维度?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 keras 实现多标签分类神经网络

Keras:如何在编译期间输入形状未知时创建带权重的自定义图层?

如何使用 tf.keras 在 RNN 中应用层规范化?

Keras 如何在多标签学习中更新权重(实现方式)

Keras如何构造简单的CNN网络

使用Python,Keras和TensorFlow训练第一个CNN