class_docstr: This class defines core TCN architecture.
  This is only the base class, training strategy is not implemented.
docstr: Given the input placeholder x, build the entire TCN graph
  Args:
      x: Input placeholder
      last_timepoint: Whether or not to select only the last timepoint to output
  
  Returns:
      output of the TCN
docstr_tok: ["Given","the","input","placeholder","x",",","build","the","entire","TCN","graph","Args",":","x",":","Input","placeholder","last_timepoint",":","Whether","or","not","to","select","only","the","last","timepoint","to","output","Returns",":","output","of","the","TCN"]
code: def build_network_graph(self, x, last_timepoint=False):
      """
      Given the input placeholder x, build the entire TCN graph
      Args:
          x: Input placeholder
          last_timepoint: Whether or not to select only the last timepoint to output
  
      Returns:
          output of the TCN
      """
      # loop and define multiple residual blocks
      with tf.variable_scope("tcn"):
          for i in range(self.n_hidden_layers):
              dilation_size = 2**i
              in_channels = (
                  self.n_features_in
                  if i == 0
                  else self.hidden_sizes[i - 1]
              )
              out_channels = self.hidden_sizes[i]
              with tf.variable_scope("residual_block_" + str(i)):
                  x = self._residual_block(
                      x,
                      in_channels,
                      out_channels,
                      dilation_size,
                      (self.kernel_size - 1) * dilation_size,
                  )
                  x = tf.nn.relu(x)
              self.layer_activations.append(x)
          self.sequence_output = x
  
          # get outputs
          if not last_timepoint:
              prediction = self.sequence_output
          else:
              # last time point size (batch_size, hidden_sizes_encoder)
              width = self.sequence_output.shape[1].value
              lt = tf.squeeze(
                  tf.slice(
                      self.sequence_output,
                      [0, width - 1, 0],
                      [-1, 1, -1],
                  ),
                  axis=1,
              )
              prediction = tf.layers.Dense(
                  1,
                  kernel_initializer=tf.initializers.random_normal(
                      0, 0.01
                  ),
                  bias_initializer=tf.initializers.random_normal(
                      0, 0.01
                  ),
              )(lt)
  
      return prediction
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import tensorflow
  from tensorflow.python.framework import tensor_shape
  from tensorflow.python.keras.layers import Wrapper
  from tensorflow.python.layers.convolutional import Conv1D
  from tensorflow.python.ops import variable_scope
  from tensorflow.python.keras.engine.base_layer import Layer
  from tensorflow.python.eager import context
  from tensorflow.python.ops import nn_impl
  from tensorflow.python.keras import initializers
  from tensorflow.python.keras.engine.base_layer import InputSpec
  from tensorflow.python.ops import array_ops
  from tensorflow.python.framework import ops
label_desc: Use image node_id 3 for calling the TCN obj's underlying member method code with example usage: obj.build_network_graph(x, last_timepoint) and returns: prediction