code: def discriminator(self, frames):
      
      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))
docs: 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.