code: public SDVariable sigmoidCrossEntropy(String name, @NonNull SDVariable label, @NonNull SDVariable predictionLogits,
                                            SDVariable weights, @NonNull LossReduce lossReduce, double labelSmoothing) {
          validateFloatingPoint("sigmoid cross entropy loss", "predictions", predictionLogits);
          validateNumerical("sigmoid cross entropy loss", "labels", label);
          if (weights == null)
              weights = sd.scalar(null, predictionLogits.dataType(), 1.0);
          SDVariable result = f().lossSigmoidCrossEntropy(label, predictionLogits, weights, lossReduce, labelSmoothing);
          result = updateVariableNameAndReference(result, name);
          result.markAsLoss();
          return result;
      }
docs: Sigmoid cross entropy: applies the sigmoid activation function on the input logits (input "pre-sigmoid preductions")
  and implements the binary cross entropy loss function. This implementation is numerically more stable than using
  standard (but separate) sigmoid activation function and log loss (binary cross entropy) loss function.<br>
  Implements:
  {@code -1/numExamples * sum_i (labels[i] * log(sigmoid(logits[i])) + (1-labels[i]) * log(1-sigmoid(logits[i])))}
  though this is done in a mathematically equivalent but more numerical stable form.<br>
  <br>
  When label smoothing is > 0, the following label smoothing is used:<br>
  <pre>
  {@code numClasses = labels.size(1);
  label = (1.0 - labelSmoothing) * label + 0.5 * labelSmoothing}
  </pre>
  
  @param name             Name of the operation
  @param label            Label array
  @param predictionLogits Predictions array
  @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}
  @return Loss variable