augan / ops.py
qninhdt's picture
Upload 28 files
89ce6b3 verified
raw
history blame
7.45 kB
import tensorflow as tf
# import tensorflow.contrib.slim as slim
import tf_slim as slim
import math
import pprint
pp = pprint.PrettyPrinter()
get_stddev = lambda x, k_h, k_w: 1 / math.sqrt(k_w * k_h * x.get_shape()[-1])
# import tensorflow.contrib as tf_contrib
# weight_init = tf_contrib.layers.xavier_initializer()
weight_init = tf.initializers.GlorotUniform()
weight_regularizer = None
def batch_norm(x, name="batch_norm"):
# return tf.contrib.layers.batch_norm(
# x, decay=0.9, updates_collections=None, epsilon=1e-5, scale=True, scope=name
# )
return tf.keras.layers.BatchNormalization(
momentum=0.9, epsilon=1e-5, scale=True, name=name
)(x)
def instance_norm(input, name="instance_norm"):
with tf.compat.v1.variable_scope(name):
depth = input.get_shape()[3]
scale = tf.compat.v1.get_variable(
"scale",
[depth],
initializer=tf.keras.initializers.RandomNormal(
mean=1.0, stddev=0.02, seed=None
),
)
offset = tf.compat.v1.get_variable(
"offset", [depth], initializer=tf.constant_initializer(0.0)
)
mean, variance = tf.nn.moments(input, axes=[1, 2], keepdims=True)
epsilon = 1e-5
inv = tf.math.rsqrt(variance + epsilon)
normalized = (input - mean) * inv
return scale * normalized + offset
def conv2d(input_, output_dim, ks=4, s=2, stddev=0.02, padding="SAME", name="conv2d"):
with tf.compat.v1.variable_scope(name):
return slim.conv2d(
input_,
output_dim,
ks,
s,
padding=padding,
activation_fn=None,
weights_initializer=tf.keras.initializers.TruncatedNormal(stddev=stddev),
biases_initializer=None,
)
def deconv2d(input_, output_dim, ks=4, s=2, stddev=0.02, name="deconv2d"):
with tf.compat.v1.variable_scope(name):
return slim.conv2d_transpose(
input_,
output_dim,
ks,
s,
padding="SAME",
activation_fn=None,
weights_initializer=tf.keras.initializers.TruncatedNormal(stddev=stddev),
biases_initializer=None,
)
def dilated_conv2d(
input_, output_dim, ks=3, s=2, stddev=0.02, padding="SAME", name="conv2d"
):
with tf.compat.v1.variable_scope(name):
batch, in_height, in_width, in_channels = [int(d) for d in input_.get_shape()]
filter = tf.compat.v1.get_variable(
"filter",
[ks, ks, in_channels, output_dim],
dtype=tf.float32,
initializer=tf.random_normal_initializer(0, stddev),
)
conv = tf.nn.atrous_conv2d(input_, filter, rate=s, padding=padding, name=name)
return conv
def one_step(x, ch, kernel, stride, name):
return lrelu(
instance_norm(
conv2d(x, ch, kernel, stride, name=name + "_first_c"), name + "_first_bn"
)
)
def one_step_dilated(x, ch, kernel, stride, name):
return lrelu(
instance_norm(
dilated_conv2d(x, ch, kernel, stride, name=name + "_first_c"),
name + "_first_bn",
)
)
def num_steps(x, ch, kernel, stride, num_steps, name):
for i in range(num_steps):
x = lrelu(
instance_norm(
conv2d(x, ch, kernel, stride, name=name + "_c_" + str(i)),
name + "_bn_" + str(i),
)
)
return x
def one_step_noins(x, ch, kernel, stride, name):
return lrelu(conv2d(x, ch, kernel, stride, name=name + "_first_c"))
def num_steps_noins(x, ch, kernel, stride, num_steps, name):
for i in range(num_steps):
x = lrelu(conv2d(x, ch, kernel, stride, name=name + "_c_" + str(i)))
return x
def dis_down(images, kernel_size, stride, n_scale, ch, name):
backpack = images[0]
for i in range(n_scale):
if i == n_scale - 1:
images[i] = num_steps(
backpack, ch, kernel_size, stride, n_scale, name + str(i)
)
else:
images[i] = one_step_dilated(
images[i + 1], ch, kernel_size, 1, name + str(i)
)
return images
def dis_down_noins(images, kernel_size, stride, n_scale, ch, name):
backpack = images[0]
for i in range(n_scale):
if i == n_scale - 1:
images[i] = num_steps_noins(
backpack, ch, kernel_size, stride, n_scale, name + str(i)
)
else:
images[i] = one_step_noins(images[i + 1], ch, kernel_size, 1, name + str(i))
return images
def final_conv(images, n_scale, name):
for i in range(n_scale):
images[i] = conv2d(images[i], 1, s=1, name=name + str(i))
return images
def lrelu(x, leak=0.2, name="lrelu"):
return tf.maximum(x, leak * x)
def linear(input_, output_size, scope=None, stddev=0.02, bias_start=0.0, with_w=False):
with tf.compat.v1.variable_scope(scope or "Linear"):
matrix = tf.get_variable(
"Matrix",
[input_.get_shape()[-1], output_size],
tf.float32,
tf.random_normal_initializer(stddev=stddev),
)
bias = tf.get_variable(
"bias", [output_size], initializer=tf.constant_initializer(bias_start)
)
if with_w:
return tf.matmul(input_, matrix) + bias, matrix, bias
else:
return tf.matmul(input_, matrix) + bias
def get_ones_like(logit):
target = []
for i in range(len(logit)):
target.append(tf.ones_like(logit[i]))
return target
def get_zeros_like(logit):
target = []
for i in range(len(logit)):
target.append(tf.zeros_like(logit[i]))
return target
def conv(
x,
channels,
kernel=4,
stride=2,
pad=0,
pad_type="zero",
use_bias=True,
scope="conv_0",
):
with tf.compat.v1.variable_scope(scope):
if pad_type == "zero":
x = tf.pad(x, [[0, 0], [pad, pad], [pad, pad], [0, 0]])
if pad_type == "reflect":
x = tf.pad(x, [[0, 0], [pad, pad], [pad, pad], [0, 0]], mode="REFLECT")
x = tf.layers.conv2d(
inputs=x,
filters=channels,
kernel_size=kernel,
kernel_initializer=weight_init,
kernel_regularizer=weight_regularizer,
strides=stride,
use_bias=use_bias,
)
return x
def reduce_sum(input_tensor, axis=None, keepdims=False):
try:
return tf.reduce_sum(input_tensor, axis=axis, keepdims=keepdims)
except:
return tf.reduce_sum(input_tensor, axis=axis, keep_dims=keepdims)
def get_shape(inputs, name=None):
name = "shape" if name is None else name
with tf.name_scope(name):
static_shape = inputs.get_shape().as_list()
dynamic_shape = tf.shape(inputs)
shape = []
for i, dim in enumerate(static_shape):
dim = dim if dim is not None else dynamic_shape[i]
shape.append(dim)
return shape
def show_all_variables():
model_vars = tf.trainable_variables()
slim.model_analyzer.analyze_vars(model_vars, print_info=True)