in iep/models/module_net.py [0:0]
def build_classifier(module_C, module_H, module_W, num_answers,
fc_dims=[], proj_dim=None, downsample='maxpool2',
with_batchnorm=True, dropout=0):
layers = []
prev_dim = module_C * module_H * module_W
if proj_dim is not None and proj_dim > 0:
layers.append(nn.Conv2d(module_C, proj_dim, kernel_size=1))
if with_batchnorm:
layers.append(nn.BatchNorm2d(proj_dim))
layers.append(nn.ReLU(inplace=True))
prev_dim = proj_dim * module_H * module_W
if downsample == 'maxpool2':
layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
prev_dim //= 4
elif downsample == 'maxpool4':
layers.append(nn.MaxPool2d(kernel_size=4, stride=4))
prev_dim //= 16
layers.append(Flatten())
for next_dim in fc_dims:
layers.append(nn.Linear(prev_dim, next_dim))
if with_batchnorm:
layers.append(nn.BatchNorm1d(next_dim))
layers.append(nn.ReLU(inplace=True))
if dropout > 0:
layers.append(nn.Dropout(p=dropout))
prev_dim = next_dim
layers.append(nn.Linear(prev_dim, num_answers))
return nn.Sequential(*layers)