i try this:
# weather_labels: partly_cloudy, cloudy, clear, hazy
# other_labels : other like primary, ....

def criterion(weather_logits, weather_labels, other_logits, other_labels):

    w0= 4/17  #0.33333 ##<todo> best weight?
    w1=13/17  #0.66666
    loss0 = nn.CrossEntropyLoss       ()(weather_logits, Variable(weather_labels))
    loss1 = nn.MultiLabelSoftMarginLoss()(other_logits,   Variable(other_labels  ))
    loss  = w0*loss0+w1*loss1

    return loss

#in the model
      ...
class MyNet(nn.Module):
     def __init__(self, in_channels=3, num_weather_classes=4, num_other_classes=13):
        super(MyNet, self).__init__()
        ...
        self.logit0 = nn.Linear(512, num_weather_classes)
        self.logit1 = nn.Linear(512, num_other_classes)

    def forward(self, x):
        ...
        out0 = self.logit0(out)
        out1 = self.logit1(out) 

        return out0, out1




#in the training lopp 
      ...
      for it, (images, labels, indices) in enumerate(train_loader, 0):
 
            optimizer.zero_grad()

            # weather_labels : one hot convert to index
            _, weather_labels = torch.max(labels[:,:4])
 
            #other_labels : one hot
            other_labels = labels[:,4:]

            weather_logits,  other_logits = net(Variable(images.cuda()))
            loss  = criterion(weather_logits, weather_labels.cuda(), other_logits, other_labels.cuda())
            loss.backward()
            optimizer.step()