畳み込み推論を備えたベイジアン畳み込みニューラルネットワークを導入します。これは、バックプロップごとにベイズによって重量を超える扱いにくい後方確率分布が推測される、畳み込みニューラルネットワーク(CNNS)のバリアントです。提案された変分推論方法が、論文に記載されているように、いくつかのデータセット(MNIST、CIFAR10、CIFAR100)の同一のアーキテクチャの頻繁な推論に相当するパフォーマンスをどのように達成するかを示します。


このリポジトリには、2種類のベイジアンラウアーの実装が含まれています。
BBB(バックプロップによるベイズ):
この論文に基づいています。このレイヤーは、すべての重みを個別にサンプリングし、入力と結合してアクティベーションからサンプルを計算します。
BBB_LRT(バックプロップによるベイズw/ローカルリパラメーター化トリック):
このレイヤーは、バックプロップでベイズを組み合わせて、このペーパーからのローカルなリパラメーター化トリックを組み合わせています。このトリックにより、アクティベーション上の分布から直接サンプリングできます。
カスタムベイジアンネットワークを作成するには、 torch.nn.Moduleの代わりにlayers.misc.ModuleWrapperを継承し、 torch.nn.Linearおよびtorch.nn.Conv2dの代わりに、与えられたレイヤー( BBBまたはBBB_LRT )のいずれかのいずれかのいずれかのいずれかのいずれかのいずれかのいずれかからBBBLinearおよびBBBConv2d使用します。さらに、 forwardメソッドを定義する必要はありません。 ModuleWrapperによって自動的に処理されます。
例えば:
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 x上記のネットワークは、次のようにベイジアンに変換できます。
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 )BBBLinearブロックの前にFlattenLayer追加します。forwardメソッドは、タプルAs (logits, kl)を返します。priors 、レイヤーへの引数として渡すことができます。デフォルト値は次のとおりです。 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_
}現在、次のデータセットとモデルがサポートされています。
python main_bayesian.py
config_bayesian.pyでハイパーパラメーターを設定しますpython main_frequentist.py
config_frequentist.pyでハイパーパラメーターを設定します layers/ : ModuleWrapper 、 FlattenLayer 、 BBBLinear 、 BBBConv2dが含まれています。
models/BayesianModels/ :標準のベイジアンモデル(bbblenet、bbbalexnet、bbb3conv3fc)が含まれています。
models/NonBayesianModels/ :標準の非ベイジアンモデル(LENET、ALEXNET)が含まれています。
checkpoints/ :チェックポイントディレクトリ:モデルはここから保存されます。
tests/ :レイヤーとモデルの基本的な不合格ケース。
main_bayesian.py :ベイジアンモデルをトレーニングおよび評価します。
config_bayesian.pyファイルのmain_bayesianパラメーター。
main_frequentist.py :非ベイシアン(頻繁な)モデルを訓練および評価します。
config_frequentist.pyファイルのmain_frequentistパラメーター。
不確実性には、アレアトリックと認識論の2種類があります。
アレアトリックの不確実性はデータの変動の尺度であり、認識論的不確実性はモデルによって引き起こされます。
ここでは、2つのメソッドがuncertainty_estimation.pyで提供され、それらは'softmax'と'normalized'であり、このペーパーの式4とこのペーパーの方程式15に基づいています。
また、 MNISTおよびnotMNISTデータセットのベイジアンニューラルネットワークによる不確実性を比較するために、 uncertainty_estimation.py使用できます。次のような議論を提供できます。
net_type : lenet 、 alexnetまたは3conv3fc 。デフォルトはlenetです。weights_path :指定されたnet_typeのウェイト。デフォルトは'checkpoints/MNIST/bayesian/model_lenet.pt'です。not_mnist_dir : notMNISTデータセットのディレクトリ。デフォルトは'data'です。num_batches :不確実性を計算する必要があるバッチ数。注:
layer_typeおよびactivation_type uncertainty_etimation.pyで使用されているのは、提供されたウェイトと一致するために、 config_bayesian.pyから設定する必要があります。この作業を使用している場合は、引用してください。
@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}
}
}