Keras搭建SIMON模型时报错输入张量秩为2不符合3/4/5要求如何解决
问题原因
- 核心错误是文档模型的输入维度和TimeDistributed层要求不匹配:
- TimeDistributed包装的sentModel要求输入维度为
(batch_size, 时间步/句子数, 句子长度, 字符维度),也就是每个输入样本是包含N个句子的文档 - 你现在传给buildDocModel的输入是sentModel的输入
sentModelInput,shape为(30,28),没有「句子数」这个维度。TimeDistributed会把输入的第一个维度(30)当作时间步,给sentModel传入的每个时间步的张量shape是(28,),属于秩2张量,而sentModel第一层Conv1D要求输入是秩3的(句子长度, 字符维度),自然触发报错。
- TimeDistributed包装的sentModel要求输入维度为
- 额外逻辑问题:你当前的训练数据x_train的shape是
(3003, 30, 28),说明每个样本就是单个句子,这种场景下不需要套TimeDistributed的文档编码器,直接用sentModel即可。如果确实是要处理多句子的文档分类任务,需要先调整输入数据的维度。
修复方案
场景1:单句子分类任务(和当前x_train维度匹配)
直接去掉docModel的TimeDistributed封装,用sentModel直接输出分类结果即可,修改后代码:
import numpy as np from keras.layers import Input, Conv1D, Bidirectional, LSTM, Dense from keras.models import Model maxLength = 30 max_cells = 3003 charMap = {'a': 1,'b': 2, 'c': 3,'d': 4,'e': 5,'f': 6, 'g': 7,'h': 8, 'i': 9, 'j': 10, 'k': 11, 'l': 12,'m': 13, 'n': 14, 'o': 15, 'p': 16, 'q': 17,'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22,'w': 23, 'x': 24, 'y': 25, 'z': 26, ' ': 27} maxChars = len(charMap)+1 x_train = np.zeros((max_cells, maxLength, maxChars), dtype='float32') y_train = np.zeros((max_cells, 3), dtype='int32') def buildSentModel(sentModelInput): layer = Conv1D(10, 5, padding='valid', activation='relu', strides=1)(sentModelInput) layer = Bidirectional(LSTM(units=12, return_sequences=False))(layer) layer = Dense(3, activation='sigmoid')(layer) return Model(inputs=sentModelInput, outputs=layer) sentModelInput = Input(shape=(30,28), dtype='float32') model = buildSentModel(sentModelInput) model.compile(optimizer="adam", loss='categorical_crossentropy', metrics=['categorical_accuracy']) model.fit(x_train, y_train, steps_per_epoch=20,epochs=100, shuffle=True)
场景2:多句子文档分类(使用原SIMON的文档编码器逻辑)
需要先把输入数据调整为(样本数, 文档句子数, 句子长度, 字符维度)的4维格式,再修改docModel的输入shape:
# 假设每个文档包含10个句子,调整训练数据shape x_train = np.zeros((max_cells, 10, maxLength, maxChars), dtype='float32') # 构建docModel时传入正确的输入shape docInput = Input(shape=(10, 30, 28), dtype='float32') docModel = buildDocModel(sentModel, docInput)
内容的提问来源于stack exchange,提问作者webber
相关产品推荐
相关产品推荐

