Introduzimos redes neurais convolucionais bayesianas com inferência variacional , uma variante das redes neurais convolucionais (CNNs), nas quais as distribuições intratáveis de probabilidade posterior sobre os pesos são inferidas por Bayes pelo backprop . Demonstramos como nosso método de inferência variacional proposto alcança performances equivalentes à inferência frequentista em arquiteturas idênticas em vários conjuntos de dados (MNIST, CIFAR10, CIFAR100), conforme descrito no artigo.


Este repositório contém dois tipos de implementação bayesiana de Lauer:
BBB (Bayes by BackProp):
Com base neste artigo. Essa camada amostra todos os pesos individualmente e os combina com as entradas para calcular uma amostra das ativações.
BBB_LRT (Bayes por BackProp w/ truque de reparostização local):
Essa camada combina Bayes por backprop com o truque local de reparostrização deste artigo. Esse truque possibilita a amostra diretamente da distribuição sobre as ativações.
Para criar uma rede bayesiana personalizada, layers.misc.ModuleWrapper em vez de torch.nn.Module e use BBBLinear e BBBConv2d de qualquer uma das camadas dadas ( BBB ou BBB_LRT ) em vez de torch.nn.Linear e torch.nn.Conv2d . Além disso, não há necessidade de definir o método forward . Será automaticamente resolvido pelo ModuleWrapper .
Por exemplo:
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 xA rede acima pode ser convertida em bayesiana da seguinte forma:
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 do primeiro bloco BBBLinear .forward do modelo retornará uma tupla como (logits, kl) .priors podem ser passados como um argumento para as camadas. O valor padrão é: 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_
}Atualmente, os seguintes conjuntos de dados e modelos são suportados.
python main_bayesian.py
config_bayesian.py python main_frequentist.py
config_frequentist.py layers/ : Contém ModuleWrapper , FlattenLayer , BBBLinear e BBBConv2d .
models/BayesianModels/ : Contém modelos Bayesianos padrão (BBBLENET, BBBALEXNET, BBB3CONV3FC).
models/NonBayesianModels/ : Contém modelos não bayesianos padrão (LeNet, Alexnet).
checkpoints/ : Diretório do ponto de verificação: Os modelos serão salvos aqui.
tests/ : Casos básicos para camadas e modelos.
main_bayesian.py : Treine e avalie os modelos bayesianos.
config_bayesian.py : hyperparameters para o arquivo main_bayesian .
main_frequentist.py : Treine e avalie os modelos não bayesianos (frequentistas).
config_frequentist.py : hyperparameters para o arquivo main_frequentist .
Existem dois tipos de incertezas: aleatórica e epistêmica .
A incerteza aleatórica é uma medida para a variação de dados e a incerteza epistêmica é causada pelo modelo.
Aqui, dois métodos são fornecidos em uncertainty_estimation.py , esses são 'softmax' e 'normalized' e são respectivamente baseados na Equação 4 deste artigo e da Equação 15 deste artigo.
Além disso, uncertainty_estimation.py pode ser usado para comparar incertezas por uma rede neural bayesiana no conjunto de dados MNIST e notMNIST . Você pode fornecer argumentos como:
net_type : lenet , alexnet ou 3conv3fc . O padrão é lenet .weights_path : pesos para o dado net_type . O padrão é 'checkpoints/MNIST/bayesian/model_lenet.pt' .not_mnist_dir : Diretório do conjunto de dados notMNIST . O padrão é 'data' .num_batches : Número de lotes para os quais as incertezas precisam ser calculadas.Notas :
layer_type e activation_type usados em uncertainty_etimation.py precisa ser definido em config_bayesian.py para corresponder aos pesos fornecidos.Se você estiver usando este trabalho, 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}
}
}