使用keras在2D数据上输出1D卷积的形状

时间:2018-12-10 15:41:17

标签: python keras deep-learning conv-neural-network

我正在尝试使用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开始执行哪个操作?

1 个答案:

答案 0 :(得分:1)

Conv1D的形状(batch_size,time_step,feature)输入需要3D张量。根据您的代码,过滤器大小为100,这表示过滤器从9个尺寸转换为100个尺寸。这是怎么发生的? 点产品

enter image description here

在上面,X_ik个单词的串联(k = kernel_size),l是过滤器数(l =过滤器),{{1} }是输入单词向量的维数,dp_i单词的每个窗口的输出向量。

代码中会发生什么?

k[n_features * 9] => [n_features * 9] =>重复[1] => l-times

对所有序列执行上面的操作=> [1 * 100]

这里发生的另一件事是您未指定[128 * 100]类型。 According to the docs,默认情况下,Conv1d使用有效填充,这会使您的尺寸从128减少到119。如果需要与输入的尺寸相同,则可以选择相同选项:

padding