Source code for dltk.networks.gan.dcgan

from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import tensorflow as tf
import numpy as np
from dltk.core.upsample import linear_upsample_3d
from dltk.core.activations import leaky_relu


[docs]def dcgan_generator_3d(inputs, filters=(256, 128, 64, 32, 1), kernel_size=((4, 4, 4), (3, 3, 3), (3, 3, 3), (3, 3, 3), (4, 4, 4)), strides=((4, 4, 4), (1, 2, 2), (1, 2, 2), (1, 2, 2), (1, 2, 2)), mode=tf.estimator.ModeKeys.TRAIN, use_bias=False): """ Deep convolutional generative adversial network (DCGAN) generator network. with num_convolutions on len(filters) resolution scales. The upsampling of features is done via strided transpose convolutions. On each resolution scale s are num_convolutions with filter size = filters[ s]. strides[s] determine the upsampling factor at each resolution scale. Args: inputs (tf.Tensor): Input noise tensor to the network. out_filters (int): Number of output filters. num_convolutions (int, optional): Number of convolutions per resolution scale. filters (tuple, optional): Number of filters for all convolutions at each resolution scale. strides (tuple, optional): Stride of the first convolution on a resolution scale. mode (TYPE, optional): One of the tf.estimator.ModeKeys strings: TRAIN, EVAL or PREDICT use_bias (bool, optional): Boolean, whether the layer uses a bias. Returns: dict: dictionary of output tensors """ outputs = {} assert len(strides) == len(filters) assert len(inputs.get_shape().as_list()) == 5, \ 'inputs are required to have a rank of 5.' conv_op = tf.layers.conv3d conv_params = {'padding': 'same', 'use_bias': use_bias, 'kernel_initializer': tf.uniform_unit_scaling_initializer(), 'bias_initializer': tf.zeros_initializer(), 'kernel_regularizer': None, 'bias_regularizer': None} x = inputs tf.logging.info('Input tensor shape {}'.format(x.get_shape())) for res_scale in range(0, len(filters)): with tf.variable_scope('gen_unit_{}'.format(res_scale)): tf.logging.info('Generator at res_scale before up {} tensor ' 'shape: {}'.format(res_scale, x.get_shape())) x = linear_upsample_3d(x, strides[res_scale], trainable=True) x = conv_op(inputs=x, filters=filters[res_scale], kernel_size=kernel_size[res_scale], **conv_params) tf.logging.info('Generator at res_scale after up {} tensor ' 'shape: {}'.format(res_scale, x.get_shape())) x = tf.layers.batch_normalization(x, training=mode == tf.estimator.ModeKeys.TRAIN) x = leaky_relu(x, 0.2) tf.logging.info('Generator at res_scale {} tensor shape: ' '{}'.format(res_scale, x.get_shape())) outputs['gen'] = x return outputs
[docs]def dcgan_discriminator_3d(inputs, filters=(64, 128, 256, 512), strides=((2, 2, 2), (2, 2, 2), (1, 2, 2), (1, 2, 2)), mode=tf.estimator.ModeKeys.EVAL, use_bias=False): """ Deep convolutional generative adversarial network (DCGAN) discriminator network with num_convolutions on len(filters) resolution scales. The downsampling of features is done via strided convolutions. On each resolution scale s are num_convolutions with filter size = filters[s]. strides[s] determine the downsampling factor at each resolution scale. Args: inputs (tf.Tensor): Input tensor to the network, required to be of rank 5. num_convolutions (int, optional): Number of convolutions per resolution scale. filters (tuple, optional): Number of filters for all convolutions at each resolution scale. strides (tuple, optional): Stride of the first convolution on a resolution scale. mode (TYPE, optional): One of the tf.estimator.ModeKeys strings: TRAIN, EVAL or PREDICT. use_bias (bool, optional): Boolean, whether the layer uses a bias. Returns: dict: dictionary of output tensors """ outputs = {} assert len(strides) == len(filters) assert len(inputs.get_shape().as_list()) == 5,\ 'inputs are required to have a rank of 5.' conv_op = tf.layers.conv3d conv_params = {'padding': 'same', 'use_bias': use_bias, 'kernel_initializer': tf.uniform_unit_scaling_initializer(), 'bias_initializer': tf.zeros_initializer(), 'kernel_regularizer': None, 'bias_regularizer': None} x = inputs tf.logging.info('Input tensor shape {}'.format(x.get_shape())) for res_scale in range(0, len(filters)): with tf.variable_scope('disc_unit_{}'.format(res_scale)): x = conv_op(inputs=x, filters=filters[res_scale], kernel_size=(3, 3, 3), strides=strides[res_scale], **conv_params) x = tf.layers.batch_normalization( x, training=mode == tf.estimator.ModeKeys.TRAIN) x = leaky_relu(x, 0.2) x_shape = x.get_shape().as_list() x = tf.reshape(x, (tf.shape(x)[0], np.prod(x_shape[1:]))) x = tf.layers.dense(inputs=x, units=1, use_bias=True, kernel_initializer=conv_params['kernel_initializer'], bias_initializer=conv_params['bias_initializer'], kernel_regularizer=conv_params['kernel_regularizer'], bias_regularizer=conv_params['bias_regularizer'], name='out') outputs['logits'] = x outputs['probs'] = tf.nn.sigmoid(x) outputs['pred'] = tf.cast((x > 0.5), tf.int32) return outputs