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

时间:2017-10-12 15:58:51

标签: keras rnn

在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'))

这给出了模型的摘要和图表: enter image description here 此外,总参数被正确识别为:

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

但是,有关kernel_size为3的信息无法显示在我的知识中......

问题:

  1. 输入显示为:(无,无,6)...为什么不是例如(无,3,6)?...(这是一些错误,还是我错过了什么?)

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

1 个答案:

答案 0 :(得分:0)

问题1:

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

显示的形状不包含有关内核大小的信息。过滤器“沿序列”应用。通过序列逐步计算相同的过滤器。无论序列的大小如何,它都是相同的过程。

如果您使用newSequenceLength(默认值),则内核大小可能更改的唯一数字是padding='valid'。使用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)