使用Keras后端函数时出现InvalidArgumentError的原因排查
InvalidArgumentError: 必须为占位符张量喂值的原因分析与解决办法
这个错误的核心原因其实是变量名冲突导致占位符张量被意外覆盖,咱们结合你的代码片段来拆解:
问题出在哪?
看你的代码顺序:
- 第1行:你用
K.placeholder创建了一个名为X的占位符张量,这个张量是Keras计算图的一部分,后续train_fxn会关联它。 - 第3行:你重新给变量
X赋值为self.states[0].reshape(...)——这时候原来的占位符张量已经被这个新的数组变量覆盖了! - 第4行调用
train_fxn([X])时,传入的是这个新的数组,但train_fxn内部依然期望关联原来的那个占位符张量,这就导致Keras找不到给原占位符喂的数据,直接抛出了InvalidArgumentError。
怎么解决?
核心就是不要复用占位符的变量名,把输入数据的变量和占位符变量分开:
修正后的代码示例:
# 定义占位符,用独立的变量名 input_placeholder = K.placeholder(shape=(None, 32, 32, 3)) # 关联占位符创建训练函数 train_fxn = K.function([input_placeholder], [], updates=updates) # 准备输入数据,用另一个变量名 x_input = self.states[0].reshape(1, 32, 32, 3) # 传入正确的输入数据 train_fxn([x_input])
这样修改后,train_fxn关联的还是最初定义的占位符张量,你传入的x_input会准确对应到这个占位符上,满足Keras后端函数的输入要求,错误自然就消失了。
内容的提问来源于stack exchange,提问作者thetna
相关产品推荐
相关产品推荐

