| from face_feature.core.leras import nn | |
| tf = nn.tf | |
| class CodeDiscriminator(nn.ModelBase): | |
| def on_build(self, in_ch, code_res, ch=256, conv_kernel_initializer=None): | |
| n_downscales = 1 + code_res // 8 | |
| self.convs = [] | |
| prev_ch = in_ch | |
| for i in range(n_downscales): | |
| cur_ch = ch * min( (2**i), 8 ) | |
| self.convs.append ( nn.Conv2D( prev_ch, cur_ch, kernel_size=4 if i == 0 else 3, strides=2, padding='SAME', kernel_initializer=conv_kernel_initializer) ) | |
| prev_ch = cur_ch | |
| self.out_conv = nn.Conv2D( prev_ch, 1, kernel_size=1, padding='VALID', kernel_initializer=conv_kernel_initializer) | |
| def forward(self, x): | |
| for conv in self.convs: | |
| x = tf.nn.leaky_relu( conv(x), 0.1 ) | |
| return self.out_conv(x) | |
| nn.CodeDiscriminator = CodeDiscriminator |