Blocks
DenseBlock
QuantizedNetworks.DenseBlock — TypeThe DenseBlock module defines a custom block structure for neural networks. It consists of a chain of layers, making it suitable for creating dense blocks in deep neural networks. Encapsulates functionality for quantized dense layers, batch normalization, and output quantization. It is defined to be a functor object.
Constructor
Constructor creates a DenseBlock object containing a chain of layers. It takes several optional arguments:
- (in, out) specifies the input and output dimensions.
- σ is an activation function (default is the identity function).
- weight_quantizer sets the quantizer for weights (default is a ternary quantizer).
- output_quantizer sets the quantizer for the layer's output (default is a sign quantizer).
- batchnorm determines whether batch normalization is applied (default is true).
It constructs a chain of layers including a quantized dense layer, optional batch normalization, and an output quantizer.
Standard Dense Layer
Flux.Dense — MethodThis function is overwritten from the Flux package converts a DenseBlock into a standard dense layer Flux.Dense with quantized weights, adjusted biases, and the specified output quantization.
Extractors serve the purpose of extracting specific components from a DenseBlock like:
extract_densefor quantized dense layer.extract_batchnormfor the optional batch normalization layer.extract_quantizerfor the output quantization function.
Examples
julia> using Random, QuantizedNetworks; Random.seed!(3);
julia> db = DenseBlock(2=>2)
DenseBlock(Chain(QuantizedDense(2 => 2; bias=false, quantizer=Ternary(0.05, STE(2))), BatchNorm(2), Sign(STE(2))))
julia> x = rand(Float32, 2, 4)
2×4 Matrix{Float32}:
0.940675 0.100403 0.789168 0.582228
0.999979 0.0921143 0.698426 0.496285
julia> db(x)
2×4 Matrix{Float32}:
-1.0 1.0 1.0 1.0
1.0 -1.0 -1.0 -1.0FeatureBlock
QuantizedNetworks.FeatureBlock — TypeA custom struct representing a feature block. Holds a collection of layers which include feature quantization layers and an optional quantizer and where each layer performs a specific operation on the input data. The struct is also a functor, so it can be used as a function.
Constructor
You specify the dimensionality of the input features dim and the number of quantization levels k. Additionally, you can choose to include an extra quantizer layer for handling missing data by setting output_missing to true. The quantizer argument lets you specify the quantization function to be used (with a default of Sign()), and any additional keyword arguments are passed to the FeatureQuantizer constructor.
Examples
julia> using Random, QuantizedNetworks; Random.seed!(3);
julia> fb = FeatureBlock(2, 2)
FeatureBlock(Parallel(vcat, FeatureQuantizer(2 => 4; quantizer=Sign(STE(2)))))
julia> x = rand(Float32, 2, 1)
2×1 Matrix{Float32}:
0.8521847
0.7965402
julia> fb(x)
4×1 Matrix{Float32}:
1.0
1.0
1.0
-1.0