Как добавить еще одно измерение размера пакета в коде класса python

#python #conv-neural-network

#python #conv-neural-network

Вопрос:

Я изучаю механизм внимания и увидел чей-то код из github, как показано ниже:

 class PositionAttentionModule(nn.Module):
    def __init__(self, in_channels):
        super(PositionAttentionModule, self).__init__()
        self.first_branch_conv = nn.Conv2d(in_channels, int(in_channels/8), kernel_size = 1)
        self.second_branch_conv = nn.Conv2d(in_channels, int(in_channels/8), kernel_size = 1)
        self.third_branch_conv = nn.Conv2d(in_channels, in_channels, kernel_size = 1)
        self.output_conv = nn.Conv2d(in_channels, in_channels, kernel_size = 1)
    
    def forward(self, F):
        # first branch
        F1 = self.first_branch_conv(F)                  # (C/8, W, H)
        F1 = F1.reshape((F1.size(0), F1.size(1), -1))   # (C/8, W*H)
        F1 = torch.transpose(F1, -2, -1)                # (W*H, C/8)
        # second branch
        F2 = self.second_branch_conv(F)                 # (C/8, W, H)
        F2 = F2.reshape((F2.size(0), F2.size(1), -1))   # (C/8, W*H)
        F2 = nn.Softmax(dim = -1)(torch.matmul(F1, F2)) # (W*H, W*H)
        # third branch
        F3 = self.third_branch_conv(F)                  # (C, W, H)
        F3 = F3.reshape((F3.size(0), F3.size(1), -1))   # (C, W*H)
        F3 = torch.matmul(F3, F2)                       # (C, W*H)
        F3 = F3.reshape(F.shape)                        # (C, W, H)
        return self.output_conv(F3*F)
  

Как переписать приведенный выше код, чтобы включить еще одно измерение «размер пакета»?

Спасибо, Линг

Ответ №1:

в Pytorch вам не нужно ничего указывать в классе модели для размера пакета. Вы просто должны быть уверены, что входные данные (в вашем случае ‘F’) имеют размер (B, C, W, H), B — размер пакета. Вы можете сделать это, либо создав тензор изображений самостоятельно, либо используя загрузчик данных. Вы должны создать собственный класс для вашего набора данных с такой структурой:

 
class YourDataset(torch.utils.data.Dataset):
    def __init__(self, datase):
        """ constructor
        load your dataset here,
        dataset could be a csv file or a list or whatever you want
        """

    def __getitem__(self, i)
        """ get sample from dataset
        :param int i: index of dataset (iterator of training-loop)
        :return tensor: preprocessed sample and target

        preprocess the i'th sample/image here if necessary and/or just return the image 
        and its label
        """
    def __len__(self):
        """ returns length of dataset """
  

Здесь вы по-прежнему ничего не указываете о размере пакета, но он поставляется с загрузчиком данных, который вы можете создать следующим образом:

 dataset = YourDataset(dataset_file_or_whatever)
dataloder = torch.utils.data.DataLoader(
        dataset ,
        batch_size=64,
        num_workers=1,
        shuffle=True)
  

И знайте, что вы можете просто выполнить итерацию через dataloder в вашем цикле обучения, например, так:

 for epoch in range(epochs):
    for images, targets in dataloader:
        # images and targets will now have the dimensions (B, C, W, H)!
        # thats it! Now you can train with batches
  

Я надеюсь, что это ответило на ваш вопрос!

Редактировать Только что увидел, что на самом деле это не так, но я написал все это, поэтому я оставлю это здесь, надеюсь, это все еще полезно для тех, кто не знает

Комментарии:

1. Спасибо @Theodor Peifer, у меня есть идея, что делать.