You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:54:06