具体代码见:https://github.com/iboing/CliqueNet
class build_cliquenet(nn.Module):
def __init__(self, input_channels, list_channels, list_layer_num, if_att):
super(build_cliquenet, self).__init__()
self.fir_trans = nn.Conv2d(3, input_channels, kernel_size=7, stride=2, padding=3, bias=False)
self.fir_bn = nn.BatchNorm2d(input_channels)
self.fir_pool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.block_num = len(list_channels)
self.if_att = if_att
self.list_block = nn.ModuleList()
self.list_trans = nn.ModuleList()
self.list_gb = nn.ModuleList()
self.list_gb_channel = []
self.list_compress = nn.ModuleList()
input_size_init = 56
for i in xrange(self.block_num):
if i == 0:
self.list_block.append(clique_block(input_channels=input_channels, channels_per_layer=list_channels[0], layer_num=list_layer_num[0], loop_num=1, keep_prob=0.8))
self.list_gb_channel.append(input_channels + list_channels[0] * list_layer_num[0])
else :
self.list_block.append(clique_block(input_channels=list_channels[i-1] * list_layer_num[i-1], channels_per_layer=list_channels[i], layer_num=list_layer_num[i], loop_num=1, keep_prob=0.8))
self.list_gb_channel.append(list_channels[i-1] * list_layer_num[i-1] + list_channels[i] * list_layer_num[i])
if i < self.block_num - 1:
self.list_trans.append(transition(self.if_att, current_size=input_size_init, input_channels=list_channels[i] * list_layer_num[i], keep_prob=0.8))
self.list_gb.append(global_pool(input_size=input_size_init, input_channels=self.list_gb_channel[i] // 2))
self.list_compress.append(compress(input_channels=self.list_gb_channel[i], keep_prob=0.8))
input_size_init = input_size_init // 2
self.fc = nn.Linear(in_features=sum(self.list_gb_channel) // 2, out_features=1000)
for m in self.modules():
if isinstance(m, nn.Conv2d):
n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
m.weight.data.normal_(0, math.sqrt(2. / n))
elif isinstance(m, nn.BatchNorm2d):
m.weight.data.fill_(1)
m.bias.data.zero_()
elif isinstance(m, nn.Linear):
m.bias.data.zero_()
class clique_block(nn.Module):
def __init__(self, input_channels, channels_per_layer, layer_num, loop_num, keep_prob):
super(clique_block, self).__init__()
self.input_channels = input_channels
self.channels_per_layer = channels_per_layer
self.layer_num = layer_num
self.loop_num = loop_num
self.keep_prob = keep_prob
# conv 1 x 1
self.conv_param = nn.ModuleList([nn.Conv2d(self.channels_per_layer, self.channels_per_layer, kernel_size = 1, padding = 0, bias = False)
for i in range((self.layer_num + 1) ** 2)])
for i in range(1, self.layer_num + 1):
self.conv_param[i] = nn.Conv2d(self.input_channels, self.channels_per_layer, kernel_size = 1, padding = 0, bias = False)
for i in range(1, self.layer_num + 1):
self.conv_param[i * (self.layer_num + 2)] = None
for i in range(0, self.layer_num + 1):
self.conv_param[i * (self.layer_num + 1)] = None
self.forward_bn = nn.ModuleList([nn.BatchNorm2d(self.input_channels + i * self.channels_per_layer) for i in range(self.layer_num)])
self.forward_bn_b = nn.ModuleList([nn.BatchNorm2d(self.channels_per_layer) for i in range(self.layer_num)])
self.loop_bn = nn.ModuleList([nn.BatchNorm2d(self.channels_per_layer * (self.layer_num - 1)) for i in range(self.layer_num)])
self.loop_bn_b = nn.ModuleList([nn.BatchNorm2d(self.channels_per_layer) for i in range(self.layer_num)])
# conv 3 x 3
self.conv_param_bottle = nn.ModuleList([nn.Conv2d(self.channels_per_layer, self.channels_per_layer, kernel_size = 3, padding = 1, bias = False)
for i in range(self.layer_num)])