Introducimos las redes neuronales convolucionales bayesianas con inferencia variacional , una variante de redes neuronales convolucionales (CNN), en las que los bayprop infieren las distribuciones de probabilidad posteriores intratables sobre los pesos. Demostramos cómo nuestro método de inferencia variacional propuesto logra actuaciones equivalentes a la inferencia frecuentista en arquitecturas idénticas en varios conjuntos de datos (MNIST, CIFAR10, CIFAR100) como se describe en el documento.


Este repositorio contiene dos tipos de implementación bayesiana de Lauer:
BBB (Bayes por Backprop):
Basado en este documento. Esta capa muestra todos los pesos individualmente y luego los combina con las entradas para calcular una muestra de las activaciones.
Bbb_lrt (Bayes por backprop con truco de reparación local):
Esta capa combina Bayes de Backprop con truco de reparametrización local de este documento. Este truco permite una muestra directa de la distribución sobre las activaciones.
Para hacer una red bayesiana personalizada, heredar layers.misc.ModuleWrapper en lugar de torch.nn.Module y use BBBLinear y BBBConv2d de cualquiera de las capas dadas ( BBB o BBB_LRT ) en lugar de torch.nn.Linear y torch.nn.Conv2d . Además, no hay necesidad de definir el método forward . ModuleWrapper lo atenderá automáticamente.
Por ejemplo:
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 xLa red anterior se puede convertir a bayesiano de la siguiente manera:
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 antes del primer bloque BBBLinear .forward del modelo devolverá una tupla como (logits, kl) .priors se pueden pasar como un argumento a las capas. El valor predeterminado es: 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_
}Actualmente, se admiten los siguientes conjuntos de datos y modelos.
python main_bayesian.py
config_bayesian.py python main_frequentist.py
config_frequentist.py layers/ : contiene ModuleWrapper , FlattenLayer , BBBLinear y BBBConv2d .
models/BayesianModels/ : contiene modelos bayesianos estándar (BBBlenet, BBBalexnet, BBB3Conv3FC).
models/NonBayesianModels/ : contiene modelos estándar no bayesianos (Lenet, Alexnet).
checkpoints/ : Directorio de punto de control: los modelos se guardarán aquí.
tests/ : casos básicos unitestos para capas y modelos.
main_bayesian.py : entrenar y evaluar modelos bayesianos.
config_bayesian.py : hiperparámetros para el archivo main_bayesian .
main_frequentist.py : entrena y evalúa modelos no bayesianos (frecuentistas).
config_frequentist.py : HyperParameters para el archivo main_frequentist .
Hay dos tipos de incertidumbres: aleatórica y epistémica .
La incertidumbre aleatórica es una medida para la variación de los datos y el modelo causa la incertidumbre epistémica.
Aquí, se proporcionan dos métodos en uncertainty_estimation.py , esos son 'softmax' y 'normalized' y se basan respectivamente en la Ecuación 4 de este documento y la Ecuación 15 de este documento.
Además, uncertainty_estimation.py se puede usar para comparar las incertidumbres por una red neuronal bayesiana en el conjunto de datos MNIST y notMNIST . Puede proporcionar argumentos como:
net_type : lenet , alexnet o 3conv3fc . El valor predeterminado es lenet .weights_path : pesos para el net_type dado. El valor predeterminado es 'checkpoints/MNIST/bayesian/model_lenet.pt' .not_mnist_dir : Directorio del conjunto de datos notMNIST . El valor predeterminado es 'data' .num_batches : número de lotes para los cuales deben calcularse las incertidumbres.Notas :
layer_type y activation_type utilizados en uncertainty_etimation.py debe establecerse desde config_bayesian.py para que coincida con los pesos proporcionados.Si está utilizando este trabajo, cite:
@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}
}
}