https://github.com/nikitadurasov/masksembles
Official repository for the paper "Masksembles for Uncertainty Estimation" (CVPR 2021).
https://github.com/nikitadurasov/masksembles
computer-vision deep-learning out-of-distribution-detection paper tensorflow torch uncertainty-estimation uncertainty-neural-networks uncertainty-quantification
Last synced: 5 months ago
JSON representation
Official repository for the paper "Masksembles for Uncertainty Estimation" (CVPR 2021).
- Host: GitHub
- URL: https://github.com/nikitadurasov/masksembles
- Owner: nikitadurasov
- License: mit
- Created: 2021-03-03T21:35:47.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2025-11-09T13:32:03.000Z (7 months ago)
- Last Synced: 2025-11-09T15:14:39.929Z (7 months ago)
- Topics: computer-vision, deep-learning, out-of-distribution-detection, paper, tensorflow, torch, uncertainty-estimation, uncertainty-neural-networks, uncertainty-quantification
- Language: Python
- Homepage: https://www.norange.io/projects/masksembles/
- Size: 278 KB
- Stars: 102
- Watchers: 5
- Forks: 16
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Masksembles for Uncertainty Estimation

### [Project Page](https://nikitadurasov.github.io/projects/masksembles/) | [Paper](https://arxiv.org/abs/2012.08334) | [Video Explanation](https://www.youtube.com/watch?v=YWKVdn3kLp0)
[](https://colab.research.google.com/github/nikitadurasov/masksembles/blob/main/notebooks/MNIST_Masksembles.ipynb)
## Why Masksembles?
**Uncertainty Estimation** is one of the most important and critical tasks in the area of modern neural networks and deep learning.
There is a long list of potential applications of uncertainty: safety-critical applications, active learning, domain adaptation,
reinforcement learning and etc.
**Masksembles** is a **simple** and **easy-to-use** drop-in method with performance on par with Deep Ensembles at a fraction of the cost.
It makes *almost* no changes in your original model and requires only to add special intermediate layers.
[](https://youtu.be/YWKVdn3kLp0)
### [Watch this video on YouTube](https://youtu.be/YWKVdn3kLp0)
## Installation
To install this package, use:
```bash
pip install masksembles
```
or
```bash
pip install git+http://github.com/nikitadurasov/masksembles
```
In addition, Masksembles requires installing at least one of the backends: torch or tensorflow2 / keras.
Please follow official installation instructions for [torch](https://pytorch.org/) or [tensorflow](https://www.tensorflow.org/install)
accordingly.
## Usage
[comment]: <> (In masksembles module you could find implementations of "Masksembles{1|2|3}D" that)
[comment]: <> (support different shapes of input vectors (1, 2 and 3-dimentional accordingly))
This package provides implementations for `Masksembles{1|2|3}D` layers in `masksembles.{torch|keras}`
where `{1|2|3}` refers to dimensionality of input tensors (1-, 2- and 3-dimensional
accordingly).
* `Masksembles1D`: works with 1-dim inputs,`[B, C]` shaped tensors
* `Masksembles2D`: works with 2-dim inputs,`[B, H, W, C]` (keras) or `[B, C, H, W]` (torch) shaped tensors
* `Masksembles3D` : TBD
In a Nutshell, Masksembles applies binary masks to inputs via multiplying them both channel-wise. For more efficient
implementation we've followed approach similar to [this](https://arxiv.org/abs/2002.06715) one. Therefore, after inference
`outputs[:B // N]` - stores results for the first submodel, `outputs[B // N : 2 * B // N]` - for the second and etc.
### Torch
```python
import torch
from masksembles.torch import Masksembles1D
layer = Masksembles1D(10, 4, 2.)
layer(torch.ones([4, 10]))
```
```bash
tensor([[0., 1., 0., 0., 1., 0., 1., 1., 1., 1.],
[0., 0., 1., 1., 1., 1., 0., 0., 1., 1.],
[1., 0., 1., 1., 0., 0., 1., 0., 1., 1.],
[1., 0., 0., 1., 1., 1., 0., 1., 1., 0.]], dtype=torch.float64)
```
### Tensorflow / Keras
```python
import tensorflow as tf
from masksembles.keras import Masksembles1D
layer = Masksembles1D(4, 2.)
layer(tf.ones([4, 10]))
```
```bash
```
### Model example
```python
import tensorflow as tf
from masksembles.keras import Masksembles1D, Masksembles2D
model = keras.Sequential(
[
keras.Input(shape=input_shape),
layers.Conv2D(32, kernel_size=(3, 3), activation="elu"),
Masksembles2D(4, 2.0),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, kernel_size=(3, 3), activation="elu"),
Masksembles2D(4, 2.0),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
Masksembles1D(4, 2.),
layers.Dense(num_classes, activation="softmax"),
]
)
```
## Citation
If you found this work useful for your projects, please don't forget to cite it.
```
@inproceedings{Durasov21,
author = {N. Durasov and T. Bagautdinov and P. Baque and P. Fua},
title = {{Masksembles for Uncertainty Estimation}},
booktitle = CVPR,
year = 2021
}
```