一维CNN的输入形状

时间:2020-06-30 06:33:54

标签: r machine-learning keras deep-learning conv-neural-network

我是机器学习的初学者。虽然,这个问题类似于123,但是我在为数据选择输入形状时确实感到困惑。 我正在时间序列数据上使用一维CNN。数据的维数是(6400,4)。有4个要素(列),其中一个是目标变量。 拆分后:

dim(xtrain) -> 5000, 3
dim(ytrain) -> 5000, 1
dim(xtest) -> 1400, 3
dim(ytest) -> 1400, 1

我在为CNN选择输入形状时感到困惑。这就是我尝试过的(我保持输入形状= c(3,1)):

model = keras_model_sequential() %>%
  layer_conv_1d(filters = 64, kernel_size = 2,
                input_shape = c(3, 1), activation = "relu") %>%
  layer_max_pooling_1d(pool_size = 2) %>%
  layer_flatten() %>%
  layer_dense(units = 32, activation = "relu") %>%
  layer_dropout(rate = 0.2) %>%
  layer_dense(units = 1, activation = "linear")

xtrain <- as.matrix(train[, c(1, 2, 3)])
ytrain <- as.matrix(train[, c(4)])
xtest = as.matrix(test[, c(1, 2, 3)])
ytest = as.matrix(test[, c(4)])

# Transforming 2-D matrix into 3-D matrix
xtrain = array(xtrain, dim = c(nrow(xtrain), 3, 1))
xtest = array(xtest, dim = c(nrow(xtest), 3, 1))

# fitting model
model %>% fit(xtrain, ytrain, epochs = 50, batch_size = 128, verbose = 1, validation_split = 0.20)

这执行得很好,但是我不确定它是否正确。请说明是否采用这种正确的方法来设置输入形状。

1 个答案:

答案 0 :(得分:0)

您在此处做了某种移动平均线类比。最后,这完全取决于您想要实现的目标以及时间序列的性质。

假设您的内核权重为c(0.3,0.7),而时间序列为c(1.2,1.3,1.25)

您的内核将执行2个暗矢量:

a = c( 0.3 * 1.2 + 0.7*1.3 , 0.3 * 1.3 + 0.7*1.25)

您可以在这里看到与移动均线的相似性,然后您可以应用最大值并对其进行RELU。在示例中哪个将返回a[1]

现在,如果您相信可以使用线性转换(忽略模型的其余部分)来提取时间序列中的所有内容,那就可以了。但是,如果您认为您的短时间序列中可能存在某些非线性关系,则可以尝试使用RNN甚至LSTM。

在技术视图上,如果您具有instance_1 =(1,2,3,4),instance_2 =(2,3,4,5)等,则需要进行重叠以创建目标变量,该变量我想你做了某种方式。再次取决于您的追求。