Keras/Tensorflow Conv1D预期输入形状

Keras/Tensorflow Conv1D预期输入形状,tensorflow,keras,neural-network,conv-neural-network,convolution,Tensorflow,Keras,Neural Network,Conv Neural Network,Convolution,我想对我的29个特征输入数据应用一维卷积(如29x1形状)。我告诉Keras,input\u shape=(29,1)但我得到一个错误,它希望输入“有3个维度,但得到了具有形状(4000,29)的数组”为什么Keras需要三维空间? Keras文档给出了一个如何使用input_shape的奇怪示例: (无,128)用于每个步骤具有128个特征的可变长度序列 我不确定可变长度序列是什么意思,但由于我有29个功能,我也尝试了(无,29)和(1,29),并得到了类似的错误 我是否误解了一维卷积的作用

我想对我的29个特征输入数据应用一维卷积(如29x1形状)。我告诉Keras,
input\u shape=(29,1)
但我得到一个错误,它希望输入“有3个维度,但得到了具有形状(4000,29)的数组”为什么Keras需要三维空间?

Keras文档给出了一个如何使用input_shape的奇怪示例:

(无,128)用于每个步骤具有128个特征的可变长度序列

我不确定可变长度序列是什么意思,但由于我有29个功能,我也尝试了
(无,29)
(1,29)
,并得到了类似的错误

我是否误解了一维卷积的作用

下面是一个直观的描述,我希望Conv1D在给定7x1输入的情况下,内核大小为3时能做些什么

[x][x][x][ ][ ][ ][ ]
[ ][x][x][x][ ][ ][ ]
[ ][ ][x][x][x][ ][ ]
[ ][ ][ ][x][x][x][ ]
[ ][ ][ ][ ][x][x][x]

为什么Keras需要三维空间

这三个维度是(批次大小、特征大小、通道)

定义1D Conv图层

Conv1D(32, (3), activation='relu' , input_shape=( 29, 1 ))
将(4000,29,1)个样品送入该层

简单的例子:

from keras import models, layers
import numpy as np

x = np.ones((10, 29, 1))
y = np.zeros((10,))
model = models.Sequential()
model.add(layers.Conv1D(32, (3), activation='relu' , input_shape=( 29,1)))
model.add(layers.Flatten())
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer= "adam", metrics=['accuracy'])
print(model.summary())
model.fit(x,y)

因此,
input\u shape
中省略了
batch\u size
参数,其中
(29,1)
的定义实际上意味着
(batch\u size\u省略,29,1)
。Keras拒绝吃一维np阵列,因为CNN通常用于三维图像(“通道”R、G、B)。尽管我们只有1个通道,但我们必须将1d阵列封装到大小为29x1的矩阵中。是的,文档中提到不包括batch axis()。即使对于具有一个通道的灰度图像,也必须指定通道尺寸。