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

R语言Keras神经网络构建时KeyError:0错误排查与解决

问题解决:R语言Keras中layer_add合并张量出现KeyError:0

问题场景

在R语言中使用TensorFlow/Keras构建神经网络,尝试通过layer_add合并两个形状均为TensorShape([None,1])的张量Network和LogVol时,触发KeyError: 0错误,相关代码及错误详情如下:

报错代码

# 生成错误的代码
Response = list(Network, LogVol) %>%
  layer_add(name = 'Add') %>%
  layer_dense(units = 1,
              activation = 'exponential',
              name = 'Response',
              trainable = FALSE,
              weights = list(array(1, dim = c(1,1)), array(0, dim = c(1))))

错误信息

Error in py_call_impl(callable, call_args$unnamed, call_args$named) : 
  KeyError: 0
Run `reticulate::py_last_error()` for details.

Python异常追踪

Traceback (most recent call last):
  File "C:\Users\kusha\OneDrive\DOCUME~1\VIRTUA~1\R-TENS~1\Lib\site-packages\keras\src\layers\merging\add.py", line 92, in add
    return Add(**kwargs)(inputs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\kusha\OneDrive\DOCUME~1\VIRTUA~1\R-TENS~1\Lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\kusha\OneDrive\DOCUME~1\VIRTUA~1\R-TENS~1\Lib\site-packages\keras\src\layers\merging\base_merge.py", line 84, in build
    if not isinstance(input_shape[0], tuple):
                      ~~~~~~~~~~~^^^
KeyError: 0

错误原因

问题出在管道操作%>%的使用方式上:layer_add作为合并层,需要接收包含多个输入张量的列表作为输入参数,但直接用list(Network, LogVol) %>% layer_add()时,管道会把整个列表作为layer_add的第一个位置参数,而非将列表中的张量作为层的输入传入,导致Keras内部无法正确解析输入形状,触发KeyError:0。

解决方法

方法1:直接调用层并传入输入列表,再接管道

调整代码写法,先通过layer_add()(list(Network, LogVol))明确传入输入列表,再继续后续管道操作:

Response = layer_add(name = 'Add')(list(Network, LogVol)) %>%
  layer_dense(units = 1,
              activation = 'exponential',
              name = 'Response',
              trainable = FALSE,
              weights = list(array(1, dim = c(1,1)), array(0, dim = c(1))))

方法2:使用keras_model构建完整模型(更规范)

如果是构建完整模型,推荐用keras_model明确指定输入和输出,避免管道操作的歧义:

# 定义输入(若Network和LogVol是已有张量,可跳过此步直接使用)
input_network = layer_input(shape = c(1))
input_logvol = layer_input(shape = c(1))

# 模拟Network和LogVol的前置层处理(根据实际业务调整)
Network = input_network %>% layer_dense(units = 1)
LogVol = input_logvol %>% layer_dense(units = 1)

# 合并张量并构建输出层
merged = layer_add()(list(Network, LogVol))
Response = merged %>%
  layer_dense(units = 1,
              activation = 'exponential',
              name = 'Response',
              trainable = FALSE,
              weights = list(array(1, dim = c(1,1)), array(0, dim = c(1))))

# 构建完整模型
model = keras_model(inputs = list(input_network, input_logvol), outputs = Response)

验证说明

两种方法都能正确将两个形状为(None,1)的张量传入layer_add进行合并,解决KeyError:0问题,后续的layer_dense也能正常接收合并后的张量处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:52:42