docs: def add_final_training_ops(self,
                               embeddings,
                               all_labels_count,
                               bottleneck_tensor_size,
                               hidden_layer_size=BOTTLENECK_TENSOR_SIZE / 4,
                               dropout_keep_prob=None):
      """Adds a new softmax and fully-connected layer for training.
  
       The set up for the softmax and fully-connected layers is based on:
       https://tensorflow.org/versions/master/tutorials/mnist/beginners/index.html
  
       This function can be customized to add arbitrary layers for
       application-specific requirements.
      Args:
        embeddings: The embedding (bottleneck) tensor.
        all_labels_count: The number of all labels including the default label.
        bottleneck_tensor_size: The number of embeddings.
        hidden_layer_size: The size of the hidden_layer. Roughtly, 1/4 of the
                           bottleneck tensor size.
        dropout_keep_prob: the percentage of activation values that are retained.
      Returns:
        softmax: The softmax or tensor. It stores the final scores.
        logits: The logits tensor.
      """
      with tf.name_scope('input'):
        bottleneck_input = tf.placeholder_with_default(
            embeddings,
            shape=[None, bottleneck_tensor_size],
            name='ReshapeSqueezed')
        bottleneck_with_no_gradient = tf.stop_gradient(bottleneck_input)
  
        with tf.name_scope('Wx_plus_b'):
          hidden = layers.fully_connected(bottleneck_with_no_gradient,
                                          hidden_layer_size)
          # We need a dropout when the size of the dataset is rather small.
          if dropout_keep_prob:
            hidden = tf.nn.dropout(hidden, dropout_keep_prob)
          logits = layers.fully_connected(
              hidden, all_labels_count, activation_fn=None)
  
      softmax = tf.nn.softmax(logits, name='softmax')
      return softmax, logits