Keras,Conv1D:在summary()或使用plot\u model()上打印/打印内核大小信息

Keras,Conv1D:在summary()或使用plot\u model()上打印/打印内核大小信息,keras,rnn,Keras,Rnn,在keras中,我有一个涉及keras.layers.Conv1D的模型,并尝试绘制它。例如,这里有一个简单的例子: 从keras.models导入顺序模型 从keras.layers导入Conv1D 从keras.utils导入plot\u模型 从IPython.display导入图像,显示 seq_长度=无 M=6 内核大小=3 过滤器=1 模型=顺序() model.add( Conv1D( 过滤器=过滤器, 内核大小=内核大小, input_shape=(seq_length,M),#将

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

从keras.models导入顺序模型
从keras.layers导入Conv1D
从keras.utils导入plot\u模型
从IPython.display导入图像,显示
seq_长度=无
M=6
内核大小=3
过滤器=1
模型=顺序()
model.add(
Conv1D(
过滤器=过滤器,
内核大小=内核大小,
input_shape=(seq_length,M),#将此层用作模型中的第一层时,请提供input_shape参数
)        
)
model.compile(loss='binary\u crossentropy',
优化器='rmsprop',
指标=[‘准确度’])
打印“可训练参数=({}[filters])*((6[input_shape[1]])x({}[kernel_size]])+(1[bias])={}”。格式(过滤器,kernel_size,M*kernel_size+1)
plot_model(model,to_file='model.png',show_shapes=True)
显示(model.summary())
显示(图像(filename='model.png'))
这给出了模型的概要和曲线图: 此外,总参数正确标识为:

(1[filters])*((6[input_shape[1]])x(3[kernel_size]])+(1[bias])=19
然而,据我所知,关于内核大小为3的信息是不存在的

问题:

  • 输入显示为:(无,无,6)。。。为什么不是(无,3,6)?。。。(这是某种错误,还是我遗漏了什么?)

  • 有没有办法在摘要或图像上显示内核大小


  • 对于问题1:

    • 输入形状为:
      (批量大小、序列长度、特征)
    • 而输出形状为:
      (batchSize、newSequenceLength、layerFilters)
    显示的形状不包含有关内核大小的信息。过滤器“沿顺序”应用。在整个序列中逐步计算相同的过滤器。无论序列大小,都是相同的过程

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

    newSequenceLength = sequenceLength - (kernel_size - 1)   
    
    如果序列的长度为3,那么将使用这3个步骤计算内核一次。如果序列的长度为4,则内核将计算两次。前三步一次,后三步一次。如果长度为5,内核将应用3次,每组3个步骤一次。等等

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

    为什么

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

    对于问题2:

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

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

    塔克斯。我会接受这个答案,因为它回答了我的问题,对任何开始关注Conv1D的人来说都是非常有用的。我仍然不满意为什么内核大小没有以任何方式绘制,并且担心我的理解是错误的。。。让我举一个例子:我有一个conv1D层(如示例所示),然后是一个致密层(假设有3个神经元),如果内核大小为1,那么我从7个神经元移动到3个神经元。如果从19到3是3。。。因此,在我决定模型时,内核大小应该是非常相关的信息。但当我打印它时,它甚至没有显示出来。。。这是出乎意料的……不是“神经元”,而是“参数/权重”。是的,内核越大,权重就越大。但是卷积层的目的主要是检测模式。您应该根据模式的大小来决定内核的大小。内核大小为1只不过是将通道连接在一起,但不需要寻找冗长的模式。这几乎与在3D数据中使用密集层相同。通常,最佳大小为3,您可以堆叠一系列卷积和最大池来检测更大的模式。在卷积层中,“过滤器”与神经元进行比较。
    print(layer.kernel.shape)
    还将打印每个过滤器中的通道数以及使用的过滤器数量。例如,以
    的格式(过滤高度、过滤宽度、每个层过滤的每个通道的数量、每个层输入的通道的数量、每个层使用的过滤器的数量)