当前位置: 首页 > 知识库问答 >
问题:

卷积神经网络Conv1d输入形状

沈单弓
2023-03-14

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

我想在上面重复一个过滤器。。假设有10个特征,然后为接下来的10个特征保持相同的权重。对于每个数据,我的卷积层将创建N\U特征/10个新神经元。我该怎么做?我应该在input\u形状中放置什么?

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个答案

龙晟睿
2023-03-14

要将形状(nrows,ncols)的常规特征表数据输入到Keras的Conv1d,需要以下两个步骤:

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

例如,以虹膜数据集的前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)

这对于Keras的Conv1d非常有效。对于输入形状,需要(4,1)。

帅博简
2023-03-14

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

当使用此层作为模型中的第一层时,提供一个input_shape参数(整数元组或无,例如(10,128)用于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\u数据,N\u特征),我们将示例数设置为未指定(无)。在这种情况下,参数控制时间步的大小。

曾光誉
2023-03-14

尝试:

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是为序列分析而设计的,它具有卷积滤波器,无论我们在序列的哪个部分,卷积滤波器都是相同的。第二个维度是所谓的特征维度,在该维度中,您可以在每个时间步拥有多个特征的向量。人们可能会认为序列维度与空间维度相同,而特征维度与通道维度或颜色维度相同。正如@putonspectacles在他的评论中提到的那样,您可以将序列维度设置为无,以使网络输入长度不变。

 类似资料:
  • 我在使用Keras和Python对3D形状进行分类时遇到了一个问题。我有一个文件夹,里面有一些JSON格式的模型。我将这些模型读入Numpy数组。模型是25*25*25,表示体素化模型的占用网格(每个位置表示位置(i、j、k)中的体素是否有点),因此我只有1个输入通道,就像2D图像中的灰度图像一样。我拥有的代码如下: 在此之后,我得到以下错误 使用TensorFlow后端。回溯(最后一次调用):文

  • 我正在尝试为数字数据集构建1D CNN。我的数据集有520行和13个特征。下面是代码。 它给出了“ValueError:layer sequential\u 21的输入0与layer不兼容::expected min\u ndim=3,found ndim=2。接收到的完整形状:(1,13)”错误。 我需要如何设置输入形状,还是必须重塑X\U列?非常感谢您的帮助。

  • 我有32760个音频频谱,计算维度=72(#帧)x 40(#频段),我试图将其输入“宽”卷积神经网络(第一层是4个不同conv层的合奏)。这些频谱没有深度,因此它们可以表示为72 x 40 2D数字浮点数组,因此分类器的X输入是一个32760个元素长的数组,每个元素都是这些72 x 40 x 1频谱之一。Y输入是一个标签数组,一个热编码,有32760个元素。 当尝试使用 我得到以下错误: 以下是我

  • 注意: 本教程适用于对Tensorflow有丰富经验的用户,并假定用户有机器学习相关领域的专业知识和经验。 概述 对CIFAR-10 数据集的分类是机器学习中一个公开的基准测试问题,其任务是对一组大小为32x32的RGB图像进行分类,这些图像涵盖了10个类别: 飞机, 汽车, 鸟, 猫, 鹿, 狗, 青蛙, 马, 船以及卡车。 想了解更多信息请参考CIFAR-10 page,以及Alex Kriz

  • 卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络

  • 我正在开发一种卷积神经网络用于图像分类或更好的车牌分类。这些车牌最多包含8个字符,每个字符可以包含37个字符(A-Z、0-9和空格)。我现在想知道如何设计网络中的最后两层。我认为,最后一个必须是具有37个概率的softmax层。这应该完全连接到一个(?)神经元在前一层?我想,在前一层我们需要8个神经元,因为之前的车牌上有8个字符,但我不确定。在此层之前,我添加了一些卷积层和maxPooling层。