Я пытаюсь классифицировать некоторые видео на 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 эпох точность обучения увеличивается, а точность тестирования не повышается.Если дело «переоснащение», должно помочь добавление выпадающего слоя, чего не произошло.Итак, я запутался в причине.
Любая идея или предложение будет оценено.