docs: def _instantiate_layers(self):
      """Instantiates all the convolutional modules used in the network."""
  
      # Here we are entering the module's variable scope to name our submodules
      # correctly (not to create variables). As such it's safe to not check
      # whether we're in the same graph. This is important if we're constructing
      # the module in one graph and connecting it in another (e.g. with `defun`
      # the module is created in some default graph, and connected to a capturing
      # graph in order to turn it into a graph function).
      with self._enter_variable_scope(check_same_graph=False):
        self._layers = tuple(conv.Conv2D(name="conv_2d_{}".format(i),  # pylint: disable=g-complex-comprehension
                                         output_channels=self._output_channels[i],
                                         kernel_shape=self._kernel_shapes[i],
                                         stride=self._strides[i],
                                         rate=self._rates[i],
                                         padding=self._paddings[i],
                                         use_bias=self._use_bias[i],
                                         initializers=self._initializers,
                                         partitioners=self._partitioners,
                                         regularizers=self._regularizers,
                                         data_format=self._data_format)
                             for i in xrange(self._num_layers))