LSTM для непрерывного видео - PullRequest
0 голосов
/ 18 января 2019

Можем ли мы ввести непрерывное видео, которое содержит последовательности как положительных, так и отрицательных классов для обучения LSTM, на нескольких тысячах таких видео?

Моя общая цель - помечать видео в реальном времени сцены (например, если у меня 0-100 кадров, а номер кадра 30-60 содержит некоторые сцены йоги, мне нужно их пометить)

Прямо сейчас подход, которым я придерживаюсь, состоит в том, чтобы разделить видео на две категории положительных последовательностей и отрицательных последовательностей и обучить LSTM (поверх Mobnet CNN, FC заменяется слоями LSTM).

Но как-то это не дает улучшения по сравнению с Mobnet один, когда мы проводим оценку на неразделенных видео.

Обе Mobnet и LSTM обучаются отдельно. Я сохраняю вывод Mobnet (удаленный FC) в массивах numpy, а затем читаю эти массивы для обучения LSTM.

Вот пример кода, используемого для этого подхода:

epochs = 250 
batch_size = 128 

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        in_size = 1024
        classes_no = 2
        hidden_size = 512 
        layer_no = 2 

        self.lstm = nn.LSTM(in_size, hidden_size, layer_no, batch_first=True)
        self.linear = nn.Linear(hidden_size, classes_no)

    def forward(self, input_seq):
        output_seq, _ = self.lstm(input_seq)
        last_output = output_seq[:,-1]
        class_predictions = self.linear(last_output)
        return class_predictions

def nploader(npfile):
    a = np.load(npfile)
    return a

def train():
    npdataloader = torchvision.datasets.DatasetFolder('./featrs/',
            nploader, ['npy'], transform=None, target_transform=None)

    data_loader = torch.utils.data.DataLoader(npdataloader,
                                              batch_size=batch_size,
                                              shuffle=False,
                                              num_workers=1)

    model = Model().cuda()
    loss = nn.CrossEntropyLoss()
    optimizer = torch.optim.SGD(model.parameters(), lr = 0.001)
    scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.8)
    model.train()

    for epoch in range(0, epochs):
        for input_seq, target in data_loader:
            optimizer.zero_grad()
            output = model(input_seq.cuda())
            err = loss(output.cuda(), target.cuda())
            err.backward()
            optimizer.step()
        scheduler.step()

    torch.save(model.state_dict(), 'lstm.ckpt')
...