Keras、Conv1D:在 summary() 或使用 plot_model() 上打印/绘制 kernel_size 的信息

Keras, Conv1D: printing / plotting information of kernel_size on summary() or using plot_model()

在keras中,我有一个涉及keras.layers.Conv1D的模型,并尝试绘制它。例如,这是一个简单的例子:

from keras.models import Sequential,Model
from keras.layers import Conv1D
from keras.utils import plot_model
from IPython.display import Image, display


seq_length = None
M=6
kernel_size = 3
filters=1

model = Sequential()
model.add(
    Conv1D(
        filters = filters, 
        kernel_size = kernel_size, 
        input_shape=(seq_length, M),#When using this layer as the first layer in a model, provide an input_shape argument 
    )        
)

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
print 'Trainable params = ({}[filters])*((6[input_shape[1]])x({}[kernel_size]])+(1[bias])) = {}'.format(filters,kernel_size,M*kernel_size+1)
plot_model(model, to_file='model.png',show_shapes=True)
display(model.summary())
display(Image(filename='model.png'))

这很好地给出了模型的摘要和图: 此外,总参数被正确识别为:

(1[filters])*((6[input_shape[1]])x(3[kernel_size]])+(1[bias])) = 19

但是,据我所知,关于 kernel_size 是 3 的信息没有显示...

问题:

  1. 输入显示为:(None, None, 6)...为什么不是e.g. (None, 3, 6)?...(这是一些错误,还是我遗漏了什么?)

  2. 有没有办法在摘要或图片上显示 kernel_size?

第1题:

  • 输入形状为:(batchSize, sequenceLength, features)
  • 而输出形状是:(batchSize, newSequenceLength, layerFilters)

显示的形状不包含有关内核大小的信息。过滤器已应用 "along the sequence"。在整个序列中逐步计算相同的过滤器。这是相同的过程,无论序列的大小。

如果您使用 padding='valid'(默认值),内核大小唯一可能改变的数字是 newSequenceLength。使用padding='valid'时,会丢失序列的边界:

newSequenceLength = sequenceLength - (kernel_size - 1)   

如果一个序列的长度为 3,内核将使用这 3 个步骤计算一次。如果一个序列的长度为 4,内核将被计算两次。前 3 个步骤一次,后 3 个步骤一次。如果长度为 5,内核将应用 3 次,每组 3 个步骤一次。等等...

但是,如果您使用的是 padding='same',则输出长度将与输入长度相同(keras 将用足够的步长填充输入,因此丢失边框后的输出长度相同作为输入)

为什么None

keras 中的 None 维度用于模型允许该维度具有任意大小的情况。对于此模型,您可以使用任何批量大小和任何序列长度。

第2题:

我不知道。但您可以随时查看:

for layer in model.layers:
    if hasattr(layer,'kernel_size'):
        print(layer.kernel_size)