Keras:如何在顺序模型中获取图层形状

Posted

技术标签:

【中文标题】Keras:如何在顺序模型中获取图层形状【英文标题】:Keras: How to get layer shapes in a Sequential model 【发布时间】:2017-09-30 07:32:12 【问题描述】:

我想访问Sequential Keras 模型中所有层的层大小。我的代码:

model = Sequential()
model.add(Conv2D(filters=32, 
               kernel_size=(3,3), 
               input_shape=(64,64,3)
        ))
model.add(MaxPooling2D(pool_size=(3,3), strides=(2,2)))

然后我想要一些类似下面的代码工作

for layer in model.layers:
    print(layer.get_shape())

.. 但事实并非如此。我得到错误:AttributeError: 'Conv2D' object has no attribute 'get_shape'

【问题讨论】:

【参考方案1】:

如果你想以花哨的方式打印输出:

model.summary()

如果您希望尺寸以可访问的形式显示

for layer in model.layers:
    print(layer.get_output_at(0).get_shape().as_list())

可能有比这更好的方法来访问这些形状。感谢 Daniel 的启发。

【讨论】:

【参考方案2】:

根据Keras Layer 的官方文档,可以通过layer.output_shapelayer.input_shape 访问层输出/输入形状。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D


model = Sequential(layers=[
    Conv2D(32, (3, 3), input_shape=(64, 64, 3)),
    MaxPool2D(pool_size=(3, 3), strides=(2, 2))
])

for layer in model.layers:
    print(layer.output_shape)

# Output
# (None, 62, 62, 32)
# (None, 30, 30, 32)

【讨论】:

"AttributeError: 该层从未被调用,因此没有定义的输出形状" @Adrian 确保正确定义第一层的inpute_shape。您可以先致电model.build() 进行检查。【参考方案3】:

只需使用model.summary(),它就会打印所有图层及其输出形状。


如果您需要它们作为数组、元组等,您可以尝试:

for l in model.layers:
    print (l.output_shape)

对于多次使用的层,它们包含“多个入站节点”,您应该分别获取每个输出形状:

if isinstance(layer.outputs, list):
    for out in layer.outputs:
        print(K.int_shape(out))

        for out in layer.outputs:

第一层将作为 (None, 62, 62, 32) 出现。 None 与 batch_size 有关,将在训练或预测期间定义。

【讨论】:

model.summary() 在许多情况下是一个不错的选择,但理想情况下我希望将形状设为数组或张量 我收到以下错误(更新后):AttributeError: The layer "max_pooling2d_1 has multiple inbound nodes, with different output shapes. Hence the notion of "output shape" is ill-defined for the layer. Use 'get_output_shape_at(node_index)' instead. 我认为您必须按照我的回答完成全部操作 你可以K.int_shape(layer.get_output_at(node_index)),但你需要在许多索引处获得输出

以上是关于Keras:如何在顺序模型中获取图层形状的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 的顺序模型中更改输入形状

在 Keras 中,如何获取与模型中包含的“模型”对象关联的图层名称?

Keras:如何在编译期间输入形状未知时创建带权重的自定义图层?

如何在keras中通过numpy数组初始化图层

sklearn 管道 + keras 顺序模型 - 如何获取历史记录?

如何在 Keras 中的预训练 InceptionResNetV2 模型的不同层中找到激活的形状 - Tensorflow 2.0