【问题标题】:Stuck matching output shape of Conv2DNet to expected tensor将 Conv2DNet 的输出形状与预期张量相匹配
【发布时间】:2018-08-30 00:03:43
【问题描述】:

我正在尝试在 Keras 中实现 here 提供的模型。我或多或少认为 Keras 模型相当于:

inputShape = (32, 640, 3)

model = Sequential()
model.add(Conv2D(NC//2, kernel_size=(4,4), strides=(2,2), kernel_regularizer=regularizers.l2(1e-5), activation='relu', padding='same', input_shape=inputShape))
model.add(Conv2D(NC, kernel_size=(4,4), strides=(2,1), activation='relu', kernel_regularizer=regularizers.l2(1e-5), padding='same'))
model.add(Conv2D(NC, kernel_size=(8,5), strides=(8,5), activation='relu', kernel_regularizer=regularizers.l2(1e-5), padding='same'))
model.add(Reshape((-1, MAX_CHAR, NC)))

训练数据由 5000 张 32x640 随机生成的字符串图像组成,并被分成两个数组,输入 A 和输出 YA 是图像矩阵 (NIMG, Height, Width, Channel)Y 是字符矩阵(NIMG, MAX_CHAR)

MAX_CHAR 是图像中的最大字符数,在本例中为 64。NC 是可能的不同字符数,在本例中为 63。

问题是,当我运行 model.fit(A, Y) 时,我得到:

ValueError: Error when checking target: expected reshape_1 to have 4 dimensions, but got array with shape (5001, 64)

这是有道理的,看看博客文章中的说法:

目标矩阵是具有三个维度的 3D 矩阵 分别对应sample、character、1-hot encoding。

我尝试过model.Flatten(),但这给我留下了(4032,) 的形状,比训练数据中的64 个字符大得多。我也尝试过使用 Reshape 向量值,但无济于事。

所以我的问题是:我做错了什么吗?有什么我从根本上误解的东西,还是有一个我似乎无法想到/找到的解决方案?

【问题讨论】:

  • 正如博文中所述,Y 应该是形状为(NIMG, MAX_CHAR, NC) 而不是(NIMG, MAX_CHAR) 的3D 矩阵。您需要对 Y 中的字符进行 one-hot 编码。
  • 你是对的,谢谢。我对盲目复制代码不利。现在开始工作了

标签: python machine-learning keras conv-neural-network


【解决方案1】:

显然,如 cmets 中所述,单热编码标签(即Y)解决了该问题。

注意:此答案作为社区 wiki 发布,如 accepted answer of "Question with no answers, but issue solved in the comments (or extended in chat)" 中所建议的那样。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2018-02-26
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2018-06-10
    • 2021-04-01
    相关资源
    最近更新 更多