     }
 
     @differentiable(wrt: (self, input))
-    func applyTraining(to input: Tensor<Scalar>) -> Tensor<Scalar> {
-        return input.droppedOut(withProbability: probability)
-    }
-
-    @differentiable(wrt: (self, input))
-    func applyInference(to input: Tensor<Scalar>) -> Tensor<Scalar> {
+    private func applyTraining(to input: Tensor<Scalar>) -> Tensor<Scalar> {
+        return input.droppingOut(probability: probability)
+    }
+
+    @differentiable(wrt: (self, input))
+    private func applyInference(to input: Tensor<Scalar>) -> Tensor<Scalar> {
         return input
     }
 

}

public extension Tensor where Scalar : BinaryFloatingPoint,
                       Scalar.RawSignificand : FixedWidthInteger {
    @differentiable(wrt: (self) where Scalar : Differentiable)
    func droppedOut(withProbability probability: Double) -> Tensor {
        let noise = Tensor(randomUniform: shape)
        let keepMask = noise .>= Scalar(probability)
        let keepProbability = Scalar(1.0 - probability)

/// need to be toggled or threaded through in more than one place.
public class LearningPhaseIndicator {
    public var training: Bool = true
    public init() { }
}

/// A mutable, shareable reference to a tensor
