如何修复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
相关产品推荐
相关产品推荐

