Классификация видео с использованием stateful LSTM
Я пытаюсь классифицировать некоторые видео на 3 различных класса. Каждое видео имеет разную длину кадра. Обучающие данные имеют вид (104, нет, 528), где:
- 104 = Количество видео
- None = количество кадров для каждого видео, которые отличаются друг от друга
- 528 = количество объектов для каждого кадра
Поскольку последовательность кадров для каждого видео длинная, я использую "stateful LSTM" для управления длиной последовательностей. Я определил свою модель так же, как показано ниже:
деф LSTM_Model():
модель = последовательная()
model.add(LSTM(units = 256, input_shape=(None, 528),\
return_sequences=False, stateful=True, batch_size = 1))
model.add(отсев(0.4))
model.add(Dense(3, activation='softmax'))
опт = водоснабжении.оптимизаторы.SGD(lr=0.00005, распад = 1e-6, импульс=0.9, Нестеров=True)
модель.компиляции(потери = 'categorical_crossentropy', оптимизатор = опт метрика = ['точность'])
модель.резюме()
возвращаемая модель
Затем я натренировал модель:
деф train_model(х, г, X_test, y_test, модель):
np.random.seed(200)
эпохи = 100
maxlen = 500
для эпохи в диапазоне(эпохи):
mean_tr_loss, mean_tr_acc =[],[]
print('Epoch: ', epoch + 1 )
для sbj в диапазоне(X. shape[0]):
видео = X[sbj]
y_sbj = y[sbj,:]
y_new = y_sbj
nb_frame = video.shape[0]
для count in range(nb_frame // maxlen +1):
if count == nb_frame // maxlen :
seq = видео[count*maxlen + count:, :]
еще:
seq = видео[count*maxlen+count : (count+1)*maxlen+count, :]
seq = np.expand_dims(seq, axis=0)
# "Использование train_on_batch "'
tr_loss, tr_acc = модель.train_on_batch(далее, НП.массив([y_new]))
mean_tr_loss.append(tr_loss)
mean_tr_acc.append(tr_acc)
печать("тренинг по предмету", sbj+1, "готово" )
модель.reset_states()
печать('точность обучения = {}'.формат(НП.среднее(mean_tr_acc)))
печать('обучение потеря = {}'.формат(НП.среднее(mean_tr_loss)))
печатать('___________________________________')
печать('тестирование....')
mean_te_loss, mean_te_acc =[],[]
для sbj_test в диапазоне(X_test.shape[0]):
video_test = X_test[sbj_test]
y_new_test = y_test[sbj_test]
nb_frame_test = video_test.shape[0]
для i в диапазоне(nb_frame_test // maxlen + 1):
if i == nb_frame_test // maxlen :
seq_test = video_test[Я*значение maxlen + я:, :]
еще:
seq_test = video_test[i*maxlen+i : (i+1)*maxlen+i, :]
seq_test = np.expand_dims(seq_test, axis=0)
te_loss, te_acc = model.test_on_batch(seq_test, np.array([y_new_test]))
mean_te_loss.append(te_loss)
mean_te_acc.append(te_acc)
print('Testing on subject', sbj_test+1, 'done' )
модель.reset_states()
печать('точность испытания = {}'.формат(НП.среднее(mean_te_acc)))
печать('убыток испытаний = {}'.формат(НП.среднее(mean_te_loss)))
В приведенном выше коде я рассматривал каждое видео отдельно, а затем каждое видео было разделено на различные последовательности кадров длиной 500 (за исключением последнего кадра последовательности для каждого видео, потому что длина кадров не делится на 500). Точность тренировки и точность теста такие же, как и ниже.
Эпоха 1 : обучение точности = 0.3694 тестирование точности = 0.3927
тренировка потерь = 1.146 тестирование потерь = 1.109
Epoch2 : тренировка точности = 0.4423 испытание точности = 0.4048
тренировка потерь = 1.053 тестирование потерь = 1.109
Epoch3 : тренировка точности = 0.5017 испытание точности = 0.4236
тренировка потерь = 0.994 тестирование потерь = 1.115
Эпоха 4 : обучение точности = 0,5491 тестирование точности = 0,4099
тренировка потерь = 0,94 тестирование потерь = 1,124
Epoch5: обучение точности = 0.5612 тестирование точности = 0.4013
тренировка потерь = 0.924 тестирование потерь = 1.128
Эпоха 6 : обучение точности = 0.6142 тестирование точности = 0.4113
тренировка потерь = 0,859 тестирование потерь = 1,137
Epoch7 : обучение точности = 0.6263 тестирование точности = 0.4116
тренировка потерь = 0.824 тестирование потерь = 1.142
Epoch8 : тренировка точности = 0.6659 испытание точности = 0.415
тренировка потерь = 0.775 тестирование потерь = 1.152
После 100 эпох точность обучения увеличивается, а точность тестирования не улучшается. Если дело в "переобучении", то добавление отсева слоя должно помочь, а это не так. Итак, я запутался в причине.
Любая идея или предложение будут оценены по достоинству.
Что я уже пробовал:
Я пробовал использовать dropout layer, L2 и L1 regularizer и укладывать некоторые слои LSTM.