class_docstr: A block containing multiple subsequent strided convolutions
  followed by flattening and a dense layer block.
  
  For details on the convolution part see
  :class:`~maze.perception.blocks.feed_forward.strided_conv.StridedConvolutionBlock`.
  For details on flattening see :class:`~maze.perception.blocks.general.flatten.FlattenBlock`.
  For details on dense layers see :class:`~maze.perception.blocks.feed_forward.dense.DenseBlock`.
  
  :param in_keys: One key identifying the input tensors.
  :param out_keys: One key identifying the output tensors.
  :param in_shapes: List of input shapes.
  :param hidden_channels: List containing the number of hidden channels for hidden layers.
  :param hidden_kernels: List containing the size of the convolving kernels.
  :param convolution_dimension: Dimension of the convolution to use [1, 2, 3]
  :param hidden_strides: List containing the strides of the convolutions.
  :param hidden_dilations: List containing the spacing between kernel elements.
  :param hidden_padding: List containing the padding added to both sides of the input
  :param padding_mode: 'zeros', 'reflect', 'replicate' or 'circular'.
  :param hidden_units: List containing the number of hidden units for hidden layers.
  :param non_lin: The non-linearity to apply after each layer.
class_docstr_tok: ["A","block","containing","multiple","subsequent","strided","convolutions","followed","by","flattening","and","a","dense","layer","block",".","For","details","on","the","convolution","part","see",":","class",":","`","~maze.perception.blocks.feed_forward.strided_conv.StridedConvolutionBlock","`",".","For","details","on","flattening","see",":","class",":","`","~maze.perception.blocks.general.flatten.FlattenBlock","`",".","For","details","on","dense","layers","see",":","class",":","`","~maze.perception.blocks.feed_forward.dense.DenseBlock","`",".",":","param","in_keys",":","One","key","identifying","the","input","tensors",".",":","param","out_keys",":","One","key","identifying","the","output","tensors",".",":","param","in_shapes",":","List","of","input","shapes",".",":","param","hidden_channels",":","List","containing","the","number","of","hidden","channels","for","hidden","layers",".",":","param","hidden_kernels",":","List","containing","the","size","of","the","convolving","kernels",".",":","param","convolution_dimension",":","Dimension","of","the","convolution","to","use","[","1",",","2",",","3","]",":","param","hidden_strides",":","List","containing","the","strides","of","the","convolutions",".",":","param","hidden_dilations",":","List","containing","the","spacing","between","kernel","elements",".",":","param","hidden_padding",":","List","containing","the","padding","added","to","both","sides","of","the","input",":","param","padding_mode",":","'zeros","'",",","'reflect","'",",","'replicate","'","or","'circular","'",".",":","param","hidden_units",":","List","containing","the","number","of","hidden","units","for","hidden","layers",".",":","param","non_lin",":","The","non-linearity","to","apply","after","each","layer","."]
code: def __repr__(self):
      txt = f"{self.__class__.__name__}:"
      txt += f"\n\n{str(self.conv_block)}"
      txt += f"\n\n{str(self.flatten_block)}"
      txt += f"\n\n{str(self.dense_block)}"
      return txt
  
file_path: maze/maze/perception/blocks/joint_blocks/strided_conv_dense.py
imports: from typing import Union, List, Sequence, Dict, Tuple, Optional
  import torch
  from torch import nn
  from maze.core.annotations import override
  from maze.perception.blocks.base import PerceptionBlock
  from maze.perception.blocks.feed_forward.dense import DenseBlock
  from maze.perception.blocks.feed_forward.strided_conv import StridedConvolutionBlock
  from maze.perception.blocks.general.flatten import FlattenBlock
label_desc: Use image node_id 3 for calling the StridedConvolutionDenseBlock obj's underlying member method code with example usage: obj.__repr__() and returns: txt