我在子类Keras'Model'中创建和存储层的方式有什么影响吗?

2024-09-29 19:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

又名KerasModel子类魔术。你知道吗

在使用Keras时,我注意到,当我将层的新实例放入以前放入自定义模型的集合时,ResNetBlock.layers会被填充。你知道吗

class ResNetBlock(Model):
    PART_COUNT = 3

    def __init__(self, kernel_size, filters):
        super().__init__()
        self.convs = []
        self.batchNorms = []

        for part in range(ResNetBlock.PART_COUNT):
            if part == 1:
                conv = Conv2D(filters[part], kernel_size=kernel_size, padding="same")
            else:
                conv = Conv2D(filters[part], kernel_size=(1,1))
            self.convs.append(conv)
            self.batchNorms.append(BatchNormalization())

resnet = ResNetBlock(1, [1, 2, 3])
print(resnet.layers) # actually prints non-empty list
                     # filled with Conv2Ds and BNs from above

采纳自官方教程:https://www.tensorflow.org/beta/tutorials/eager/custom_layers

对TensorFlow源的一点挖掘表明,通过Network类中的__setattr__使用了某种跟踪。你知道吗

现在代码并不琐碎,缺少文档,而且似乎不清楚创建新层/将它们添加到各自集合的顺序是否重要?例如,如果我先填写convs集合,然后才填写batchNorms集合,它还会是同一个模型吗?你知道吗

在大多数教程中,每个层实际上都被放入自己的属性中。你知道吗

另一个问题是:为什么这样做是含蓄的?这种魔力打破了人们的座右铭:喜欢显性而不是隐性。如果出于某种原因,我需要使用不是从list派生的自定义集合类型呢?我如何确保这些神奇的操作是正确的?你知道吗


Tags: 模型selfsizeinitlayerscountkernelfilters
1条回答
网友
1楼 · 发布于 2024-09-29 19:18:27

顺序无关紧要。真正改变模型的是call方法。这将存储操作的顺序(即使权重的顺序是可变的,它们也将应用于具有相同函数的相同图形中)

现在,如果您怀疑不使用“属性”,而是为层使用另一种类型的存储,会由于某种原因而无法注册层,您可以再次检查:

print(len(resnet.trainable_weights))

计数应为6 * PART_COUNT

  • conv层的2个张量(核和偏置)
  • 标准化层的4个张量(均值、方差、标度和偏移)

相关问题 更多 >

    热门问题