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

Keras搭建LSTM多分类模型报错:Input 'ref' of 'Assign' Op需左值输入

解决Keras LSTM训练时的TypeError: Input 'ref' of 'Assign' Op requires l-value input问题

这个错误我之前调试模型时也碰到过,大概率是你用了Keras中已经被弃用的旧参数,加上一些版本兼容性小问题导致的,咱们一步步来修正:

错误根源分析

你代码里的几个参数是旧版Keras(1.x)的写法,在Keras 2.0+版本中已经被移除或重命名,这些过时的参数会导致内部张量赋值逻辑出错,触发这个TypeError:

  • dropout_W 和 dropout_U:旧版用来控制输入和循环状态的dropout,新版已替换为dropout和recurrent_dropout
  • nb_epoch:新版已改名为epochs
  • metrics参数虽然部分版本支持单个字符串,但规范写法是传入列表

另外还有个小细节:5分类任务用sigmoid激活不太合适,配合独热标签和categorical_crossentropy损失,softmax激活会更合理,它能输出各分类的概率分布(总和为1)。

修正后的完整代码

from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense

# 构建修正后的模型
model = Sequential()
model.add(Embedding(10000, 32))
# 替换过时的dropout参数
model.add(LSTM(64, dropout=0.2, recurrent_dropout=0.2))
# 改用softmax适配多分类任务
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
# 替换nb_epoch为epochs
model.fit(xtrain, ytrain, batch_size=128, epochs=10, validation_split=0.2)

关键修改点说明

  1. 参数名更新:把dropout_W改为dropout(控制输入序列的dropout),dropout_U改为recurrent_dropout(控制循环状态的dropout),这是Keras 2.0后的标准参数,旧参数在新版本中不再被支持。
  2. 激活函数调整:将sigmoid换成softmax,完美适配独热标签的多分类任务,和categorical_crossentropy损失函数的计算逻辑更匹配。
  3. 规范参数格式:metrics改为列表形式['acc'],nb_epoch改为epochs,遵循新版Keras的API规范,避免潜在的兼容性问题。

额外排查建议

如果修正后还是报错,可以试试这两步:

  • 检查Keras版本:用print(keras.__version__)查看,确保是2.0及以上版本,旧版本建议升级到稳定版
  • 确认输入数据维度:LSTM的输入需要是(样本数, 时间步长, 特征数),Embedding层输出的三维张量可以直接被LSTM处理,但要确保xtrain的格式符合要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:13:18