class_docstr: Deep torso for Atari, from the IMPALA paper.
code: def __init__(
      self,
      channels_per_group: Sequence[int] = (16, 32, 32),
      blocks_per_group: Sequence[int] = (2, 2, 2),
      downsampling_strategies: Sequence[resnet.DownsamplingStrategy] = (
          resnet.DownsamplingStrategy.CONV_MAX,
      )
      * 3,
      hidden_sizes: Sequence[int] = (256,),
      use_layer_norm: bool = False,
      name: str = "deep_atari_torso",
  ):
      super().__init__(name=name)
      self._use_layer_norm = use_layer_norm
      self.resnet = resnet.ResNetTorso(
          channels_per_group=channels_per_group,
          blocks_per_group=blocks_per_group,
          downsampling_strategies=downsampling_strategies,
          use_layer_norm=use_layer_norm,
      )
      # Make sure to activate the last layer as this torso is expected to feed
      # into the rest of a bigger network.
      self.mlp_head = hk.nets.MLP(
          output_sizes=hidden_sizes, activate_final=True
      )
  
imports: from typing import Any, Optional, Sequence, Tuple
  from acme.jax.networks import base
  from acme.jax.networks import duelling
  from acme.jax.networks import embedding
  from acme.jax.networks import policy_value
  from acme.jax.networks import resnet
  from acme.wrappers import observation_action_reward
  import haiku
  import jax
  import jax.numpy
label_desc: Use image node_id 1 to create a new DeepAtariTorso object from inherited base classes: hk with example: obj = DeepAtariTorso(channels_per_group, blocks_per_group, downsampling_strategies, hidden_sizes, use_layer_norm, name)