代码之家  ›  专栏  ›  技术社区  ›  A Nova

错误:R中的KeyError:0。请帮助修复该错误

  •  0
  • A Nova  · 技术社区  · 2 年前

    此代码来自:

    我正在尝试构建神经网络(使用嵌入)

    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))))
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   Straine    2 年前

    你可以删除 name = 'Add' 从函数调用

    Response <- list(Network, LogVol) %>% 
      layer_add(LogVol) %>% 
      ...
    

    并放弃文档中描述的“标准层参数”。 您将不再有KeyError,并且可以执行其余的代码。

    如果我们看看函数 layer_add 本身,例如。 https://rdrr.io/cran/keras/src/R/layers-merge.R ,我们看到命名的参数被传递 只有 以标记图层。