Keras 卷积 1D 通道独立,[样本,时间步长,特征],风力涡轮机数据集

Ale*_* B. 1 convolution deep-learning conv-neural-network keras tensorflow

我正在研究具有常规矩阵格式的风力涡轮机数据集:[ row:datetime , column:features]

但我想用卷积来捕捉每个特征的进展,就像在 LSTM 中完成的那样。因此,我生成了一个具有以下维度的新数据集:

[datetime, 15 timesteps,128 features] :每个原始日期时间行现在有 15 个寄存器(t-0,t-1,...,t-14)用于每个特征。

我的计划是使用大小为 1x5 的内核和 5 的步长分别对每个特征(通道)的时间步长维度进行卷积。从 128 个特征中获取每个 DateTime(batch)、长度为 5 的 3 个过滤器,输出形状为(无,3,128)。

然后我将最大池化应用于前一个第二维 (3) 结果,以获得“最重要的复杂时间步长”,期望输出大小:(None,1,128)

最后我连接了一个用于二元分类的密集层。

目前的网络架构在 keras 中实现如下:

model.add( Conv1D(padding = 'valid',filters = nfeatures,strides = 5,kernel_size = 5, 
                  activation = 'relu',input_shape = (timesteps,nfeatures)) )
model.add( MaxPooling1D() )
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)

问题是当我检查第一层 (conv1d) 的权重时,权重具有以下维度:[5,128,128] 和偏差 [128]。

预期的权重格式是:[5,1,128] 为什么是 5x128x128?,我只需要每个功能/通道的 5 个权重(内核大小)。

谢谢!

Dan*_*ler 5

标准卷积滤波器:

为了获得好的结果,神经网络很少完全单独考虑一个特征,相反,它们会促进特征之间的相关性以提取更智能的结果。

这就是为什么标准卷积滤波器形状是:

(width, input_features, output_features)   
Run Code Online (Sandbox Code Playgroud)

在这个卷积中,所有输入特征都被认为是创建新的输出特征。

如何完全个性化特征?

警告:这对所有功能使用相同的精确过滤器(您可能需要每个功能一个单独的过滤器,然后查看下一个答案)

您可以对数据重新排序,使特征成为一个主要组,并使每个组只有一个特征和过滤器。

然后可以与TimeDistributed层并行处理这些组。

(width, input_features, output_features)   
Run Code Online (Sandbox Code Playgroud)

老实说,您的模型使用标准卷积会更强大,但您可能有特殊原因这样做。

每个功能一个单独的过滤器

这需要更多的工作。我们将需要一个实现 depthwise_conv1d(Keras 不提供)的自定义层,或者我们使用 1 个过滤器创建 128 个单独的 conv1D 层(更容易)。

使用第二种方法(多个 conv 层),我们将需要一个功能性 API 模型来制作并行分支。

model = Sequential()

#reordering data and adding 1 dummy feature per group    
model.add(Permute((2,1), input_shape = (timesteps,nfeatures))) #(batch, feat, steps)    
model.add(Lambda(lambda x: K.expand_dims(x))) #(batch, feat, steps, 1)

#applying the 1 filter convolution for each group
model.add(TimeDistributed(Conv1D(padding = 'valid',filters = 1,strides = 5,
                                 kernel_size = 5, activation = 'relu')))
model.add( TimeDistributed(MaxPooling1D()) )

#restoring to (batch,features)    
model.add(Reshape((nfeatures,)))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)