又名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
派生的自定义集合类型呢?我如何确保这些神奇的操作是正确的?你知道吗
顺序无关紧要。真正改变模型的是
call
方法。这将存储操作的顺序(即使权重的顺序是可变的,它们也将应用于具有相同函数的相同图形中)现在,如果您怀疑不使用“属性”,而是为层使用另一种类型的存储,会由于某种原因而无法注册层,您可以再次检查:
计数应为
6 * PART_COUNT
:相关问题 更多 >
编程相关推荐