Можем ли мы ввести непрерывное видео, которое содержит последовательности как положительных, так и отрицательных классов для обучения 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')