#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, у меня есть идея, что делать.