R语言Keras中CNN卷积池化层后追加输入拟合报错如何解决
问题排查与修复方案
核心错误原因
- 卷积1D层的输入维度不匹配:
layer_conv_1d要求输入为三维结构(样本数, 序列长度, 通道数),你定义的输入层和训练数据都缺少最后一维的通道维度 - 输入张量形状与卷积模型要求的输入形状不统一:
input1定义的形状是c(numvar1),和卷积模型要求的c(numvar1, 1)不一致
修复后可运行代码
library(keras) numvar1 <- 100 numvar2 <- 30 numnode_conv <- 100 conv_model <- keras_model_sequential() conv_model %>% layer_conv_1d(filters = 32, kernel_size = 3, activation = 'relu', input_shape = c(numvar1, 1)) %>% layer_conv_1d(filters = 32, kernel_size = 3, activation = 'relu') %>% layer_average_pooling_1d(pool_size = 3)%>% layer_flatten() %>% layer_dense(units = numnode_conv, activation = "relu") fc_model <- keras_model_sequential() fc_model %>% layer_dense(units = numnode_conv+numvar2, activation = "relu", input_shape = numnode_conv+numvar2) %>% layer_dense(units = numnode_conv+numvar2, activation = "relu") %>% layer_dense(units = 1) # 修正input1的形状,匹配卷积模型输入要求,包含通道维度 input1 <- layer_input(c(numvar1, 1)) input2 <- layer_input(c(numvar2)) output1 <- input1 %>% conv_model inputconv <- layer_concatenate(list(output1, input2)) output <- inputconv%>%fc_model model <- keras_model( list(input1 , input2) , output ) early_stop <- callback_early_stopping(monitor = "val_loss", min_delta = 0.1, patience = 2, restore_best_weights = TRUE, verbose = 0) losses <- c(keras::loss_mean_absolute_percentage_error, keras::loss_mean_absolute_error, keras::loss_mean_squared_error, keras::loss_mean_squared_logarithmic_error) model %>% compile( optimizer = "rmsprop", loss = losses[3], metrics = c("mse") ) # 修正trainx1的维度,增加通道维度,转为三维张量 trainx1 <- array( rnorm(100*numvar1,mean=0,sd=1), dim = c(100, numvar1, 1)) trainx2 <- matrix( rnorm(100*numvar2,mean=0,sd=1), 100, numvar2) trainy <- rnorm(100,mean=0,sd=1) model %>% fit( list(trainx1,trainx2), trainy, epochs = 500, batch_size = 128, verbose = 1, validation_split = 0.2, callbacks = list( early_stop) )
补充说明
如果你的原始数据本身就是二维矩阵,可以在输入卷积模型前用layer_reshape或者直接调用array_reshape函数添加通道维度,不需要修改原始数据存储结构。
内容的提问来源于stack exchange,提问作者Fan
相关产品推荐
相关产品推荐

