Wir stellen bayes'sche Faltungsnetzwerke mit variatorischer Inferenz ein, eine Variante von Faltungsnetzwerken (CNNs), bei denen die unlösbaren posterioren Wahrscheinlichkeitsverteilungen über Gewichte durch Bayes durch Backprop abgeleitet werden. Wir zeigen, wie unsere vorgeschlagene Variationsinferenzmethode Performances erreicht, die der häufigen Inferenz in identischen Architekturen auf mehreren Datensätzen (MNIST, CIFAR10, CIFAR100) entsprechen, wie in dem Papier beschrieben.


Dieses Repository enthält zwei Arten von Bayesian Lauer -Implementierung:
BBB (Bayes by Backprop):
Basierend auf diesem Papier. Diese Schicht probiert alle Gewichte einzeln ab und kombiniert sie dann mit den Eingängen, um eine Probe aus den Aktivierungen zu berechnen.
BBB_LRT (Bayes von Backprop mit lokalem Reparametrisierungstrick):
Diese Schicht kombiniert Bayes per Backprop mit lokalem Reparametrisierungstrick aus diesem Papier. Dieser Trick ermöglicht es, die Verteilung über Aktivierungen direkt zu probieren.
Um ein benutzerdefiniertes Bayesian -Netzwerk zu erstellen, inerit layers.misc.ModuleWrapper anstelle von torch.nn.Module und verwenden Sie BBBLinear und BBBConv2d aus einer der angegebenen Ebenen ( BBB oder BBB_LRT ) anstelle von torch.nn.Linear und torch.nn.Conv2d . Darüber hinaus müssen keine forward definiert werden. Es wird automatisch durch ModuleWrapper betreut.
Zum Beispiel:
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 xDas obere Netzwerk kann wie folgt in Bayesian konvertiert werden:
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 vor dem ersten BBBLinear -Block hinzu.forward des Modells gibt ein Tupel als (logits, kl) zurück.priors können als Argument an die Schichten übergeben werden. Standardwert ist: 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_
}Derzeit werden folgende Datensätze und Modelle unterstützt.
python main_bayesian.py
config_bayesian.py python main_frequentist.py
config_frequentist.py layers/ : Enthält ModuleWrapper , FlattenLayer , BBBLinear und BBBConv2d .
models/BayesianModels/ : Enthält Standard -Bayes'sche Modelle (BBBLENET, BBBALEXNET, BBB3CONV3FC).
models/NonBayesianModels/ : Enthält Standard-Nicht-Bayesian-Modelle (Lenet, Alexnet).
checkpoints/ : Checkpoint -Verzeichnis: Modelle werden hier gespeichert.
tests/ : Grundlegende unittestes Fälle für Schichten und Modelle.
main_bayesian.py : Bayes'sche Modelle trainieren und bewerten.
config_bayesian.py : Hyperparameter für main_bayesian -Datei.
main_frequentist.py : trainieren und bewerten Sie nicht-bayesische (Frequentist) Modelle.
config_frequentist.py : Hyperparameter für main_frequentist -Datei.
Es gibt zwei Arten von Unsicherheiten: Aleateorische und epistemische .
Aleateorische Unsicherheit ist eine Maßnahme für die Variation von Daten, und die epistemische Unsicherheit wird durch das Modell verursacht.
Hier 'normalized' zwei Methoden in uncertainty_estimation.py 'softmax' .
Außerdem kann uncertainty_estimation.py verwendet werden, um Unsicherheiten durch ein Bayesian neuronales Netzwerk auf MNIST und notMNIST -Datensatz zu vergleichen. Sie können Argumente wie:
net_type : lenet , alexnet oder 3conv3fc . Standard ist lenet .weights_path : Gewichte für das angegebene net_type . Standard ist 'checkpoints/MNIST/bayesian/model_lenet.pt' .not_mnist_dir : Verzeichnis des notMNIST -Datensatzes. Standard ist 'data' .num_batches : Anzahl der Chargen, für die Unsicherheiten berechnet werden müssen.Anmerkungen :
layer_type und activation_type in uncertainty_etimation.py müssen von config_bayesian.py festgelegt werden, um mit den bereitgestellten Gewichten übereinzustimmen.Wenn Sie diese Arbeit verwenden, zitieren Sie bitte:
@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}
}
}