【问题标题】:Keras Dense Layer Output - Shape ErrorKeras 密集层输出 - 形状错误
【发布时间】:2018-06-27 06:44:18
【问题描述】:

我正在使用 LSTM 解决 NLP 问题。问题是具有 3 个类别(1,2 和 3)的多类别分类。所以我使用以下代码转换了目标类:y_train=to_catgorical(y_train)y_test 类似。 但是在我写model.add((Dense(3,activation='softmax'))的输出密集层,我得到以下错误:

检查目标时出错:预期dense_1 的形状为(None, 3),但得到的数组的形状为(658118, 4)

但是,当我将其修复为 model.add((Dense(4,activation='softmax')),即 n+1(n=要预测的类的数量)时,它可以工作。 但在 Keras 示例中,他们使用了 cifar10 数据集,并且使用的类数为 10,而不是 11,并且可以正常工作。 同样在二进制分类的情况下(要预测的 2 个类别),我们只使用 1 个输出,即model.add(Dense(1,"sigmoid"))。 我已经浏览了this post,但仍然无法为这个东西找到一个令人信服的逻辑,所以我想用 Keras 中的 Dense 层输出形状来澄清这个概念。

附:我的理解是,Keras 考虑来自0:num_classes 的类,所以我们必须再进行一次转换。但是要问一件事,“0”矢量图层必须保持未使用,对吗?在 cifar10 数据集的情况下,类是0:9,这就是 num_classes=10 起作用的原因吗?如果是这种情况,那么如果我们必须对 3 个类(0,1 & 2)进行预测,那么我们可以使用 num_classes=3 对吗?

【问题讨论】:

  • y_train 和 y_test 的形状是什么?它可能表明您有四个类,而不是三个。
  • Y_train 和 y_test 各有 3 个独特的类,1,2 和 3,而不是 4 个类。当我们进行二元分类时,为什么我们使用 1?
  • 如果你使用类索引 1,2,3,你有三个类,但是 keras 使用从零开始的索引,这就是为什么当你执行 to_categorical 时它会输出四个类,而不是三个。只需将您的类索引转换为从零开始。
  • 怎么做?你能告诉我。
  • y_train = y_train - 1 在做 to_categorical 之前,同样适用于 y_test。

标签: python keras deep-learning lstm convolutional-neural-network


【解决方案1】:

也许需要注意的是使用 Keras 框架来提供一个热编码功能:

from keras.datasets import cifar10
from keras.utils import np_utils    
y_label_train_OneHot = np_utils.to_categorical(y_label_train)
y_label_test_OneHot = np_utils.to_categorical(y_label_test)

你可以看到这个代码code 总之,我个人认为使用不同的功能会导致不同的类别。

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 2019-02-18
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2017-08-31
    • 2017-03-01
    相关资源
    最近更新 更多