You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras模型创建失败:输入维度不匹配问题求助

解决Keras模型输入维度不匹配的问题

嘿,咱们来拆解下你碰到的这个错误:expected dense_67_input to have 2 dimensions, but got array with shape (3, 1, 36)。核心问题很明确——你的输入数据维度和模型第一层(Dense层)期望的维度对不上。

问题出在哪?

你现在的输入是个3维数组:(3, 1, 36),咱们拆分下这个形状:

  • 3:句子里包含的词数
  • 1:完全多余的单维度(应该是你做独热编码时不小心多加上的)
  • 36:独热编码的特征维度(你说词汇表是35个词,这里可能多了个未知词/占位符的维度?不管这个,先解决维度问题)

而Keras的Dense层默认只认2维输入:(样本数, 特征数)。要么是(3, 36)(3个词,每个词36维特征),要么你想把整句当一个样本的话,得把3个词的编码合并成一个特征向量。

具体解决办法

办法1:直接去掉多余的中间维度

输入里的1维度完全没必要,用numpy.squeeze()就能干掉它,把形状从(3,1,36)转成(3,36):

import numpy as np

# 假设你的原始输入是x
x = np.array([[[0,0,...1]], [[0,0,...0]], [[0,1,...0]]])  # 形状(3,1,36)
x_processed = np.squeeze(x, axis=1)  # 去掉索引为1的维度,输出形状(3,36)

之后用x_processed喂给模型,就符合Dense层的要求了。

办法2:给模型加个Flatten层适配输入

要是不想改原始数据的形状,就在模型最开头加个Flatten()层,把3维输入压成2维:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten

model = Sequential()
model.add(Flatten(input_shape=(1, 36)))  # 把(1,36)的输入压成36维特征向量
model.add(Dense(64, activation='relu'))
# 后续加你需要的其他层就行

这样模型会自动处理3维输入,转换成Dense层能识别的格式。

办法3:从根源上调整独热编码的生成方式

干脆在生成独热编码时就别产生多余维度,直接生成(36,)的一维数组,而不是(1,36)的二维数组。比如用np.eye()生成编码时:

vocab_size = 36
# 假设当前词的索引是idx
one_hot = np.eye(vocab_size)[idx]  # 生成形状为(36,)的数组,而非(1,36)

这样3个词的编码组合起来就是(3,36)的2维数组,直接就能喂给模型。

额外小提示

如果你的目标是做文本分类,这种单个词独热编码的方式(属于Bag of Words的一种),通常会把整句的词向量做求和/平均,转成一个(36,)的向量作为单样本输入,这样模型输入形状就是(样本数, 36),更符合常规文本分类模型的结构。比如:

# 把3个词的独热编码求和,得到整句的特征向量
sentence_vector = np.sum(x_processed, axis=0)  # 形状(36,)
# 如果是多个样本,最终形状就是(样本数, 36)

内容的提问来源于stack exchange,提问作者Timothy Rajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:25:49