Struct dfdx::nn::modules::BatchNorm2D

source ·
pub struct BatchNorm2D<const C: usize, E: Dtype, D: Storage<E>> {
    pub scale: Tensor<Rank1<C>, E, D>,
    pub bias: Tensor<Rank1<C>, E, D>,
    pub running_mean: Tensor<Rank1<C>, E, D>,
    pub running_var: Tensor<Rank1<C>, E, D>,
    pub epsilon: f64,
    pub momentum: f64,
}
Expand description

Batch normalization for images as described in Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Generics:

  • C the size of the spatial dimension to reduce. For 3d tensors this is the 0th dimension. For 4d tensors, this is the 1st dimension.

Training vs Inference

BatchNorm2D supports the following cases (see sections below for more details):

  1. Training: ModuleMut and OwnedTape on the input tensor
  2. Inference: Module and NoneTape on the input tensor.

NOTE: ModuleMut/NoneTape, and Module/OwnedTape will fail to compile.

Examples:

type Model = BatchNorm2D<3>;
let bn = dev.build_module::<Model, f32>();
let _ = bn.forward(dev.zeros::<Rank3<3, 2, 2>>());
let _ = bn.forward(dev.zeros::<Rank4<4, 3, 2, 2>>());

Training

  • Running statistics: updated with momentum
  • Normalization: calculated using batch stats

Inference

  • Running statistics: not updated
  • Normalization: calculated using running stats

Fields§

§scale: Tensor<Rank1<C>, E, D>

Scale for affine transform. Defaults to 1.0

§bias: Tensor<Rank1<C>, E, D>

Bias for affine transform. Defaults to 0.0

§running_mean: Tensor<Rank1<C>, E, D>

Spatial mean that is updated during training. Defaults to 0.0

§running_var: Tensor<Rank1<C>, E, D>

Spatial variance that is updated during training. Defaults to 1.0

§epsilon: f64

Added to variance before taking sqrt for numerical stability. Defaults to 1e-5

§momentum: f64

Controls exponential moving average of running stats.Defaults to 0.1

running_stat * (1.0 - momentum) + stat * momentum.

Trait Implementations§

source§

impl<const C: usize, E: Clone + Dtype, D: Clone + Storage<E>> Clone for BatchNorm2D<C, E, D>

source§

fn clone(&self) -> BatchNorm2D<C, E, D>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<const C: usize, E: Debug + Dtype, D: Debug + Storage<E>> Debug for BatchNorm2D<C, E, D>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<B: Dim, const C: usize, H: Dim, W: Dim, E: Dtype, D: Device<E>> Module<Tensor<(B, Const<C>, H, W), E, D, NoneTape>> for BatchNorm2D<C, E, D>

source§

fn try_forward( &self, x: Tensor<(B, Const<C>, H, W), E, D, NoneTape> ) -> Result<Self::Output, D::Err>

Inference 4d forward - does not update Self::running_mean and Self::running_var

§

type Output = Tensor<(B, Const<C>, H, W), E, D, NoneTape>

The type that this unit produces given Input.
§

type Error = <D as HasErr>::Err

source§

fn forward(&self, input: Input) -> Self::Output

Forward Input through the module and produce Module::Output. Read more
source§

impl<const C: usize, H: Dim, W: Dim, E: Dtype, D: Device<E>> Module<Tensor<(Const<C>, H, W), E, D, NoneTape>> for BatchNorm2D<C, E, D>

source§

fn try_forward( &self, x: Tensor<(Const<C>, H, W), E, D, NoneTape> ) -> Result<Self::Output, D::Err>

Inference 3d forward - does not update Self::running_mean and Self::running_var

§

type Output = Tensor<(Const<C>, H, W), E, D, NoneTape>

The type that this unit produces given Input.
§

type Error = <D as HasErr>::Err

source§

fn forward(&self, input: Input) -> Self::Output

Forward Input through the module and produce Module::Output. Read more
source§

impl<B: Dim, const C: usize, H: Dim, W: Dim, E: Dtype, D: Device<E>> ModuleMut<Tensor<(B, Const<C>, H, W), E, D, OwnedTape<E, D>>> for BatchNorm2D<C, E, D>

source§

fn try_forward_mut( &mut self, x: Tensor<(B, Const<C>, H, W), E, D, OwnedTape<E, D>> ) -> Result<Self::Output, D::Err>

Training 4d forward - updates Self::running_mean and Self::running_var

§

type Output = Tensor<(B, Const<C>, H, W), E, D, OwnedTape<E, D>>

The type that this unit produces given Input.
§

type Error = <D as HasErr>::Err

source§

fn forward_mut(&mut self, input: Input) -> Self::Output

Forward Input through the module and produce ModuleMut::Output. Read more
source§

impl<const C: usize, H: Dim, W: Dim, E: Dtype, D: Device<E>> ModuleMut<Tensor<(Const<C>, H, W), E, D, OwnedTape<E, D>>> for BatchNorm2D<C, E, D>

source§

fn try_forward_mut( &mut self, x: Tensor<(Const<C>, H, W), E, D, OwnedTape<E, D>> ) -> Result<Self::Output, D::Err>

Training 3d forward - updates Self::running_mean and Self::running_var

§

type Output = Tensor<(Const<C>, H, W), E, D, OwnedTape<E, D>>

The type that this unit produces given Input.
§

type Error = <D as HasErr>::Err

source§

fn forward_mut(&mut self, input: Input) -> Self::Output

Forward Input through the module and produce ModuleMut::Output. Read more
source§

impl<const C: usize, E: Dtype, D: Device<E>> TensorCollection<E, D> for BatchNorm2D<C, E, D>

§

type To<E2: Dtype, D2: Device<E2>> = BatchNorm2D<C, E2, D2>

Type alias that specifies the how a module’s type changes when using a different dtype and/or device.
source§

fn iter_tensors<V: ModuleVisitor<Self, E, D>>( visitor: &mut V ) -> Result<Option<Self::To<V::E2, V::D2>>, V::Err>

Specifies how to iterate through tensors or modules containted within this module, and how to contruct this module given values for its fields. Returns Err(_) to indicate an error, Ok(None) to indicate that there is no error and a module has not been built, and Ok(Some(_)) contains Self::Output<E2, D2>
source§

fn module<F1, F2, Field>( name: &str, get_ref: F1, get_mut: F2 ) -> ModuleField<'_, F1, F2, Self, Field>where F1: FnMut(&Self) -> &Field, F2: FnMut(&mut Self) -> &mut Field, Field: TensorCollection<E, D>,

Creates a ModuleFields that represents a field that may contain one or more tensors. Read more
source§

fn tensor<F1, F2, S>( name: &str, get_ref: F1, get_mut: F2, options: TensorOptions<S, E, D> ) -> TensorField<'_, F1, F2, Self, S, E, D>where F1: FnMut(&Self) -> &Tensor<S, E, D>, F2: FnMut(&mut Self) -> &mut Tensor<S, E, D>, S: Shape,

Creates a ModuleFields that represents a tensor field. Read more
source§

fn scalar<F1, F2, N>( name: &str, get_ref: F1, get_mut: F2, options: ScalarOptions<N> ) -> ScalarField<'_, F1, F2, Self, N>where F1: FnMut(&Self) -> &N, F2: FnMut(&mut Self) -> &mut N, N: NumCast,

Creates a ModuleFields that represents a scalar field. Read more

Auto Trait Implementations§

§

impl<const C: usize, E, D> RefUnwindSafe for BatchNorm2D<C, E, D>where D: RefUnwindSafe, <D as Storage<E>>::Vec: RefUnwindSafe,

§

impl<const C: usize, E, D> Send for BatchNorm2D<C, E, D>where D: Send,

§

impl<const C: usize, E, D> Sync for BatchNorm2D<C, E, D>where D: Sync,

§

impl<const C: usize, E, D> Unpin for BatchNorm2D<C, E, D>where D: Unpin,

§

impl<const C: usize, E, D> UnwindSafe for BatchNorm2D<C, E, D>where D: UnwindSafe, <D as Storage<E>>::Vec: RefUnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<D, E, M> BuildModule<D, E> for Mwhere D: Device<E>, E: Dtype, M: TensorCollection<E, D, To<E, D> = M>,

source§

fn build(device: &D) -> Self

Construct it on the device
source§

fn try_build(device: &D) -> Result<Self, D::Err>

Fallible version of BuildModule::build
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<E, D, T> LoadFromNpz<E, D> for Twhere E: Dtype + NumpyDtype, D: Device<E>, T: TensorCollection<E, D>,

source§

fn load<P: AsRef<Path>>(&mut self, path: P) -> Result<(), NpzError>

Loads data from a .npz zip archive at the specified path. Read more
source§

fn read<R>(&mut self, r: &mut ZipArchive<R>) -> Result<(), NpzError>where R: Read + Seek,

Reads this object from a ZipArchive. r with a base filename of filename_prefix. Read more
source§

impl<E, D, T> LoadFromSafetensors<E, D> for Twhere E: Dtype + SafeDtype, D: Device<E>, T: TensorCollection<E, D>,

source§

fn load_safetensors<P: AsRef<Path>>(&mut self, path: P) -> Result<(), Error>

Loads data from a .safetensors at the specified path. Read more
source§

impl<E, D, M> ModelEMA<E, D> for Mwhere E: Dtype, D: Device<E>, M: TensorCollection<E, D>,

source§

fn ema(&mut self, other: &Self, decay: impl Into<f64>)

Does `self = self * decay + other * (1 - decay), using crate::tensor_ops::axpy() on parameters. Read more
source§

fn try_ema(&mut self, other: &Self, decay: impl Into<f64>) -> Result<(), D::Err>

source§

impl<E, D, M> NumParams<E, D> for Mwhere E: Dtype, D: Device<E>, M: TensorCollection<E, D>,

source§

fn num_trainable_params(&self) -> usize

Returns the number of trainable params in any model.
§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<E, D, M> ResetParams<E, D> for Mwhere E: Dtype, D: Device<E>, M: TensorCollection<E, D>,

source§

fn reset_params(&mut self)

Reset all a model’s parameters.
source§

fn try_reset_params(&mut self) -> Result<(), D::Err>

Reset all a model’s parameters.
source§

impl<E, D, T> SaveToNpz<E, D> for Twhere E: Dtype + NumpyDtype, D: Device<E>, T: TensorCollection<E, D>,

source§

fn save<P: AsRef<Path>>(&self, path: P) -> ZipResult<()>

Save this object into the .npz file determined located at path. Read more
source§

fn write<W>(&self, w: &mut ZipWriter<W>) -> ZipResult<()>where W: Write + Seek,

Write this object into ZipWriter w with a base filename of filename_prefix. Read more
source§

impl<E, D, T> SaveToSafetensors<E, D> for Twhere E: Dtype + SafeDtype, D: Device<E>, T: TensorCollection<E, D>,

source§

fn save_safetensors<P: AsRef<Path>>( &self, path: P ) -> Result<(), SafeTensorError>

Save this object into the .safetensors file determined located at path. Read more
source§

impl<E, D1, D2, T> ToDevice<E, D1, D2> for Twhere E: Dtype, D1: Device<E>, D2: Device<E>, T: TensorCollection<E, D1>,

source§

fn try_to_device(&self, device: &D2) -> Result<Self::To<E, D2>, D2::Err>

Fallible version of ToDevice::to_device
source§

fn to_device(&self, device: &D2) -> Self::To<E, D2>

Copy self from D1 to D2
source§

impl<E1, D, T> ToDtype<E1, D> for Twhere E1: Dtype, D: Device<E1>, T: TensorCollection<E1, D>,

source§

fn try_to_dtype<E2: Dtype>(&self) -> Result<Self::To<E2, D>, D::Err>where D: Device<E2> + ToDtypeKernel<E1, E2>,

Fallible version of ToDtype::to_dtype
source§

fn to_dtype<E2: Dtype>(&self) -> Self::To<E2, D>where D: Device<E2> + ToDtypeKernel<E1, E2>,

Create a copy of self with dtype E2
source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<E, D, M> ZeroGrads<E, D> for Mwhere E: Dtype, D: Device<E>, M: TensorCollection<E, D>,

source§

fn alloc_grads(&self) -> Gradients<E, D>

Allocates gradients for this tensor collection. This marks all other gradients as temporary, so they are dropped after .backward()
source§

fn try_alloc_grads(&self) -> Result<Gradients<E, D>, D::Err>

Allocates gradients for this tensor collection. This marks all other gradients as temporary, so they are dropped after .backward()
source§

fn zero_grads(&self, gradients: &mut Gradients<E, D>)

Zero’s any gradients associated with self.
source§

fn try_zero_grads(&self, gradients: &mut Gradients<E, D>) -> Result<(), D::Err>

Zero’s any gradients associated with self.