in utils.py [0:0]
def conv_block(
inp,
cweight,
bweight,
reuse,
scope,
use_stride=True,
activation=tf.nn.leaky_relu,
pn=False,
bn=False,
gn=False,
ln=False,
scale=None,
bias=None,
class_bias=None,
use_bias=False,
downsample=False,
stop_batch=False,
use_scale=False,
extra_bias=False,
average=False,
label=None):
""" Perform, conv, batch norm, nonlinearity, and max pool """
stride, no_stride = [1, 2, 2, 1], [1, 1, 1, 1]
_, h, w, _ = inp.get_shape()
if FLAGS.downsample:
stride = no_stride
if not use_bias:
bweight = 0
if extra_bias:
if label is not None:
if len(bias.get_shape()) == 1:
bias = tf.reshape(bias, (1, -1))
bias_batch = tf.matmul(label, bias)
batch = tf.shape(bias_batch)[0]
dim = tf.shape(bias_batch)[1]
bias = tf.reshape(bias_batch, (batch, 1, 1, dim))
inp = inp + bias
if not use_stride:
conv_output = tf.nn.conv2d(inp, cweight, no_stride, 'SAME')
else:
conv_output = tf.nn.conv2d(inp, cweight, stride, 'SAME')
if use_scale:
if label is not None:
if len(scale.get_shape()) == 1:
scale = tf.reshape(scale, (1, -1))
scale_batch = tf.matmul(label, scale) + class_bias
batch = tf.shape(scale_batch)[0]
dim = tf.shape(scale_batch)[1]
scale = tf.reshape(scale_batch, (batch, 1, 1, dim))
conv_output = conv_output * scale
if use_bias:
conv_output = conv_output + bweight
if activation is not None:
conv_output = activation(conv_output)
if bn:
conv_output = batch_norm(conv_output, scale, bias)
if pn:
conv_output = pixel_norm(conv_output)
if gn:
conv_output = group_norm(
conv_output, scale, bias, stop_batch=stop_batch)
if ln:
conv_output = layer_norm(conv_output, scale, bias)
if FLAGS.downsample and use_stride:
conv_output = tf.layers.average_pooling2d(conv_output, (2, 2), 2)
return conv_output