我试图深入了解 David Foster 的著作《生成性深度学习》中介绍的 MuseGAN 网络。 (我强烈推荐。)我坚持的一件事是了解“时间网络”中可训练参数的数量,“时间网络”是 GAN 中生成器的子网络。
代码如下:
def TemporalNetwork(self):
input_layer = Input(shape=(self.z_dim,), name='temporal_input')
x = Reshape([1,1,self.z_dim])(input_layer)
x = self.conv_t(x, f=1024, k=(2,1), s=(1,1), a= 'relu', p = 'valid', bn = True)
x = self.conv_t(x, f=self.z_dim, k=(self.n_bars - 1,1), s=(1,1), a= 'relu', p = 'valid', bn = True)
output_layer = Reshape([self.n_bars, self.z_dim])(x)
return Model(input_layer, output_layer)
其中 self.conv_t 是 Conv2DTranspose 的 wapper。我想它的重点是将批量归一化和激活与转置卷积层结合起来,以便您在构建网络时可以更简单地调用它。这是 conv_t 的定义:
def conv_t(self, x, f, k, s, a, p, bn):
x = Conv2DTranspose(
filters = f
, kernel_size = k
, padding = p
, strides = s
, kernel_initializer = self.weight_init
)(x)
if bn:
x = BatchNormalization(momentum = 0.9)(x)
if a == 'relu':
x = Activation(a)(x)
elif a == 'lrelu':
x = LeakyReLU()(x)
默认常量为 self.z_dim = 32,self.n_bars=2。
我尝试以与处理普通卷积层相同的方式计算转置卷积层中的可训练参数:input_filters * output_filters * kernel_size + output_filters。我得到以下信息:
输入层:0 重塑:0 第一个 conv_t:32 * 1024 * 2 + 1024 = 66560 第二个 conv_t:1024 * 32 * 1 + 32 = 32800 输出层:0
总计:99360
然而,在gan.generator.summary()给出的摘要中,它说有103584个参数。
那么,为什么我缺少 4224 个参数?
编辑 1:在问这个问题之后,我意识到神秘参数可能来自批量标准化。这可能就是答案。
答案 0 :(得分:0)
是的,批量归一化有可训练和不可训练的参数,前一层的每个过滤器各有 2 个,所以总共有 4 * 个过滤器。
对于 conv_t 的第一次调用,批量归一化贡献了 4 * 1024 = 4096 个参数。
对于 conv_t 的第二次调用,批量归一化贡献了 4 * 32 = 128 个参数。
这些共同构成了 4224 个参数,它们的出处对我来说是个谜。