卷积神经网络Conv1d输入形状

时间:2017-04-05 15:26:26

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

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

我想重复一个过滤器..让我说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' ))

有什么建议吗? 谢谢!

3 个答案:

答案 0 :(得分:8)

尝试:

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 维度,您可以在每个时间步长处拥有多个要素的向量。可以认为序列维度与空间维度和要素维度相同,与渠道维度Conv2D中的>颜色维度。正如@putonspectacles在他的评论中提到的那样 - 您可以将序列维度设置为None,以使您的网络输入长度不变

答案 1 :(得分:7)

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

  

将此图层用作模型中的第一个图层时,请提供   input_shape参数(整数元组或无,例如(10,128)for   128个向量的10个向量的序列,或(无,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参数控制时间步长的大小。

答案 2 :(得分:1)

要将形状为(nrows, ncols)Conv1d的{​​{1}}的常用特征表数据输入,需要执行以下两个步骤:

Keras

例如,采用xtrain.reshape(nrows, ncols, 1) # For conv1d statement: input_shape = (ncols, 1) 数据集的前4个特征:

要查看常用格式及其形状:

iris

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

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) 中的Conv1d很有效。对于Kerasinput_shape是必需的。