训练2D输出的ANN时出现形状不兼容InvalidArgumentError如何解决?
报错根因
该报错是模型输出维度和标签维度不匹配导致:
- 你的目标集
y_trn维度为(样本数, 3),每个样本对应1个长度为3的一维向量 - 当前模型最终输出维度为
(样本数, 3, 3):你添加的RepeatVector(3)层会把前序输出的(batch_size,1)张量扩展为(batch_size,3,1),再经过TimeDistributed(Dense(3))处理后,输出维度就变成了(batch_size,3,3),和标签维度无法匹配,计算损失时触发维度错误。
修复方案
根据你的实际需求二选一即可:
方案1:输出与目标集匹配的一维向量(适用于3分类/多标签分类场景)
完全删掉RepeatVector和TimeDistributed相关层,直接将输出层单元数设置为3即可,修正后的代码示例:
num_outputs = 3 ann = tf.keras.models.Sequential() # 输入层指定特征维度为5 ann.add(tf.keras.layers.Dense(units=8,activation="relu", input_shape=(5,))) ann.add(tf.keras.layers.Dropout(0.2)) ann.add(tf.keras.layers.Dense(units=64,activation="relu")) ann.add(tf.keras.layers.Dense(units=8,activation="relu")) # 按需选择输出层配置: # 配置1:3个类别互斥的单分类任务,用softmax激活+交叉熵损失 ann.add(tf.keras.layers.Dense(units=num_outputs, activation="softmax")) ann.compile(optimizer='adam',loss = 'categorical_crossentropy',metrics=['accuracy']) # 配置2:3个标签独立的多标签分类任务,用sigmoid激活+二分类交叉熵损失 # ann.add(tf.keras.layers.Dense(units=num_outputs, activation="sigmoid")) # ann.compile(optimizer='adam',loss = 'binary_crossentropy',metrics=['accuracy']) ann_history=ann.fit(X_trn, y_trn, batch_size = 25, epochs = 100)
方案2:保留二维输出逻辑
如果你的业务确实需要模型输出(样本数, 3, 3)的二维张量,需要提前把目标集y_trn的维度调整为(5996, 3, 3),和模型输出维度对齐后再训练。
内容的提问来源于stack exchange,提问作者Pegah Yaftian
相关产品推荐
相关产品推荐

