code: public SDVariable softmaxCrossEntropy(String name, @NonNull SDVariable oneHotLabels, @NonNull SDVariable logitPredictions,
                                            SDVariable weights, @NonNull LossReduce lossReduce, double labelSmoothing) {
          validateFloatingPoint("softmax cross entropy loss", "predictions", logitPredictions);
          validateNumerical("softmax cross entropy loss", "oneHotLabels", oneHotLabels);
          if (weights == null)
              weights = sd.scalar(null, logitPredictions.dataType(), 1.0);
          SDVariable result = f().lossSoftmaxCrossEntropy(oneHotLabels, logitPredictions, weights, lossReduce, labelSmoothing);
          result = updateVariableNameAndReference(result, name);
          result.markAsLoss();
          return result;
      }
docs: Applies the softmax activation function to the input, then implement multi-class cross entropy:<br>
  {@code -sum_classes label[i] * log(p[c])} where {@code p = softmax(logits)}<br>
  If {@link LossReduce#NONE} is used, returned shape is [numExamples] out for [numExamples, numClasses] predicitons/labels;
  otherwise, the output is a scalar.<br>
  <p>
  When label smoothing is > 0, the following label smoothing is used:<br>
  <pre>
  {@code numClasses = labels.size(1);
  oneHotLabel = (1.0 - labelSmoothing) * oneHotLabels + labelSmoothing/numClasses}
  </pre>
  
  @param name             Name of the operation
  @param oneHotLabels     Label array. Should be one-hot per example and same shape as predictions (for example, [mb, nOut])
  @param logitPredictions Predictions array (pre-softmax)
  @param weights          Weights array. May be null. If null, a weight of 1.0 is used
  @param lossReduce       Reduction type for the loss. See {@link LossReduce} for more details. Default: {@link LossReduce#MEAN_BY_NONZERO_WEIGHT_COUNT}
  @param labelSmoothing   Label smoothing value. Default value: 0
  @return Loss variable