我正在尝试在keras R中构建一维卷积神经网络以进行时间序列分类。我的训练数据包含1169个向量。其中每个向量包含30个时间点并具有类别标签(类别总数为7,我使用一种热编码方式对其进行了编码)。我的代码如下
model<-keras::keras_model_sequential() %>%
layer_conv_1d(filters = 30, kernel_size = 2 , activation = "relu",
input_shape = c(1169, 30), strides = 1L)%>%
layer_max_pooling_1d()%>%
layer_conv_1d(filters = 15, kernel_size = 2, activation = "relu")%>%
layer_max_pooling_1d() %>%
layer_flatten() %>%
layer_dense(7, activation = "softmax")
model %>% compile(
optimizer = "adam",
metrics = 'accuracy',
loss = 'categorical_crossentropy'
)
summary(model)
history<-model %>%
fit(training_data,
training_label,
epochs= 100,
batch_size = 32,
validation_split = 0.3
)
尝试拟合模型后,出现以下错误
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: Error when checking input: expected conv1d_71_input to have
3 dimensions, but got array with shape (1169, 30)
我知道我的问题类似于Keras: convolutional layer for 1D input,但我无法解决。首先,我想知道第一卷积层的输出的合适大小是多少(有没有很好的猜测作为起点)。其次,任何人都可以参考Keras R中的一维时间序列分类的结构化教程,以便我更详细地以交互方式学习基础理论。但是,我也希望能快速解决上述问题,以便我可以自己进行试验。
答案 0 :(得分:0)
为帮助您解决错误消息:Conv1D
期望其input_shape
自变量指定序列的长度,但还要指定它将看到的序列的通道数。并且与在Keras中一样,在定义模型时不应显式指定批次尺寸。因此,根据您当前的规范,您的Conv1D
层期望看到长度为1169的序列,每个序列有30个通道。要获得所需的行为,应将input_shape
指定为(30,1)
。
答案 1 :(得分:0)
您需要重塑数据,以使功能数量成为所要求的第3维。在这种情况下,当然只有一维。输入的形状应为(1169、30、1)。一种选择是使用reshape2的melt函数来获取长格式的数据。像这样:
library(reshape2)
long_training_data <- melt(training_data)