在R Markdown中拟合Keras多输入模型遇无效首参数错误求助
错误原因与修复方案
核心错误点
- 输入数据格式不匹配
x_train是tibble类型,Keras全连接层仅支持原子向量/矩阵格式输入,tibble的结构会触发维度赋值错误,这就是你看到Error in dim(x) <- length(x) : invalid first argument, must be vector (list or atomic)的直接原因。fit函数的x参数逻辑错误:train_gen是flow_images_from_directory生成的图像生成器,本身会返回(图像数据, 标签)的批次结果,但多输入场景下不能直接将生成器放入x的列表中,Keras无法识别这种混合格式。
- 标签参数完全错误
模型是单输出的6分类任务,y应传入统一的分类标签,而你写的list(train_gen$classes , x_train)把表格输入当成了标签,完全不符合模型输出要求。 - 生成器与
validation_split冲突validation_split仅适用于内存中的完整数据集,无法和生成器配合使用,生成器场景下需要单独处理验证集数据。
修复步骤
1. 转换表格数据格式
先把tibble类型的x_train转换成矩阵:
x_train_matrix <- as.matrix(x_train)
2. 自定义多输入生成器
编写生成器同时返回图像数据、对应表格数据及标签:
# 初始化图像生成器(保持参数与需求一致) train_gen <- flow_images_from_directory( directory = "你的图像目录路径", target_size = c(140,140), batch_size = 32, class_mode = "categorical", shuffle = TRUE ) # 自定义多输入生成器 multi_train_gen <- function(image_generator, tab_data) { function() { image_batch <- image_generator() # 提取当前批次对应的表格数据 tab_batch <- tab_data[image_generator$index_array, ] return(list(c(image_batch[[1]], tab_batch), image_batch[[2]])) } } # 实例化多输入生成器 train_multi_gen <- multi_train_gen(train_gen, x_train_matrix)
3. 修正模型训练代码
移除validation_split,若需验证集,需按同样方式准备验证用多输入生成器,通过validation_data传入:
final_history <- model %>% fit( x = train_multi_gen, steps_per_epoch = train_gen$n %/% train_gen$batch_size, epochs = 50 , callbacks = callbacks # 如有验证集,添加如下配置 # validation_data = multi_val_gen, # validation_steps = val_gen$n %/% val_gen$batch_size )
4. 可选:匹配激活函数与损失函数
模型输出用sigmoid但损失是categorical_crossentropy,若为多分类任务,建议将输出层激活函数改为softmax:
output <- layer_concatenate(c(cnn , nn)) %>% layer_dense(16) %>% layer_activation("relu") %>% layer_dense(6) %>% layer_activation("softmax") # 替换原sigmoid
内容的提问来源于stack exchange,提问作者Stat_machine
相关产品推荐
相关产品推荐

