【问题标题】:Keras ValueError: ValueError: Error when checking target: expected dense_4 to have shape (None, 2) but got array with shape (2592, 1) Python3Keras ValueError:ValueError:检查目标时出错:预期dense_4具有形状(None,2)但得到形状为(2592,1)Python3的数组
【发布时间】:2018-03-12 02:34:43
【问题描述】:

我在尝试在 Keras 2.0.8、Python 3.6.1 和 Tensorflow 后端训练模型时遇到问题。

错误信息:

ValueError: 检查目标时出错:预期 dense_4 的形状为 (None, 2) 但得到的数组的形状为 (2592, 1)

X_train = numpy.swapaxes(X_train, 1, 3)
X_test = numpy.swapaxes(X_test, 1, 3)

print("X_train shape: ") --> size = (2592, 1, 1366, 96)
print("-----")
print("X_test shape") --> size = (648, 1, 1366, 96)
print("-----")
print(Y_train.shape) --> size = (2592,)
print("-----")
print("Y_test shape") --> size = (648,)

相关代码sn-ps:

K.set_image_dim_ordering('th')
K.set_image_data_format('channels_first')

def create_model(weights_path=None):
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3),activation='relu', padding="same", input_shape=(1, 1366, 96)))
    model.add(Conv2D(64, (3, 3), activation='relu', dim_ordering="th"))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(16, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    if weights_path:
        model.load_weights(weights_path)
    return model

model = create_model()
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.SGD(lr=0.01),
              metrics=['accuracy'])
history = model.fit(X_train, Y_train,
      batch_size=32,
      epochs=100,
      verbose=1,
      validation_data=(X_test, Y_test))

第 142 行,我调用 model.fit() 是我收到此错误的地方

我已尝试解决此错误 引用了这些堆栈溢出帖子:

我尝试使用以下代码重塑 Y_test 和 Y_train numpy 数组:

Y_train.reshape(2592, 2)
Y_test.reshape(648, 2)

但是,我收到以下错误:

ValueError: 无法将大小为 2592 的数组重新整形为 (2592,2)

【问题讨论】:

  • 您的 MCVE 即将完成。哪一行抛出错误?错误中还有 1336 vs 1366;确保逐字复制消息。
  • 第 142 行,也就是我调用 model.fit() 时更新了问题。
  • 好的,数字不匹配来自您的代码:input_shape 在Conv2D 中有错误的值。我建议将输入的形状显式传递给create_model,而不是对其进行硬编码。像这样的幻数很容易出错。
  • 抱歉,我在编写代码时似乎是一个错字。在修复Conv2D 中的input shape 后,我得到错误:ValueError: Error when checks target: expected dense_4 to have shape (None, 2) but got array with shape (2592, 1).我会更新问题。
  • 新错误很明显。为什么要尝试从 N 个元素重塑为 N*2 个元素?你真正想要实现的是什么?

标签: python-3.x machine-learning tensorflow deep-learning keras


【解决方案1】:

当您使用 categorical_crossentropy 损失时,您必须使用 one-hot 编码标签。为此,您可以使用来自keras.utils.np_utils 的函数to_categorical

from keras.utils import np_utils
y_train_onehot = np_utils.to_categorical(y_train)
y_test_onehot = np_utils.to_categorical(y_test)

然后使用 one-hot 编码标签来训练您的模型。

【讨论】:

    【解决方案2】:

    在我看来你需要改变神经网络的最后一层:

    def create_model(weights_path=None):
        model = Sequential()
        model.add(Conv2D(32, kernel_size=(3, 3),activation='relu', padding="same", input_shape=(1, 1366, 96)))
        model.add(Conv2D(64, (3, 3), activation='relu', dim_ordering="th"))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Flatten())
        model.add(Dense(128, activation='relu'))
        model.add(Dropout(0.1))
        model.add(Dense(64, activation='relu'))
        model.add(Dropout(0.1))
        model.add(Dense(16, activation='relu'))
        model.add(Dense(1, activation='sigmoid'))
        if weights_path:
            model.load_weights(weights_path)
        return model
    

    【讨论】:

    • 对此是否有更多解释,或者这只是另一种使错误消失的任意方式?
    • @AndrasDeak 确定有,检查你的 y 数据(标签)的形状,例如 Y_train.shape,Y_train 的第二维必须等于最后一层的大小神经网络。为什么?很简单,如果你有一个标签但输出层有两个标签,你应该如何网络工作?
    • 好的,我只是想确保您的答案背后有更深层次的推理(考虑到缺乏解释)。我不知道机器学习,我只是看到 OP 容易有点货物崇拜,想确保答案有帮助;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多