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

Python Keras将功能模型转换为模型子类,python,tensorflow,keras,Python,Tensorflow,Keras,我试图使用Keras模型子类化重写功能模型,但在新的模型子类中,摘要生成不起作用 以下是功能模型及其输出,以供参考 filters=32 #输入的占位符 输入=输入(形状=[16,16,16,12]) #UNet左侧 conv1=DoubleConv3D(过滤器*1)(输入) pool1=maxpoolg3d()(conv1) ... #中间瓶颈 conv5=DoubleConv3D(过滤器*5)(池4) #UNet右侧 rsdc6=ConcatConv3D(过滤器*4)(conv5,conv4

我试图使用Keras模型子类化重写功能模型,但在新的模型子类中,摘要生成不起作用

以下是功能模型及其输出,以供参考

filters=32
#输入的占位符
输入=输入(形状=[16,16,16,12])
#UNet左侧
conv1=DoubleConv3D(过滤器*1)(输入)
pool1=maxpoolg3d()(conv1)
...
#中间瓶颈
conv5=DoubleConv3D(过滤器*5)(池4)
#UNet右侧
rsdc6=ConcatConv3D(过滤器*4)(conv5,conv4)
conv6=DoubleConv3D(过滤器*4)(rsdc6)
...
#乙状结肠激活
输出=Conv3D(1,(1,1,1),激活='sigmoid')(conv9)
模型=模型(输入=[输入],输出=[输出])
model.summary()
层(类型)输出形状参数#连接到
==================================================================================================
输入_29(输入层)(无、16、16、16、10
__________________________________________________________________________________________________
conv3d_111(conv3d)(无、16、16、16、310400输入_29[0][0]
__________________________________________________________________________________________________
...
模型子类如下所示:

UNet3D级(型号):
定义初始(自我,**kwargs):
super(UNet3D,self)。\uuu init(name=“UNet3D”,**kwargs)
self.filters=32
定义调用(自身,输入):
#UNet左侧
conv1=DoubleConv3D(自过滤器*1)(输入)
pool1=maxpoolg3d()(conv1)
...
#中间瓶颈
conv5=DoubleConv3D(自过滤器*5)(池4)
#UNet右侧
rsdc6=ConcatConv3D(自过滤器*4)(conv5,conv4)
conv6=DoubleConv3D(自过滤器*4)(rsdc6)
...
#乙状结肠激活
输出=Conv3D(1,(1,1,1),激活='sigmoid')(conv9)
返回输出
unet3d=unet3d()
build(输入(shape=[None,None,None,1]))
unet3d.摘要()
但是,总结没有输出图层和参数数量,而是给出

_________________________________________________________________
层(类型)输出形状参数
=================================================================
总参数:0
可训练参数:0
不可训练参数:0
_________________________________________________________________

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

我发现了一个错误通过查看以下内容来解决此模型子类化问题。信用应归于该回购协议的作者

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

UNet3D级(型号):
定义初始(自我,**kwargs):
#初始化模型参数。
self.filters=32
...
#初始化模型。
自行建造(**kwargs)
定义调用(自身,输入):
#UNet左侧
conv1=DoubleConv3D(自过滤器*1)(输入)
pool1=maxpoolg3d()(conv1)
...
#中间瓶颈
conv5=DoubleConv3D(自过滤器*5)(池4)
#UNet右侧
rsdc6=ConcatConv3D(自过滤器*4)(conv5,conv4)
conv6=DoubleConv3D(自过滤器*4)(rsdc6)
...
#乙状结肠激活
输出=Conv3D(1,(1,1,1),激活='sigmoid')(conv9)
返回输出
def_构建(自身,**kwargs):
"""
复制功能模型的模型(输入=[输入],输出=[输出])。
"""
#如果输入形状未知,则替换为shape=[None,None,None,1]。
输入=输入(形状=[16,16,16,12])
输出=自身。调用(输入)
超级(UNet3D,self)。\uuu初始化(name=“UNet3D”,输入=输入,输出=输出,**kwargs)
unet3d=unet3d()
unet3d.摘要()