class_docstr: Main function for Stochastic Adversarial Video Prediction.
docstr: 3-D SNGAN discriminator.
  
  Args:
    frames: a list of batch-major tensors indexed by time.
  
  Returns:
    logits: 1-D Tensor with shape=batch_size.
            Positive logits imply that the discriminator thinks that it
            belongs to the true class.
docstr_tok: ["3-D","SNGAN","discriminator",".","Args",":","frames",":","a","list","of","batch-major","tensors","indexed","by","time",".","Returns",":","logits",":","1-D","Tensor","with","shape=batch_size",".","Positive","logits","imply","that","the","discriminator","thinks","that","it","belongs","to","the","true","class","."]
code: def discriminator(self, frames):
      """3-D SNGAN discriminator.
  
      Args:
        frames: a list of batch-major tensors indexed by time.
  
      Returns:
        logits: 1-D Tensor with shape=batch_size.
                Positive logits imply that the discriminator thinks that it
                belongs to the true class.
      """
      ndf = self.hparams.num_discriminator_filters
      frames = tf.stack(frames)
  
      # Switch from time-major axis to batch-major axis.
      frames = common_video.swap_time_and_batch_axes(frames)
  
      # 3-D Conv-net mapping inputs to activations.
      num_outputs = [
          ndf,
          ndf * 2,
          ndf * 2,
          ndf * 4,
          ndf * 4,
          ndf * 8,
          ndf * 8,
      ]
      kernel_sizes = [3, 4, 3, 4, 3, 4, 3]
      strides = [
          [1, 1, 1],
          [1, 2, 2],
          [1, 1, 1],
          [1, 2, 2],
          [1, 1, 1],
          [2, 2, 2],
          [1, 1, 1],
      ]
  
      names = [
          "video_sn_conv0_0",
          "video_sn_conv0_1",
          "video_sn_conv1_0",
          "video_sn_conv1_1",
          "video_sn_conv2_0",
          "video_sn_conv2_1",
          "video_sn_conv3_0",
      ]
      iterable = zip(num_outputs, kernel_sizes, strides, names)
      activations = frames
      for num_filters, kernel_size, stride, name in iterable:
          activations = self.pad_conv3d_lrelu(
              activations, num_filters, kernel_size, stride, name
          )
      num_fc_dimensions = self.get_fc_dimensions(strides, kernel_sizes)
      activations = tf.reshape(activations, (-1, num_fc_dimensions))
      return tf.squeeze(tf.layers.dense(activations, 1))
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import numbers
  import numpy
  from tensor2tensor.layers import common_layers
  from tensor2tensor.layers import common_video
  from tensor2tensor.models.video import savp_params
  from tensor2tensor.models.video import sv2p
  from tensor2tensor.utils import contrib
  from tensor2tensor.utils import registry
  from tensor2tensor.utils import update_ops_hook
  import tensorflow.compat.v1
  from tensorflow.compat.v1 import estimator
  import tensorflow_gan
label_desc: Use image node_id 4 for calling the NextFrameSavpBase obj's underlying member method code with example usage: obj.discriminator(frames) and returns: tf