class_docstr: Two-Stream Adaptive Graph Convolutional Network.
  
  For details see this paper: `"Two-Stream Adaptive Graph Convolutional Networks for
  Skeleton-Based Action Recognition." <https://arxiv.org/abs/1805.07694>`_.
  This implementation is based on the authors Github Repo https://github.com/lshiwjx/2s-AGCN.
  It's used by the author for classifying actions from sequences of 3D body joint coordinates.
  
  Args:
      in_channels (int): Number of input features.
      out_channels (int): Number of output features.
      edge_index (PyTorch LongTensor): Graph edge indices.
      num_nodes (int): Number of nodes in the network.
      stride (int, optional): Time strides during temporal convolution. (default: :obj:`1`)
      residual (bool, optional): Applying residual connection. (default: :obj:`True`)
      adaptive (bool, optional): Adaptive node connection weights. (default: :obj:`True`)
      attention (bool, optional): Applying spatial-temporal-channel-attention.
      (default: :obj:`True`)
class_docstr_tok: ["Two-Stream","Adaptive","Graph","Convolutional","Network",".","For","details","see","this","paper",":","`","``","Two-Stream","Adaptive","Graph","Convolutional","Networks","for","Skeleton-Based","Action","Recognition",".","''","<","https",":","\/\/arxiv.org\/abs\/1805.07694",">","`","_",".","This","implementation","is","based","on","the","authors","Github","Repo","https",":","\/\/github.com\/lshiwjx\/2s-AGCN",".","It","'s","used","by","the","author","for","classifying","actions","from","sequences","of","3D","body","joint","coordinates",".","Args",":","in_channels","(","int",")",":","Number","of","input","features",".","out_channels","(","int",")",":","Number","of","output","features",".","edge_index","(","PyTorch","LongTensor",")",":","Graph","edge","indices",".","num_nodes","(","int",")",":","Number","of","nodes","in","the","network",".","stride","(","int",",","optional",")",":","Time","strides","during","temporal","convolution",".","(","default",":",":","obj",":","`","1","`",")","residual","(","bool",",","optional",")",":","Applying","residual","connection",".","(","default",":",":","obj",":","`","True","`",")","adaptive","(","bool",",","optional",")",":","Adaptive","node","connection","weights",".","(","default",":",":","obj",":","`","True","`",")","attention","(","bool",",","optional",")",":","Applying","spatial-temporal-channel-attention",".","(","default",":",":","obj",":","`","True","`",")"]
code: def __init__(
      self,
      in_channels: int,
      out_channels: int,
      edge_index: torch.LongTensor,
      num_nodes: int,
      stride: int = 1,
      residual: bool = True,
      adaptive: bool = True,
      attention: bool = True,
  ):
      super(AAGCN, self).__init__()
      self.edge_index = edge_index
      self.num_nodes = num_nodes
  
      self.graph = GraphAAGCN(self.edge_index, self.num_nodes)
      self.A = self.graph.A
  
      self.gcn1 = UnitGCN(
          in_channels,
          out_channels,
          self.A,
          adaptive=adaptive,
          attention=attention,
      )
      self.tcn1 = UnitTCN(out_channels, out_channels, stride=stride)
      self.relu = nn.ReLU(inplace=True)
      self.attention = attention
  
      if not residual:
          self.residual = lambda x: 0
  
      elif (in_channels == out_channels) and (stride == 1):
          self.residual = lambda x: x
  
      else:
          self.residual = UnitTCN(
              in_channels, out_channels, kernel_size=1, stride=stride
          )
  
imports: import math
  import torch
  import numpy
  import torch.nn
  from torch.autograd import Variable
  from torch_geometric.utils.to_dense_adj import to_dense_adj
  import torch.nn.functional
label_desc: Use image node_id 1 to create a new AAGCN object from inherited base classes: nn with example: obj = AAGCN(in_channels, out_channels, edge_index, num_nodes, stride, residual, adaptive, attention)