Перенос обучения для классификации видео

Как я могу использовать предварительно обученные модели для обучения модели классификации видео? Форма моего набора данных (4000,10,150,150,1), я пытаюсь классифицировать распознавание действий человека с помощью Conv2D TimeDistributed. Я могу тренироваться без передачи обучения, но у меня низкая точность. Что я пробовал:

from keras.applications import VGG16
conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(150, 150, 3))

model = models.Sequential()
model.add(conv_base)
model.add(TimeDistributed(Conv2D(96, (3, 3), padding='same',
                        input_shape=x_train.shape[1:])))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(Conv2D(128, (3, 3))))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Dropout(0.35)))
.
.
.
.

Но у меня есть ValueError: strides should be of length 1, 1 or 3 but was 2
У кого-то есть идеи?


person Emre Tatbak    schedule 25.04.2020    source источник


Ответы (1)


Я предполагаю, что у вас есть 10 кадров для каждого видео. Это простая модель, в которой используются функции (GloabAveragePooling) VGG16 для каждого кадра и LSTM для классификации последовательностей кадров.

Можно поэкспериментировать, добавив еще несколько слоев, изменив гиперпараметры.

Примечание. В вашей модели много несоответствий, включая передачу 5-мерных данных непосредственно в VGG16, который ожидает 4-мерные данные.

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.optimizers import Adam
import tensorflow as tf
import numpy as np

from tensorflow.keras.applications import VGG16
conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(150, 150, 3))

IMG_SIZE=(150,150,3)
num_class = 3

def create_base():
  conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(150, 150, 3))
  x = GlobalAveragePooling2D()(conv_base.output)
  base_model = Model(conv_base.input, x)
  return base_model

conv_base = create_base()

ip = Input(shape=(10,150,150,3))
t_conv = TimeDistributed(conv_base)(ip) # vgg16 feature extractor

t_lstm = LSTM(10, return_sequences=False)(t_conv)

f_softmax = Dense(num_class, activation='softmax')(t_lstm)

model = Model(ip, f_softmax)

model.summary()
Model: "model_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_32 (InputLayer)        [(None, 10, 150, 150, 3)] 0         
_________________________________________________________________
time_distributed_4 (TimeDist (None, 10, 512)           14714688  
_________________________________________________________________
lstm_1 (LSTM)                (None, 10)                20920     
_________________________________________________________________
dense (Dense)                (None, 3)                 33        
=================================================================
Total params: 14,735,641
Trainable params: 14,735,641
Non-trainable params: 0
________________________
person Zabir Al Nazi    schedule 25.04.2020
comment
Большой! Оно работает. Один вопрос; когда я запускаю этот код, он почти ничего не узнает. Но когда я добавляю слой Dense, он учится так быстро. Вы знаете, почему это так? - person Emre Tatbak; 27.04.2020
comment
Как я уже сказал, вы должны экспериментировать со слоями, плотные слои легче изучить, чем слои LSTM / conv, но будьте осторожны, чтобы не переобучиться. - person Zabir Al Nazi; 27.04.2020
comment
Да, это похоже на переоснащение, но я также получаю высокую точность данных проверки. Это странно. Возможно, проблема в моем наборе данных, они очень похожи. - person Emre Tatbak; 27.04.2020