เราแนะนำ เครือข่ายประสาทแบบเบย์เซียนด้วยการอนุมานแบบแปรผัน ซึ่งเป็นตัวแปรของเครือข่ายประสาท (CNNs) ซึ่งการกระจายความน่าจะเป็นหลังที่ไม่สามารถเอาชนะ ได้ เราแสดงให้เห็นว่าวิธีการอนุมานแบบแปรผันของเราที่เสนอนั้นบรรลุผลการปฏิบัติงานเทียบเท่ากับการอนุมานบ่อยครั้งในสถาปัตยกรรมที่เหมือนกันในชุดข้อมูลหลายชุด (MNIST, CIFAR10, CIFAR100) ตามที่อธิบายไว้ในกระดาษ


พื้นที่เก็บข้อมูลนี้มีการใช้เบย์เลาเออร์สองประเภท:
BBB (Bayes by backprop):
ขึ้นอยู่กับบทความนี้ เลเยอร์นี้ตัวอย่างน้ำหนักทั้งหมดเป็นรายบุคคลแล้วรวมเข้ากับอินพุตเพื่อคำนวณตัวอย่างจากการเปิดใช้งาน
BBB_LRT (Bayes by backprop w/ เคล็ดลับ reparametrization ท้องถิ่น):
เลเยอร์นี้รวม Bayes โดย backprop กับเคล็ดลับ reparametrization ท้องถิ่นจากบทความนี้ เคล็ดลับนี้ทำให้สามารถสุ่มตัวอย่างโดยตรงจากการกระจายผ่านการเปิดใช้งาน
ใน torch.nn.Conv2d สร้างเครือข่ายแบบเบย์แบบกำหนดเองให้สืบทอด layers.misc.ModuleWrapper แทนที่จะเป็น torch.nn.Module และใช้ BBBLinear และ BBBConv2d จากเลเยอร์ใด ๆ ที่กำหนด ( BBB หรือ BBB_LRT ) แทน torch.nn.Linear ยิ่งกว่านั้นไม่จำเป็นต้องกำหนดวิธีการ 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เครือข่ายด้านบนสามารถแปลงเป็น Bayesian ได้ดังนี้:
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 ก่อนบล็อก BBBLinear ครั้งแรกforward ของโมเดลจะส่งคืน tuple เป็น (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/ : มีรุ่น Bayesian มาตรฐาน (BBBLENET, BBBALEXNET, BBB3CONV3FC)
models/NonBayesianModels/ : มีโมเดลที่ไม่ใช่เบย์เซียนมาตรฐาน (Lenet, Alexnet)
checkpoints/ : ไดเรกทอรีจุดตรวจ: โมเดลจะถูกบันทึกไว้ที่นี่
tests/ : กรณีที่ไม่ได้ใช้งานพื้นฐานสำหรับเลเยอร์และรุ่น
main_bayesian.py : ฝึกอบรมและประเมินแบบจำลองเบย์
config_bayesian.py : hyperparameters สำหรับไฟล์ main_bayesian
main_frequentist.py : ฝึกอบรมและประเมินโมเดลที่ไม่ใช่เบย์เซียน (บ่อยครั้ง)
config_frequentist.py : hyperparameters สำหรับไฟล์ main_frequentist
มีความไม่แน่นอนสองประเภท: Aleatoric และ epistemic
ความไม่แน่นอนของ Aleatoric เป็นตัวชี้วัดการเปลี่ยนแปลงของข้อมูลและความไม่แน่นอนของ epistemic เกิดจากแบบจำลอง
ที่นี่มีสองวิธีใน uncertainty_estimation.py นั่นคือ 'softmax' & 'normalized' และตามลำดับตามสมการ 4 จากบทความนี้และสมการ 15 จากบทความนี้
นอกจากนี้ uncertainty_estimation.py สามารถใช้เพื่อเปรียบเทียบความไม่แน่นอนโดยเครือข่ายประสาทแบบเบย์บนชุดข้อมูล MNIST และ notMNIST คุณสามารถให้ข้อโต้แย้งเช่น:
net_type : lenet , alexnet หรือ 3conv3fc ค่าเริ่มต้นคือ lenetweights_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}
}
}