Nous introduisons des réseaux de neurones convolutionnels bayésiens avec une inférence variationnelle , une variante des réseaux de neurones convolutionnels (CNN), dans lesquels les distributions de probabilité postérieure intraitables sont déduites par Bayes par backprop . Nous démontrons comment notre méthode d'inférence variationnelle proposée réalise des performances équivalentes à l'inférence fréquente dans des architectures identiques sur plusieurs ensembles de données (MNIST, CIFAR10, CIFAR100) comme décrit dans l'article.


Ce référentiel contient deux types d'implémentation bayésienne Lauer:
BBB (Bayes by backprop):
Basé sur ce document. Cette couche échantillonne tous les poids individuellement, puis les combine avec les entrées pour calculer un échantillon à partir des activations.
BBB_LRT (Bayes by backprop avec astuce de réparamétrisation locale):
Cette couche combine Bayes par rétroproppe avec une astuce de réparamétrisation locale de cet article. Cette astuce permet d'échantillonner directement à partir de la distribution sur les activations.
Pour créer un réseau bayésien personnalisé, hériter layers.misc.ModuleWrapper au lieu de torch.nn.Module et utilisez BBBLinear et BBBConv2d à partir de l'une des couches données ( BBB ou BBB_LRT ) au lieu de torch.nn.Linear et torch.nn.Conv2d . De plus, pas besoin de définir la méthode forward . Il sera automatiquement pris en charge par ModuleWrapper .
Par exemple:
class Net ( nn . Module ):
def __init__ ( self ):
super (). __init__ ()
self . conv = nn . Conv2d ( 3 , 16 , 5 , strides = 2 )
self . bn = nn . BatchNorm2d ( 16 )
self . relu = nn . ReLU ()
self . fc = nn . Linear ( 800 , 10 )
def forward ( self , x ):
x = self . conv ( x )
x = self . bn ( x )
x = self . relu ( x )
x = x . view ( - 1 , 800 )
x = self . fc ( x )
return xLe réseau ci-dessus peut être converti en bayésien comme suit:
class Net ( ModuleWrapper ):
def __init__ ( self ):
super (). __init__ ()
self . conv = BBBConv2d ( 3 , 16 , 5 , strides = 2 )
self . bn = nn . BatchNorm2d ( 16 )
self . relu = nn . ReLU ()
self . flatten = FlattenLayer ( 800 )
self . fc = BBBLinear ( 800 , 10 )FlattenLayer avant le premier bloc BBBLinear .forward du modèle renverra un tuple As (logits, kl) .priors peuvent être transmis comme argument aux couches. La valeur par défaut est: priors = {
'prior_mu' : 0 ,
'prior_sigma' : 0.1 ,
'posterior_mu_initial' : ( 0 , 0.1 ), # (mean, std) normal_
'posterior_rho_initial' : ( - 3 , 0.1 ), # (mean, std) normal_
}Actuellement, les ensembles de données et les modèles suivants sont pris en charge.
python main_bayesian.py
config_bayesian.py python main_frequentist.py
config_frequentist.py layers/ : Contient ModuleWrapper , FlattenLayer , BBBLinear et BBBConv2d .
models/BayesianModels/ : Contient des modèles bayésiens standard (BBBLENET, BBBALEXNET, BBB3CONV3FC).
models/NonBayesianModels/ : contient des modèles non bayésiens standard (LENET, Alexnet).
checkpoints/ : répertoire de point de contrôle: les modèles seront enregistrés ici.
tests/ : Basic Unittest Cases pour les couches et les modèles.
main_bayesian.py : entraîner et évaluer les modèles bayésiens.
config_bayesian.py : hyperparamètres pour le fichier main_bayesian .
main_frequentist.py : entraîner et évaluer les modèles non bayésiens (fréquentistes).
config_frequentist.py : hyperparamètres pour le fichier main_frequentist .
Il existe deux types d'incertitudes: aléatorique et épistémique .
L'incertitude aléatorique est une mesure de la variation des données et l'incertitude épistémique est causée par le modèle.
Ici, deux méthodes sont fournies dans uncertainty_estimation.py , ce sont 'softmax' et 'normalized' et sont respectivement basées sur l'équation 4 de cet article et l'équation 15 de cet article.
En outre, uncertainty_estimation.py peut être utilisé pour comparer les incertitudes par un réseau neuronal bayésien sur MNIST et notMNIST DataSet. Vous pouvez fournir des arguments comme:
net_type : lenet , alexnet ou 3conv3fc . La valeur par défaut est lenet .weights_path : poids pour le net_type donné. La valeur par défaut est 'checkpoints/MNIST/bayesian/model_lenet.pt' .not_mnist_dir : répertoire de l'ensemble de données notMNIST . La valeur par défaut est 'data' .num_batches : Nombre de lots pour lesquels les incertitudes doivent être calculées.Notes :
layer_type et activation_type utilisés dans uncertainty_etimation.py doivent être définis à partir de config_bayesian.py afin de correspondre aux poids fournis.Si vous utilisez ce travail, veuillez citer:
@article{shridhar2019comprehensive,
title={A comprehensive guide to bayesian convolutional neural network with variational inference},
author={Shridhar, Kumar and Laumann, Felix and Liwicki, Marcus},
journal={arXiv preprint arXiv:1901.02731},
year={2019}
}
@article{shridhar2018uncertainty,
title={Uncertainty estimations by softplus normalization in bayesian convolutional neural networks with variational inference},
author={Shridhar, Kumar and Laumann, Felix and Liwicki, Marcus},
journal={arXiv preprint arXiv:1806.05978},
year={2018}
}
}