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

如何修复R语言中的KeyError: 0(C++Error)错误

修复Keras中KeyError: 0错误的解决方案

代码参考来源

  • ActuarialDataScience仓库中3 - Nesting Classical Actuarial Models into Neural Networks目录下的01 CANN approach.r
  • 同目录下的freMTPLfreq_cann.html预览页面

用户实现代码

features <- c(14:18, 20:21)
(q0 <- length(features))

Xlearn <- as.matrix(learn[, features])  # design matrix learning sample
Brlearn <- as.matrix(learn$VehBrandX)
Relearn <- as.matrix(learn$RegionX)
Ylearn <- as.matrix(learn$ClaimNb)

Xtest <- as.matrix(test[, features])    # design matrix test sample
Brtest <- as.matrix(test$VehBrandX)
Retest <- as.matrix(test$RegionX)
Ytest <- as.matrix(test$ClaimNb)

Vlearn <- as.matrix(log(learn$Exposure))
Vtest <- as.matrix(log(test$Exposure))
lambda.hom <- sum(learn$ClaimNb)/sum(learn$Exposure)

CANN <- 1  # 0=Embedding NN, 1=CANN

if (CANN==1){
  Vlearn <- as.matrix(log(learn$fitGLM2))
  Vtest <- as.matrix(log(test$fitGLM2))
  lambda.hom <- sum(learn$ClaimNb)/sum(learn$fitGLM2)
}
lambda.hom

(BrLabel <- length(unique(learn$VehBrandX)))
(ReLabel <- length(unique(learn$RegionX)))
q1 <- 20  
q2 <- 15
q3 <- 10
d <- 2         # dimensions embedding layers for categorical features

Design   <- layer_input(shape = c(q0),  dtype = 'float32', name = 'Design')
VehBrand <- layer_input(shape = c(1),   dtype = 'int32', name = 'VehBrand')
Region   <- layer_input(shape = c(1),   dtype = 'int32', name = 'Region')
LogVol   <- layer_input(shape = c(1),   dtype = 'float32', name = 'LogVol')

BrandEmb <- VehBrand %>%
  layer_embedding(input_dim = BrLabel, output_dim = d, input_length = 1, name = 'BrandEmb') %>%
  layer_flatten(name='Brand_flat')

RegionEmb <- Region %>%
  layer_embedding(input_dim = ReLabel, output_dim = d, input_length = 1, name = 'RegionEmb') %>%
  layer_flatten(name='Region_flat')

Network <- list(Design, BrandEmb, RegionEmb) %>% layer_concatenate(name='concate') %>%
  layer_dense(units=q1, activation='tanh', name='hidden1') %>%
  layer_dense(units=q2, activation='tanh', name='hidden2') %>%
  layer_dense(units=q3, activation='tanh', name='hidden3') %>%
  layer_dense(units=1, activation='linear', name='Network',
  weights=list(array(0, dim=c(q3,1)), array(log(lambda.hom), dim=c(1))))

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

model <- keras_model(inputs = c(Design, VehBrand, Region, LogVol), outputs = c(Response))
model %>% compile(optimizer = optimizer_nadam(), loss = 'poisson')
summary(model)

报错信息

Error: KeyError: 0 

7. stop(structure(list(message = "KeyError: 0\n", call = NULL, cppstack = NULL), class = c("Rcpp::exception", "C++Error", "error", "condition"))) 
6. (structure(function (...) { dots <- py_resolve_dots(list(...)) result <- py_call_impl(callable, dots$args, dots$keywords) ... 
5. do.call(keras$layers$add, c(list(inputs), dots$named)) 
4. layer_add(., LogVol, name = "Add") 
3. create_layer(keras$layers$Dense, object, list(units = as.integer(units), activation = activation, use_bias = use_bias, kernel_initializer = kernel_initializer, bias_initializer = bias_initializer, kernel_regularizer = kernel_regularizer, bias_regularizer = bias_regularizer, activity_regularizer = activity_regularizer, ... 
2. layer_dense(., units = 1, activation = k_exp, name = "Response", trainable = FALSE, weights = list(array(1, dim = c(1, 1)), array(0, dim = c(1))))
1. list(Network, LogVol) %>% layer_add(LogVol,name = "Add") %>% layer_dense(units = 1, activation = k_exp, name = "Response", trainable = FALSE, weights = list(array(1, dim = c(1, 1)), array(0, dim = c(1))))

错误原因与修复方案

错误原因

layer_add调用逻辑错误:管道中已传入包含Network和LogVol的张量列表,却额外将LogVol作为参数传给layer_add,导致Keras无法正确解析输入结构,触发索引识别错误(KeyError:0)。

修复步骤

修改layer_add调用,移除额外传入的LogVol参数,仅使用管道中的张量列表:

# 修正后的Response部分代码
Response <- list(Network, LogVol) %>%
  layer_add(name = 'Add') %>%
  layer_dense(units = 1, activation = k_exp, name = 'Response', trainable = FALSE,
              weights = list(array(1, dim = c(1, 1)), array(0, dim = c(1))))

原理说明

layer_add的作用是对输入的张量列表执行元素级加法,管道中的.已经代表list(Network, LogVol)这个合法输入。重复传入LogVol会打乱输入结构,让Keras无法匹配张量索引,从而抛出KeyError。修正后输入符合layer_add的要求,即可正常构建网络层。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:27:00