【问题标题】:Convolutional neural network Conv1d input shape卷积神经网络 Conv1d 输入形状
【发布时间】:2017-08-31 07:46:56
【问题描述】:

我正在尝试创建一个 CNN 来对数据进行分类。我的数据是 X[N_data, N_features] 我想创建一个能够对其进行分类的神经网络。我的问题是关于 keras 后端的 Conv1D 的输入形状。

我想重复过滤.. 假设 10 个特征,然后为接下来的 10 个特征保持相同的权重。 对于每个数据,我的卷积层会创建 N_features/10 个新神经元。 我该怎么做?我应该在 input_shape 中放什么?

def cnn_model():
model = Sequential()                                               
model.add(Conv1D(filters=1, kernel_size=10 ,strides=10,     
                  input_shape=(1, 1,N_features),kernel_initializer= 'uniform',      
                  activation= 'relu')) 
model.flatten()
model.add(Dense(N_features/10, init= 'uniform' , activation= 'relu' ))

有什么建议吗? 谢谢!

【问题讨论】:

标签: input machine-learning neural-network keras conv-neural-network


【解决方案1】:

要输入Keras(nrows, ncols)Conv1d的常用特征表数据,需要以下2个步骤:

xtrain.reshape(nrows, ncols, 1)
# For conv1d statement: 
input_shape = (ncols, 1)

例如,取iris数据集的前4个特征:

查看常用格式及其形状:

iris_array = np.array(irisdf.iloc[:,:4].values)
print(iris_array[:5])
print(iris_array.shape)

输出显示通常的格式及其形状:

[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]

(150, 4)

以下代码改变格式:

nrows, ncols = iris_array.shape
iris_array = iris_array.reshape(nrows, ncols, 1)
print(iris_array[:5])
print(iris_array.shape)

上述代码数据格式及其形状的输出:

[[[5.1]
  [3.5]
  [1.4]
  [0.2]]

 [[4.9]
  [3. ]
  [1.4]
  [0.2]]

 [[4.7]
  [3.2]
  [1.3]
  [0.2]]

 [[4.6]
  [3.1]
  [1.5]
  [0.2]]

 [[5. ]
  [3.6]
  [1.4]
  [0.2]]]

(150, 4, 1)

这适用于Conv1dKeras。对于input_shape,需要(4,1)

【讨论】:

    【解决方案2】:

    @Marcin 的回答可能有效,但可能会根据此处的文档提出建议:

    当将此层用作模型中的第一层时,请提供 input_shape 参数(整数元组或无,例如 (10, 128) 为 128 维向量的 10 个向量的序列,或 (None, 128) 为 128维向量的变长序列。

    应该是:

    model = Sequential()
    model.add(Conv1D(filters=1, kernel_size=10 ,strides=10,     
                      input_shape=(None, N_features),kernel_initializer= 'uniform',      
                      activation= 'relu')) 
    

    请注意,由于输入数据 (N_Data, N_features),我们将示例数设置为未指定 (None)。在这种情况下,strides 参数控制时间步长的大小。

    【讨论】:

      【解决方案3】:

      试试:

      def cnn_model():
          model = Sequential()                                               
          model.add(Conv1D(filters=1, kernel_size=10 ,strides=10,     
                    input_shape=(N_features, 1),kernel_initializer= 'uniform',      
                    activation= 'relu')) 
      model.flatten()
      model.add(Dense(N_features/10, init= 'uniform' , activation= 'relu' ))
      ....
      

      并将您的x 重塑为(nb_of_examples, nb_of_features, 1)

      编辑:

      Conv1D 是为序列分析而设计的——无论我们在序列的哪个部分,卷积滤波器都是相同的。第二个维度是所谓的 features 维度,您可以在每个时间步拥有一个包含多个 features 的向量。人们可能会认为 sequence 维度与 spatial 维度相同,而 feature 维度与 channel 维度 相同>颜色维度Conv2D。正如@putonspectacles 在他的评论中提到的那样 - 您可以将 sequence 维度设置为 None 以使您的网络输入长度不变

      【讨论】:

      • 为什么是input_shape = (1, N_features, 1) 而不是input_shape = (, N_features)
      • 仍然,为什么 input_shape 有第三维?我只是好奇/试图理解。
      • Conv1d 的输入形状为 (timesteps, features)?
      • 好吧,完美它对我有用!谢谢(但还不是@putonspectacles 方法)
      • 因此,如果您可以投票或接受我的回答,我会很珍惜:)
      猜你喜欢
      • 2017-07-30
      • 2020-05-26
      • 2020-10-07
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2016-10-20
      相关资源
      最近更新 更多