tmie系列分类的一维卷积神经网络在keras R中的实现

时间:2018-08-16 11:46:01

标签: r keras conv-neural-network

我正在尝试在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中的一维时间序列分类的结构化教程,以便我更详细地以交互方式学习基础理论。但是,我也希望能快速解决上述问题,以便我可以自己进行试验。

2 个答案:

答案 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)