如何将一个标签应用于 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
是因为第一个维度应该是样本数,并且x
和y
需要相同。在您的示例中,情况并非如此。你需要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 维度?的主要内容,如果未能解决你的问题,请参考以下文章