在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的信息无法显示在我的知识中......
问题:
输入显示为:(无,无,6)...为什么不是例如(无,3,6)?...(这是一些错误,还是我错过了什么?)
有没有办法在摘要或图片上显示kernel_size?
答案 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)