def _get_output_shape(rank, strides, padding, dilations, input_shape, output_size, filter_shape, output_padding): """Compute the `output_shape` and `strides` arg used by `conv_transpose`.""" if output_padding is None: output_padding = (None,) * rank else: output_padding = convolution_lib.prepare_tuple_argument( output_padding, rank, 'output_padding') for stride, out_pad in zip(strides, output_padding): if out_pad >= stride: raise ValueError('Stride {} must be greater than output ' 'padding {}.'.format(strides, output_padding)) assert len(filter_shape) == rank assert len(strides) == rank assert len(output_padding) == rank event_shape = [] for i in range(-rank, 0): event_shape.append(_deconv_output_length( input_shape[i - 1], filter_shape[i], padding=padding, output_padding=output_padding[i], stride=strides[i], dilation=dilations[i])) event_shape.append(output_size) batch_shape = input_shape[:-rank-1] output_shape = prefer_static.concat([batch_shape, event_shape], axis=0) strides = (1,) + strides + (1,) return output_shape, strides
def __init__( self, input_size, output_size, # keras::Conv::filters # ConvTranspose specific. filter_shape, # keras::Conv::kernel_size rank=2, # keras::Conv::rank strides=1, # keras::Conv::strides padding='VALID', # keras::Conv::padding; 'CAUSAL' not implemented. # keras::Conv::data_format is not implemented dilations=1, # keras::Conv::dilation_rate output_padding=None, # keras::Conv::output_padding # Weights make_kernel_bias_fn=nn_util_lib.make_kernel_bias, init_kernel_fn=None, # glorot_uniform init_bias_fn=tf.zeros, # Same as Keras. # Misc dtype=tf.float32, name=None): """Constructs layer. Note: `data_format` is not supported since all nn layers operate on the rightmost column. If your channel dimension is not rightmost, use `tf.transpose` before calling this layer. For example, if your channel dimension is second from the left, the following code will move it rightmost: ```python inputs = tf.transpose(inputs, tf.concat([ [0], tf.range(2, tf.rank(inputs)), [1]], axis=0)) ``` Args: input_size: ... In Keras, this argument is inferred from the rightmost input shape, i.e., `tf.shape(inputs)[-1]`. This argument specifies the size of the second from the rightmost dimension of both `inputs` and `kernel`. Default value: `None`. output_size: ... In Keras, this argument is called `filters`. This argument specifies the rightmost dimension size of both `kernel` and `bias`. filter_shape: ... In Keras, this argument is called `kernel_size`. This argument specifies the leftmost `rank` dimensions' sizes of `kernel`. rank: An integer, the rank of the convolution, e.g. "2" for 2D convolution. This argument implies the number of `kernel` dimensions, i.e.`, `kernel.shape.rank == rank + 2`. In Keras, this argument has the same name and semantics. Default value: `2`. strides: An integer or tuple/list of n integers, specifying the stride length of the convolution. In Keras, this argument has the same name and semantics. Default value: `1`. padding: One of `"VALID"` or `"SAME"` (case-insensitive). In Keras, this argument has the same name and semantics (except we don't support `"CAUSAL"`). Default value: `'VALID'`. dilations: An integer or tuple/list of `rank` integers, specifying the dilation rate to use for dilated convolution. Currently, specifying any `dilations` value != 1 is incompatible with specifying any `strides` value != 1. In Keras, this argument is called `dilation_rate`. Default value: `1`. output_padding: An `int` or length-`rank` tuple/list representing the amount of padding along the input spatial dimensions (e.g., depth, height, width). A single `int` indicates the same value for all spatial dimensions. The amount of output padding along a given dimension must be lower than the stride along that same dimension. If set to `None` (default), the output shape is inferred. In Keras, this argument has the same name and semantics. Default value: `None` (i.e., inferred). make_kernel_bias_fn: ... Default value: `nn.util.make_kernel_bias`. init_kernel_fn: ... Default value: `None` (i.e., `tf.initializers.glorot_uniform()`). init_bias_fn: ... Default value: `tf.zeros`. dtype: ... Default value: `tf.float32`. name: ... Default value: `None` (i.e., `'ConvolutionTranspose'`). """ filter_shape = convolution_lib.prepare_tuple_argument( filter_shape, rank, 'filter_shape') kernel_shape = filter_shape + (output_size, input_size) # Note transpose. kernel, bias = make_kernel_bias_fn( kernel_shape, [output_size], dtype, init_kernel_fn, init_bias_fn) super(ConvolutionTranspose, self).__init__( kernel=kernel, bias=bias, apply_kernel_fn=_make_convolution_transpose_fn( rank, strides, padding, dilations, filter_shape, output_size, output_padding), dtype=dtype, name=name)