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
相关产品推荐
相关产品推荐

