dpn网络的pytorch实现方式

  

<强>我就废话不多说了,直接上代码吧!

        进口火炬   进口火炬。神经网络是神经网络   进口torch.nn。功能和F            类CatBnAct (nn.Module):   def __init__(自我、in_chs activation_fn=nn.ReLU(原地=True)):   超级(CatBnAct自我). __init__ ()   自我。bn=nn。BatchNorm2d (in_chs,每股收益=0.001)   自我。行动=activation_fn      def向前(自我,x):   x=火炬。猫(x,昏暗的=1)如果其他isinstance (x, tuple) x   返回self.act (self.bn (x))         类BnActConv2d (nn.Module):   def __init__(自我,年代,out_chs kernel_size,泰然自若,   填充=0,组=1,activation_fn=nn.ReLU(原地=True)):   超级(BnActConv2d自我). __init__ ()   自我。bn=nn。BatchNorm2d (in_chs,每股收益=0.001)   自我。行动=activation_fn   自我。conv=nn。Conv2d (in_chs out_chs kernel_size,跨步,填充、组=组,偏见=False)      def向前(自我,x):   返回self.conv (self.act (self.bn (x)))         类InputBlock (nn.Module):   def __init__(自我、num_init_features kernel_size=7,   填充=3,activation_fn=nn.ReLU(原地=True)):   超级(InputBlock自我). __init__ ()   自我。conv=nn.Conv2d (   3 num_init_features kernel_size=kernel_size跨步=2,填充=填充,偏见=False)   自我。bn=nn。BatchNorm2d (num_init_features,每股收益=0.001)   自我。行动=activation_fn   自我。池=nn。MaxPool2d (kernel_size=3,跨步=2,填充=1)      def向前(自我,x):   x=self.conv (x)   x=self.bn (x)   x=self.act (x)   x=self.pool (x)   返回x         类DualPathBlock (nn.Module):   def __init__ (   自我,in_chs、num_1x1_a num_3x3_b num_1x1_c,公司,团体,block_type=罢!?b=False):   超级(DualPathBlock自我). __init__ ()   自我。num_1x1_c=num_1x1_c   自我。公司=公司   自我。b=b   如果block_type“项目”:   自我。key_stride=1   自我。has_proj=True   elif block_type是“下”:   自我。key_stride=2   自我。has_proj=True   其他:   断言block_type是“正常”   自我。key_stride=1   自我。has_proj=False      如果self.has_proj:   #使用不同的成员名,以便更容易参数转换的关键匹配   如果自我。key_stride==2:   自我。c1x1_w_s2=BnActConv2d (   in_chs=in_chs out_chs=num_1x1_c + 2 *公司,kernel_size=1,跨步=2)   其他:   自我。c1x1_w_s1=BnActConv2d (   in_chs=in_chs out_chs=num_1x1_c + 2 *公司,kernel_size=1,跨步=1)   自我。c1x1_a=BnActConv2d (in_chs=in_chs out_chs=num_1x1_a kernel_size=1,跨步=1)   自我。c3x3_b=BnActConv2d (   in_chs=num_1x1_a out_chs=num_3x3_b kernel_size=3,   步=自我。key_stride填充=1,组=组)   如果b:   自我。c1x1_c=CatBnAct (in_chs=num_3x3_b)   自我。c1x1_c1=nn。Conv2d (num_3x3_b、num_1x1_c kernel_size=1,偏见=False)   自我。c1x1_c2=nn。Conv2d (num_3x3_b公司kernel_size=1,偏见=False)   其他:   自我。c1x1_c=BnActConv2d (in_chs=num_3x3_b out_chs=num_1x1_c +公司,kernel_size=1,跨步=1)      def向前(自我,x):   x_in=火炬。猫(x,昏暗的=1)如果其他isinstance (x, tuple) x   如果self.has_proj:   如果自我。key_stride==2:   间=self.c1x1_w_s2 (x_in)   其他:   间=self.c1x1_w_s1 (x_in)   x_s1=间(:,:自我。num_1x1_c,:,:   x_s2=间(:,自我。num_1x1_c::,:]   其他:   x_s1=x [0]   x_s2=x [1]   x_in=self.c1x1_a (x_in)   x_in=self.c3x3_b (x_in)   如果self.b:   x_in=self.c1x1_c (x_in)   着干活=self.c1x1_c1 (x_in)   out2=self.c1x1_c2 (x_in)   其他:   x_in=self.c1x1_c (x_in)   着干活=x_in[:,:自我。num_1x1_c,:,:   out2=x_in[:自我。num_1x1_c::,:]   渣油=x_s1 +着干活   密度=火炬。猫([x_s2, out2],昏暗的=1)   返回渣油,密集的         类DPN (nn.Module):   def __init__(自我、?False, num_init_features=64, k_r=96,组=32,   b=False, k_sec=(3) 3、4、20日inc_sec=(16、32, 24岁,128),   num_classes=1000, test_time_pool=False):   超级(DPN自我). __init__ ()   自我。test_time_pool=test_time_pool   自我。b=b   如果其他小4 bw_factor=1      块=OrderedDict ()      # conv1   如果小:   块[' conv1_1 ']=InputBlock (num_init_features kernel_size=3,填充=1)   其他:   块[' conv1_1 ']=InputBlock (num_init_features kernel_size=7,填充=3)      # conv2   bw=64 * bw_factor   公司=inc_sec [0]   r=(k_r * bw)//(64 * bw_factor)   块(“conv2_1”)=DualPathBlock (num_init_features, r, r, bw公司,团体,“项目”,b)   in_chs=bw + 3 * . n:行情)   因为我在范围(2,k_sec [0] + 1):   块[' conv2_ ' + str (i)]=DualPathBlock (in_chs, r, r, bw公司,团体,“正常”,b)   in_chs +=公司      # conv3   bw=128 * bw_factor   公司=inc_sec [1]   r=(k_r * bw)//(64 * bw_factor)   块(“conv3_1”)=DualPathBlock (in_chs, r, r, bw公司,团体,“下来”,b)   in_chs=bw + 3 * . n:行情)   因为我在范围(2,k_sec [1] + 1):   块[' conv3_ ' + str (i)]=DualPathBlock (in_chs, r, r, bw公司,团体,“正常”,b)   in_chs +=公司      # conv4   bw=256 * bw_factor   公司=inc_sec [2]   r=(k_r * bw)//(64 * bw_factor)   块(“conv4_1”)=DualPathBlock (in_chs, r, r, bw公司,团体,“下来”,b)   in_chs=bw + 3 * . n:行情)   因为我在范围(2,k_sec [2] + 1):   块[' conv4_ ' + str (i)]=DualPathBlock (in_chs, r, r, bw公司,团体,“正常”,b)   in_chs +=公司      # conv5   bw=512 * bw_factor   公司=inc_sec [3]   r=(k_r * bw)//(64 * bw_factor)   块(“conv5_1”)=DualPathBlock (in_chs, r, r, bw公司,团体,“下来”,b)   in_chs=bw + 3 * . n:行情)   因为我在范围(2,k_sec [3] + 1):   块[' conv5_ ' + str (i)]=DualPathBlock (in_chs, r, r, bw公司,团体,“正常”,b)   in_chs +=公司   块[' conv5_bn_ac ']=CatBnAct (in_chs)      自我。特点=nn.Sequential(块)      #使用1 x1 conv FC层允许额外的池方案   自我。null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

dpn网络的pytorch实现方式