根据keras文档(https://keras.io/layers/convolutional/),Conv1D输出张量的形状是(batch_size,new_steps,filters),而输入张量形状是(batch_size,steps,input_dim) . 我没有听到步骤意味着您的输入中的#个通道)然后该层将具有形状(1,1,X)的输出,其中X是Conv层中的滤波器数量 . 但是输入维度会发生什么?由于图层中的X滤镜应用于整个输入维度,因此不应该使用Conv1D图层吗?这里有什么我想念的吗?
背景资料:
我试图想象我的CNN的1d卷积层激活,但我发现大多数在线工具似乎只适用于2d卷积层,所以我决定为它编写自己的代码 . 我对它的工作方式有了很好的理解,这是我到目前为止的代码:
# all the model's activation layer output tensors
activation_output_tensors = [layer.output for layer in model.layers if type(layer) is keras.layers.Activation]
# make a function that computes activation layer outputs
activation_comp_function = K.function([model.input, K.learning_phase()], activation_output_tensors)
# 0 means learning phase = False (i.e. the model isn't learning right now)
activation_arrays = activation_comp_function([training_data[0,:-1], 0])
此代码基于julienr在此thread中的第一条评论,并对当前版本的keras进行了一些修改 . 当我使用它的时候,虽然所有的激活阵列都是形状的(1,1,X)......我昨天花了整整一天试图找出原因,但没有运气任何帮助都非常感激 .
更新:结果我误认为input_dimension的含义与步骤维度 . 这主要是因为我使用的架构来自另一个在mathematica中构建模型的组,而在mathematica中,(X,Y)到Conv1D层的输入形状意味着X“通道”(或X的input_dimension)和Y步 . 感谢gionni帮助我实现这一点,并很好地解释了“input_dimension”如何成为“过滤器”维度 .
1 回答
我以前对2D卷积有同样的问题 . 问题在于,当您应用卷积层时,您应用的内核的大小不是
(kernel_size, 1)
,而是(kernel_size, input_dim)
.如果你想到它,如果不是这样的话,带有
kernel_size = 1
的1D卷积层对它收到的输入什么都不做 .相反,它计算每个时间步的输入要素的加权平均值,每个时间步使用相同的权重(尽管每个过滤器使用不同的权重集) . 我认为将
input_dim
可视化为图像的2D卷积中的channels
的数量是有帮助的,其中相同的移植适用(在这种情况下是channels
,"get lost"并且转换为滤波器的数量) .为了说服自己,可以使用
kernel_size=(1D_kernel_size, input_dim)
和相同数量的滤波器,使用2D卷积层重现1D卷积 . 这是一个例子:正如我所说,我花了一段时间来理解这一点,我认为主要是因为没有教程清楚地解释它