def shake_shake_train()

in jcm/models/wideresnet_noise_conditional.py [0:0]


def shake_shake_train(xa, xb, rng=None):
    """Shake-shake regularization in training mode.

    Shake-shake regularization interpolates between inputs A and B
    with *different* random uniform (per-sample) interpolation factors
    for the forward and backward/gradient passes.

    Args:
      xa: Input, branch A.
      xb: Input, branch B.
      rng: PRNG key.

    Returns:
      Mix of input branches.
    """
    if rng is None:
        rng = flax.nn.make_rng()
    gate_forward_key, gate_backward_key = jax.random.split(rng, num=2)
    gate_shape = (len(xa), 1, 1, 1)

    # Draw different interpolation factors (gate) for forward and backward pass.
    gate_forward = jax.random.uniform(
        gate_forward_key, gate_shape, dtype=jnp.float32, minval=0.0, maxval=1.0
    )
    gate_backward = jax.random.uniform(
        gate_backward_key, gate_shape, dtype=jnp.float32, minval=0.0, maxval=1.0
    )
    # Compute interpolated x for forward and backward.
    x_forward = xa * gate_forward + xb * (1.0 - gate_forward)
    x_backward = xa * gate_backward + xb * (1.0 - gate_backward)
    # Combine using stop_gradient.
    return x_backward + jax.lax.stop_gradient(x_forward - x_backward)