【问题标题】:Keras convolution 1D channel indepently, [samples,timesteps,features] , wind turbine datasetKeras 卷积一维通道独立,[samples,timesteps,features],风力涡轮机数据集
【发布时间】:2018-11-04 20:00:09
【问题描述】:

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

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

[datetime, 15 timesteps,128 features] :每个原始 datetime 行现在有 15 个寄存器连接 (t-0,t-1,...,t-14) 用于每个功能。

我的计划是分别对每个特征(通道)的时间步长维度进行卷积,内核大小为 1x5,步幅为 5。从 128 个特征中获取每个 DateTime(batch),长度为 5 的 3 个过滤器,输出形状是 (None,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'))

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

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

谢谢!

【问题讨论】:

    标签: tensorflow keras deep-learning conv-neural-network convolution


    【解决方案1】:

    标准卷积过滤器:

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

    这就是标准卷积滤波器形状的原因:

    (width, input_features, output_features)   
    

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

    如何完全个性化特征?

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

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

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

    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'))
    

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

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

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

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

    from keras.model import Model
    
    #function to split the input in multiple outputs
    def splitter(x):
        return [x[:,:,i:i+1] for i in range(nfeatures)]
    
    
    #model's input tensor 
    inputs = Input((timesteps,nfeatures))
    
    #splitting in 128 parallel tensors - 128 x (batch,15,1)
    multipleFeatures = Lambda(splitter)(inputs)
    
    #applying one individual convolution on each parallel branch
    multipleFeatures = [
       Conv1D(padding = 'valid',filters = 1,strides = 5, kernel_size = 5)(feat) 
       for feat in multipleFeatures ]
    
    #joining the branches into (batch, 3, 128)
    joinedOutputs = Concatenate()(multipleFeatures)
    joinedOutputs = Activation('relu')(joinedOutputs)
    
    outputs = MaxPooling1D()(joinedOutputs)
    outputs = Lambda(lambda x: K.squeeze(x,axis=1))(outputs)
    outputs = Dropout(0.5)(outputs)
    outputs = Dense(1, activation='sigmoid')(outputs)
    
    model = Model(inputs,outputs)
    

    【讨论】:

    • 再次阅读问题。我在行中有数据条目,在列中有特征。我想在 15 个时间步中捕获不同特征的进展,这就是为什么每个原始行在第二维中都有 15(t-0 到 t-15 的副本)的滞后。
    • 用两种可能性修正了我的答案。对所有功能使用相同的过滤器或对每个功能使用单独的过滤器。
    • 感谢您的精彩编辑!非常感谢您的帮助!我将尝试您的第一个解决方案。第二种解决方案是不是当前的keras 2.1.6 SeparableConv1D?我将卷积层分离,首先专门用于没有组合通道(特征)的时间步长,因为我想看看第一层不同特征演变的重要性,然后如果它有效,我将添加一个额外的卷积层(这个是时候结合特征/通道)来捕捉“相关性”了。
    • SeparableConv 的概念不同。它将内核分成两个,一个深度和另一个长度。其中一个步骤确实是 Depthwise 卷积,但还有另一个步骤会折叠深度。
    • 在后端有 depthwise_conv2d,它可以满足您的需求,但仅适用于 4D 数据。它错过了depthwise_conv1D,尽管您也可以将数据设为(batch, 1, timesteps, nfeatures) 并使用内核大小(1,5)。但是您需要创建一个自定义层(以启用可训练过滤器)并在其中使用此功能。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2019-02-03
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多