Files
cvpr/stylegan2_ae/layers/mapping_block.py
T
2022-06-16 15:28:52 +00:00

49 lines
1.6 KiB
Python

import tensorflow as tf
from stylegan2_ae.layers.embedding import PoseShapeEmbedding, GarmentEmbedding
from stylegan2_ae.layers.dense import Dense
from stylegan2_ae.layers.bias_act import BiasAct
class Mapping(tf.keras.layers.Layer):
def __init__(self, w_dim, labels_dim, n_mapping, name, **kwargs):
super(Mapping, self).__init__(name=name, **kwargs)
self.w_dim = w_dim
self.labels_dim = labels_dim
self.n_mapping = n_mapping
self.gain = 1.0
self.lrmul = 0.01
self.normalize = tf.keras.layers.Lambda(lambda x: x * tf.math.rsqrt(tf.reduce_mean(tf.square(x), axis=1, keepdims=True) + 1e-8))
self.dense_layers = list()
self.bias_act_layers = list()
for ii in range(self.n_mapping):
self.dense_layers.append(Dense(w_dim, gain=self.gain, lrmul=self.lrmul, name='dense_{:d}'.format(ii)))
self.bias_act_layers.append(BiasAct(lrmul=self.lrmul, act='lrelu', name='bias_{:d}'.format(ii)))
def call(self, inputs, training=None, mask=None):
latents = inputs
x = latents
# normalize inputs
x = self.normalize(x)
# apply mapping blocks
for dense, apply_bias_act in zip(self.dense_layers, self.bias_act_layers):
x = dense(x)
x = apply_bias_act(x)
return x
def get_config(self):
config = super(Mapping, self).get_config()
config.update({
'w_dim': self.w_dim,
'labels_dim': self.labels_dim,
'n_mapping': self.n_mapping,
'gain': self.gain,
'lrmul': self.lrmul,
})
return config