Keras将功能模型转换为模型子类

2024-09-30 00:34:43 发布

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

我试图使用KerasModel子类化重写函数模型,但是在新的Model子类中,摘要生成不起作用。在

作为参考,函数模型及其输出。在

filters = 32

# placeholder for inputs
inputs = Input(shape=[16, 16, 16, 12])  

# L-hand side of UNet
conv1 = DoubleConv3D(filters*1)(inputs)
pool1 = MaxPooling3D()(conv1)
...

# middle bottleneck
conv5 = DoubleConv3D(filters*5)(pool4)

# R-hand side of UNet
rsdc6 = ConcatConv3D(filters*4)(conv5, conv4)
conv6 = DoubleConv3D(filters*4)(rsdc6)
...

# sigmoid activation
outputs = Conv3D(1, (1, 1, 1), activation='sigmoid')(conv9)

model = Model(inputs=[inputs], outputs=[outputs])
model.summary()
^{pr2}$

Model子类看起来像:

^{3}$

但是,没有输出层和参数数量,总结给出了

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________

最初,我认为这是一个错误,在调用summary之前没有调用build,并尝试显式地调用该函数并在第一个卷积层之前添加一个InputLayer,如本文related answer所述。但是,这两个解决方案都无法帮助修复model子类上的摘要生成。在


Tags: of函数模型unetmodelparamsoutputs子类
1条回答
网友
1楼 · 发布于 2024-09-30 00:34:43

通过查看下面的example,我找到了这个模型子类化问题的解决方案。贷款应该归回购的作者所有。在

创建将Keras函数转换为模型子类的一种方法是创建并调用一个复制模型初始化的函数,例如Model(inputs=[inputs], outputs=[outputs])。在这里,我们使用_build函数来实现这一点。在

class UNet3D(Model):
    def __init__(self, **kwargs):

        # Initialize model parameters.
        self.filters = 32
        ...

        # Initialize model.
        self._build(**kwargs)

    def __call__(self, inputs):

        # L-hand side of UNet
        conv1 = DoubleConv3D(self.filters*1)(inputs)
        pool1 = MaxPooling3D()(conv1)
        ...

        # middle bottleneck
        conv5 = DoubleConv3D(self.filters*5)(pool4)

        # R-hand side of UNet
        rsdc6 = ConcatConv3D(self.filters*4)(conv5, conv4)
        conv6 = DoubleConv3D(self.filters*4)(rsdc6)
        ...

        # sigmoid activation
        outputs = Conv3D(1, (1, 1, 1), activation='sigmoid')(conv9)
        return outputs

    def _build(self, **kwargs):
        """
        Replicates Model(inputs=[inputs], outputs=[outputs]) of functional model.
        """
        # Replace with shape=[None, None, None, 1] if input_shape is unknown.
        inputs  = Input(shape=[16, 16, 16, 12])
        outputs = self.__call__(inputs)
        super(UNet3D, self).__init__(name="UNet3D", inputs=inputs, outputs=outputs, **kwargs) 

unet3d = UNet3D()
unet3d.summary()

相关问题 更多 >

    热门问题