function broadcastNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon) {
	  if (epsilon === void 0) {
	    epsilon = 1e-3;
	  }

	  return tidy(function () {
	    var meanAndVariance = moments(x, reductionAxes);
	    var mean = meanAndVariance.mean;
	    var variance = meanAndVariance.variance;
	    var targetShape = [];

	    for (var _iterator = _createForOfIteratorHelperLoose(range$1(0, x.rank)), _step; !(_step = _iterator()).done;) {
	      var axis = _step.value;

	      if (reductionAxes.indexOf(axis) !== -1) {
	        targetShape.push(1);
	      } else {
	        targetShape.push(x.shape[axis]);
	      }
	    }

	    var broadcastMean = mean.reshape(targetShape);
	    var broadcastVariance = variance.reshape(targetShape);
	    var broadcastGamma = gamma == null ? null : gamma.reshape(targetShape);
	    var broadcastBeta = beta == null ? null : beta.reshape(targetShape);
	    var normed = batchNormalization(x, broadcastMean, broadcastVariance, broadcastBeta, broadcastGamma, epsilon);
	    return [normed, mean, variance];
	  });
	}
Broadcasting batch normalization for use in training (not inference).

The input is normalized to zero mean and unit variance along the
`reductionAxes`, followed by scaling with `gamma` and shifted by `beta`.
The result of that is returned as the first element
of the returned `Array`. The other two elements are the mean and variance,
respectively.

@param x Input tensor to be normalized.
@param gamma Tensor by which to scale the input.
@param beta Tensor by which to center the input.
@param reductionAxes Axes over which to normalize.
@param epsilon Fuzz factor.
@returns An `Array` of three `Tensors`:
  [normalized tensor, mean of input, variance of input].