# Codeblock 10a class CSPDenseNet(nn.Module): def __init__(self): super().__init__() self.first_conv = nn.Conv2d(in_channels=3, #(1) out_channels=64, kernel_size=7, stride=2, padding=3, bias=False) self.first_pool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) #(2) channel_count = 64 ##### Stage 0 self.dense_block_0 = DenseBlock(in_channels=channel_count//2, repeats=REPEATS[0]) self.first_transition_0 = FirstTransition(in_channels=(channel_count//2)+(REPEATS[0]*GROWTH), out_channels=int(((channel_count//2)+(REPEATS[0]*GROWTH))*CHANNEL_POOLING)) channel_count = (channel_count - (channel_count//2)) + int(((channel_count//2)+(REPEATS[0]*GROWTH))*CHANNEL_POOLING) self.second_transition_0 = SecondTransition(in_channels=channel_count, out_channels=int(channel_count*COMPRESSION)) channel_count = int(channel_count*COMPRESSION) ##### ##### Stage 1 self.dense_block_1 = DenseBlock(in_channels=channel_count//2, repeats=REPEATS[1]) self.first_transition_1 = FirstTransition(in_channels=(channel_count//2)+(REPEATS[1]*GROWTH), out_channels=int(((channel_count//2)+(REPEATS[1]*GROWTH))*CHANNEL_POOLING)) channel_count = (channel_count - (channel_count//2)) + int(((channel_count//2)+(REPEATS[1]*GROWTH))*CHANNEL_POOLING) self.second_transition_1 = SecondTransition(in_channels=channel_count, out_channels=int(channel_count*COMPRESSION)) channel_count = int(channel_count*COMPRESSION) ##### ##### Stage 2 self.dense_block_2 = DenseBlock(in_channels=channel_count//2, repeats=REPEATS[2]) self.first_transition_2 = FirstTransition(in_channels=(channel_count//2)+(REPEATS[2]*GROWTH), out_channels=int(((channel_count//2)+(REPEATS[2]*GROWTH))*CHANNEL_POOLING)) channel_count = (channel_count - (channel_count//2)) + int(((channel_count//2)+(REPEATS[2]*GROWTH))*CHANNEL_POOLING) self.second_transition_2 = SecondTransition(in_channels=channel_count, out_channels=int(channel_count*COMPRESSION)) channel_count = int(channel_count*COMPRESSION) ##### ##### Stage 3 self.dense_block_3 = DenseBlock(in_channels=channel_count//2, repeats=REPEATS[3]) self.first_transition_3 = FirstTransition(in_channels=(channel_count//2)+(REPEATS[3]*GROWTH), out_channels=int(((channel_count//2)+(REPEATS[3]*GROWTH))*CHANNEL_POOLING)) channel_count = (channel_count - (channel_count//2)) + int(((channel_count//2)+(REPEATS[3]*GROWTH))*CHANNEL_POOLING) ##### self.avgpool = nn.AdaptiveAvgPool2d(output_size=(1,1)) #(3) self.fc = nn.Linear(in_features=channel_count, out_features=1000) #(4)