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
相关产品推荐
相关产品推荐

