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 的信息没有显示...
问题:
输入显示为:(None, None, 6)...为什么不是e.g. (None, 3, 6)?...(这是一些错误,还是我遗漏了什么?)
有没有办法在摘要或图片上显示 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)
在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 的信息没有显示...
问题:
输入显示为:(None, None, 6)...为什么不是e.g. (None, 3, 6)?...(这是一些错误,还是我遗漏了什么?)
有没有办法在摘要或图片上显示 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)