使用自定义Keras层构建模型时model.summary()显示参数为0如何解决?
问题原因
Keras自定义层的可训练参数和子模块必须在__init__方法中绑定为实例属性,才会被框架自动识别追踪。你将Inception单元内的所有Conv2D层都定义在了call方法中,这些层属于每次前向传播时临时创建的对象,不会被注册到自定义层的参数列表中,因此model.summary()会显示该层参数为0。
修复方案
将Inception单元内用到的所有卷积层、池化层都迁移到__init__方法中初始化并绑定为实例属性,在call方法中直接调用这些预先创建好的层即可。修改后的代码如下:
class InceptionUnit(keras.layers.Layer): def __init__(self, filters, activation='relu', **kwargs): super().__init__(**kwargs) self.filters = filters self.activation = keras.activations.get(activation) # 分支1的卷积层 self.conv1_1 = keras.layers.Conv2D(filters=self.filters[0], kernel_size=1, padding='SAME') # 分支2的卷积层 self.conv2_1 = keras.layers.Conv2D(filters=self.filters[1], kernel_size=1, padding='SAME') self.conv2_2 = keras.layers.Conv2D(filters=self.filters[2], kernel_size=3, padding='SAME') # 分支3的卷积层 self.conv3_1 = keras.layers.Conv2D(filters=self.filters[3], kernel_size=1, padding='SAME') self.conv3_2 = keras.layers.Conv2D(filters=self.filters[4], kernel_size=5, padding='SAME') # 分支4的池化和卷积层 self.pool4_1 = keras.layers.MaxPooling2D(pool_size=(3, 3), strides=1, padding='SAME') self.conv4_1 = keras.layers.Conv2D(filters=self.filters[5], kernel_size=1, padding='SAME') def call(self, inputs): out1 = self.conv1_1(inputs) out1 = self.activation(out1) out2 = self.conv2_1(inputs) out2 = self.activation(out2) out2 = self.conv2_2(out2) out2 = self.activation(out2) out3 = self.conv3_1(inputs) out3 = self.activation(out3) out3 = self.conv3_2(out3) out3 = self.activation(out3) out4 = self.pool4_1(inputs) out4 = self.conv4_1(out4) out4 = self.activation(out4) out = keras.layers.concatenate([out1, out2, out3, out4]) return out
修改完成后重新构建模型,再次调用model.summary()即可正常显示每个InceptionUnit层的参数。
内容的提问来源于stack exchange,提问作者user13689232
相关产品推荐
相关产品推荐

