R中Keras神经网络训练报错:缺失'dense_input'输入问题排查
解决R中Keras训练时输入数据与模型输入名称不匹配的问题
错误根源
当你传入带列名的数据框给fit()时,Keras会将数据框的列名视为输入层的标识,但你的序列模型默认输入层名称是dense_input,两者名称不匹配,直接触发"缺失'dense_input'输入"的报错。修改input_shape为NULL或c(1, ncol(...))完全没命中问题核心,自然无效。
两种可行解决方案
方法一:将数据转为矩阵/数组(推荐)
Keras序列模型原生适配矩阵/数组格式的输入,这种格式不会携带列名,能直接匹配模型默认的输入层:
# 把训练集、测试集数据转为矩阵,丢弃列名 train_x <- as.matrix(train_df_x) test_x <- as.matrix(test_df_x) # 重新执行训练 model %>% fit( x = train_x, y = train_y, validation_data = list(test_x, test_y), epochs = 10, batch_size = 32 )
方法二:显式对齐输入层名称与数据标识
如果必须保留数据框格式,可以在定义模型时给输入层指定自定义名称,然后将数据转为对应命名的列表传入:
# 定义模型时给输入层设置明确名称 model <- keras_model_sequential() %>% layer_dense(units = 64, activation = 'relu', input_shape = c(ncol(train_df_x)), name = 'custom_input') %>% layer_dropout(rate = 0.2) %>% layer_dense(units = 32, activation = 'relu') %>% layer_dense(units = 1, activation = 'sigmoid') # 编译模型 model %>% compile( optimizer = 'adam', loss = 'binary_crossentropy', metrics = c('accuracy') ) # 将数据转为命名列表,键名与输入层名称一致 train_data <- list(custom_input = train_df_x) test_data <- list(custom_input = test_df_x) # 执行训练 model %>% fit( x = train_data, y = train_y, validation_data = list(test_data, test_y), epochs = 10, batch_size = 32 )
额外注意事项
- 你的输入是每个样本含1000个特征,
input_shape应正确设置为c(1000),不要用无效的NULL或c(1, ncol(...))。 - 当前样本每行对应一个样本、每列对应一个特征的格式是正确的,无需调整。
内容的提问来源于stack exchange,提问作者Fabrizio
相关产品推荐
相关产品推荐

