o - i@sddlmZddlmZddlZddlZddlmZddl m Z m Z ddl m Z mZddlmZddlmZmZGdd d ejZdS) ) annotations)SequenceN) Convolution ResidualUnit)ActNorm)Reshape) ensure_tupleensure_tuple_repcsHeZdZdZddejejddfd!fdd Zd"ddZ d#dd Z Z S)$ GeneratoraV Defines a simple generator network accepting a latent vector and through a sequence of convolution layers constructs an output tensor of greater size and high dimensionality. The method `_get_layer` is used to create each of these layers, override this method to define layers beyond the default :py:class:`monai.networks.blocks.Convolution` or :py:class:`monai.networks.blocks.ResidualUnit` layers. The layers are constructed using the values in the `channels` and `strides` arguments, the number being defined by the length of these (which must match). Input is first passed through a :py:class:`torch.nn.Linear` layer to convert the input vector to an image tensor with dimensions `start_shape`. This passes through the convolution layers and is progressively upsampled if the `strides` values are greater than 1 using transpose convolutions. The size of the final output is defined by the `start_shape` dimension and the amount of upsampling done through strides. In the default definition the size of the output's spatial dimensions will be that of `start_shape` multiplied by the product of `strides`, thus the example network below upsamples an starting size of (64, 8, 8) to (1, 64, 64) since its `strides` are (2, 2, 2). Args: latent_shape: tuple of integers stating the dimension of the input latent vector (minus batch dimension) start_shape: tuple of integers stating the dimension of the tensor to pass to convolution subnetwork channels: tuple of integers stating the output channels of each convolutional layer strides: tuple of integers stating the stride (upscale factor) of each convolutional layer kernel_size: integer or tuple of integers stating size of convolutional kernels num_res_units: integer stating number of convolutions in residual units, 0 means no residual units act: name or type defining activation layers norm: name or type defining normalization layers dropout: optional float value in range [0, 1] stating dropout probability for layers, None for no dropout bias: boolean stating if convolution layers should have a bias component Examples:: # 3 layers, latent input vector of shape (42, 24), output volume of shape (1, 64, 64) net = Generator((42, 24), (64, 8, 8), (32, 16, 1), (2, 2, 2)) NT latent_shape Sequence[int] start_shapechannelsstrides kernel_sizeSequence[int] | int num_res_unitsintdropout float | NonebiasboolreturnNonec stt|^|_|_t|j|_t||_t||_t||_ t ||j|_ ||_ ||_ ||_| |_| |_t|_ttt|jtt||_t||_t|_|j} tt||D]!\} \} }| t|dk}|| | ||}|j d| || } qcdS)Nzlayer_%i)!super__init__r in_channelsrlen dimensionsrrrr rractnormrrnnFlattenflattenLinearrnpprodlinearrreshape Sequentialconv enumeratezip _get_layer add_module)selfrrrrrrr#r$rrechannelicsis_lastlayer __class___/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/networks/nets/generator.pyr=s.      $  zGenerator.__init__r out_channelsr8Convolution | nn.Sequentialc Csxt||d|p |jdk|j||j|j|j|j|jd }|jdkr:t||j||j||j|j|j|j|jd }t ||}|S)ad Returns a layer accepting inputs with `in_channels` number of channels and producing outputs of `out_channels` number of channels. The `strides` indicates upsampling factor, ie. transpose convolutional stride. If `is_last` is True this is the final layer and is not expected to include activation and normalization layers. Tr) r r is_transposed conv_only spatial_dimsr>rr#r$rr) r subunitslast_conv_onlyrBr>rr#r$rr) rrr"rr#r$rrrr%r-)r3r r>rr8r9rur<r<r=r1gs8    zGenerator._get_layerx torch.TensorcCs,||}||}||}||}|S)N)r'r+r,r.)r3rFr<r<r=forwards    zGenerator.forward)rrrrrrrrrrrrrrrrrr) r rr>rrrr8rrr?)rFrGrrG) __name__ __module__ __qualname____doc__rPRELUrINSTANCErr1rH __classcell__r<r<r:r=r s( *+r ) __future__rcollections.abcrnumpyr)torchtorch.nnr%monai.networks.blocksrrmonai.networks.layers.factoriesrr"monai.networks.layers.simplelayersr monai.utilsr r Moduler r<r<r<r=s