Классификация видео с использованием LSTM с сохранением состояния, точность проверки не улучшается - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь классифицировать некоторые видео на 3 разных класса.Каждое видео имеет разную длину кадра.Обучающие данные имеют вид (104, Нет, 528), где:

  • 104 = Количество видео
  • Нет = количество кадров для каждого видео, которые различны
  • 528 = Количество функций для каждого кадра

Поскольку последовательность кадров для каждого видео длинная, я использую «LSTM с отслеживанием состояния» для управления длиной последовательностей.Я определил свою модель так же, как показано ниже:

def LSTM_Model():

model = Sequential()
model.add(LSTM(units = 256, input_shape=(None, 528),\
                       return_sequences=False, stateful=True, batch_size = 1))
model.add(Dropout(0.4))
model.add(Dense(3, activation='softmax'))
opt = keras.optimizers.SGD(lr=0.00005, decay = 1e-6, momentum=0.9, nesterov=True)
model.compile(loss = 'categorical_crossentropy', optimizer = opt, metrics = ['accuracy'])
model.summary()

return model

Затем я обучил и протестировал модель:

def train_model(X, y, X_test, y_test, model):
    np.random.seed(200)
    epochs = 100
    maxlen = 500


    for epoch in range(epochs):

        mean_tr_loss, mean_tr_acc =[],[]
        print('Epoch: ', epoch + 1 )

        for sbj in range(X.shape[0]):

            video = X[sbj]
            y_sbj = y[sbj,:]
            y_new = y_sbj
            nb_frame = video.shape[0]

            for count in range(nb_frame // maxlen +1):

                if count == nb_frame // maxlen :
                    seq = video[count*maxlen + count:, :]

                else:
                    seq = video[count*maxlen+count : (count+1)*maxlen+count, :]
                    seq = np.expand_dims(seq, axis=0)

      #   ''' Using train_on_batch '''

                    tr_loss, tr_acc = model.train_on_batch(seq, np.array([y_new])) 
                    mean_tr_loss.append(tr_loss)
                    mean_tr_acc.append(tr_acc)


            print('Training on subject', sbj+1, 'done' )
            model.reset_states() 


        print('accuracy training = {}'.format(np.mean(mean_tr_acc)))
        print('loss training = {}'.format(np.mean(mean_tr_loss)))
        print('___________________________________')



        print('Testing....')


        mean_te_loss, mean_te_acc =[],[]

        for sbj_test in range(X_test.shape[0]):

            video_test = X_test[sbj_test]
            y_new_test = y_test[sbj_test]
            nb_frame_test = video_test.shape[0]

            for i in range(nb_frame_test // maxlen + 1):

                if i == nb_frame_test // maxlen :
                    seq_test = video_test[i*maxlen + i:, :]
                else:
                    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' )
            model.reset_states()   



        print('accuracy testing = {}'.format(np.mean(mean_te_acc)))
        print('loss testing = {}'.format(np.mean(mean_te_loss)))

В приведенном выше коде я рассмотрел каждое видео отдельно, а затем каждое видео было разделенона разные последовательности кадров длиной 500 (кроме последнего кадра последовательности для каждого видео, поскольку длина кадров не делится на 500).Точность обучения и точность тестирования такие же, как показано ниже.

Epoch1 : accuracy training = 0.3694     accuracy testing = 0.3927
         loss training = 1.146          loss testing = 1.109
Epoch2 : accuracy training = 0.4423     accuracy testing = 0.4048
         loss training = 1.053          loss testing = 1.109
Epoch3 : accuracy training = 0.5017     accuracy testing = 0.4236
         loss training = 0.994          loss testing = 1.115
Epoch4 : accuracy training = 0.5491     accuracy testing = 0.4099
         loss training = 0.94           loss testing = 1.124
Epoch5: accuracy training = 0.5612      accuracy testing = 0.4013
        loss training = 0.924           loss testing = 1.128
Epoch6 : accuracy training = 0.6142     accuracy testing = 0.4113
         loss training = 0.859          loss testing = 1.137
Epoch7 : accuracy training = 0.6263     accuracy testing = 0.4116
         loss training = 0.824          loss testing = 1.142
Epoch8 : accuracy training = 0.6659     accuracy testing = 0.415
         loss training = 0.775          loss testing = 1.152

После 100 эпох точность обучения увеличивается, а точность тестирования не повышается.Если дело «переоснащение», должно помочь добавление выпадающего слоя, чего не произошло.Итак, я запутался в причине.

Любая идея или предложение будет оценено.

...