我正在尝试使用keras在时间序列分类问题上实现一维卷积。我在解释一维卷积层的输出大小时遇到一些麻烦。
我的数据由128个单位时间间隔内的不同特征的时间序列组成,并应用了1D卷积层:
x = Input((n_timesteps, n_features))
cnn1_1 = Conv1D(filters = 100, kernel_size= 10, activation='relu')(x)
在编译后,我得到以下输出形状:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_26 (InputLayer) (None, 128, 9) 0
_________________________________________________________________
conv1d_28 (Conv1D) (None, 119, 100) 9100
我假设使用1D卷积,数据仅沿时间轴(轴1)进行卷积,并且我的输出大小为: 119,100 * 9。但是我猜想网络正在整个要素维度(第2轴)上执行某些操作,而我不知道正在执行哪个操作。 我之所以这样说是因为我将一维卷积解释为必须保留要素形状,因为我只对时域进行卷积:如果我有9个特征,那么对于每个滤波器,我有9个卷积核,每个应用于一个a不同的特征并在时间轴上盘旋。这将为每个滤镜返回9个卷积特征,从而得到119、9 * 100的输出形状。 但是,输出形状为119,100。
很明显,正在发生其他事情,我无法理解或理解。
我在哪里推理失败?一维卷积如何执行?
我再添加一条评论,这是我对所提供答案之一的评论:
我知道从128减少到119,但是我不明白为什么要素尺寸会发生变化。例如,如果我使用
Conv1D(filters = 1, kernel_size= 10, activation='relu')
,则输出维将为(None,119,1),在卷积后仅产生一个特征。在这个维度上发生了什么,从9-> 1开始执行哪个操作?
答案 0 :(得分:1)
Conv1D的形状(batch_size,time_step,feature
)输入需要3D张量。根据您的代码,过滤器大小为100,这表示过滤器从9个尺寸转换为100个尺寸。这是怎么发生的? 点产品。
在上面,X_i
是k
个单词的串联(k
= kernel_size),l
是过滤器数(l =过滤器),{{1} }是输入单词向量的维数,d
是p_i
单词的每个窗口的输出向量。
代码中会发生什么?
k
点[n_features * 9]
=> [n_features * 9]
=>重复[1]
=> l-times
对所有序列执行上面的操作=> [1 * 100]
这里发生的另一件事是您未指定[128 * 100]
类型。 According to the docs,默认情况下,Conv1d使用有效填充,这会使您的尺寸从128减少到119。如果需要与输入的尺寸相同,则可以选择相同选项:
padding