Динамическая обработка кадров с помощью комбинации CNN LSTM или иным образом - PullRequest
0 голосов
/ 01 июля 2019

У меня есть уникальная реализация, где я должен обрабатывать видео с динамической частотой кадров (то есть количество кадров различно для каждого видео в пакете).Я складываю все кадры в один тензор и обрабатываю их с этого момента.Это прекрасно работает со слоем Conv2D, но создание 2D-тензора (batch_size, feature) с помощью операции выравнивания должно быть передано в плотный слой.Я не могу найти подходящий способ для реализации этого.

Для получения дополнительной информации о том, почему это должно быть так, пожалуйста, изучите: эта ссылка при обучении экземпляра машины .Вместо изображений MNIST у меня есть несколько видео в одной сумке, каждое с переменным числом кадров

В настоящее время я реализую:

class models(Model):
def __init__(self,shape):
    self.shape=shape
    super(models,self).__init__()
    self.model = Sequential()
    self.model.add(Conv2D(64,(3,3), activation='relu',padding="same",strides=(1,1),input_shape=self.shape))
    self.model.add(MaxPooling2D(pool_size=( 2, 2), strides=(2, 2),
                          padding='valid', name='pool1'))
    self.model.add(Conv2D(128,(3,3), activation='relu',
                    padding='same', name='conv2',
                    strides=(1,1)))
    self.model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),
                          padding='valid', name='pool2'))
    self.model.add(Conv2D(256,(3,3), activation='relu',
                    padding='same', name='conv3a',
                    strides=(1,1)))
    self.model.add(Conv2D(256,(3,3), activation='relu',
                    padding='same', name='conv3b',
                    strides=(1,1)))
    self.model.add(MaxPooling2D(pool_size=( 2, 2), strides=( 2, 2),
                          padding='valid', name='pool3'))
    self.model.add(Conv2D(512,(3,3), activation='relu',
                    padding='same', name='conv4a',
                    strides=(1,1)))
    self.model.add(Conv2D(512,(3,3), activation='relu',
                    padding='same', name='conv4b',
                    strides=(1,1)))
    self.model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),
                          padding='valid', name='pool4'))
    self.model.add(Conv2D(512,(3,3), activation='relu',
                    padding='same', name='conv5a',
                    strides=(1,1)))
    self.model.add(Conv2D(512,(3,3), activation='relu',
                    padding='same', name='conv5b',
                    strides=(1,1)))
    self.model.add(ZeroPadding2D(padding=(1, 1)))
    self.model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),
                          padding='valid', name='pool5'))
    self.model.add(Flatten())



    self.model2=Sequential()
    self.model2.add(Dense(100))
    self.model2.add(Dense(50))


    self.model2.add(Dense(1,activation="softmax"))

, затем реализую модель, используя в качестве:

def call(self,x):
    mode1=self.model(x)
    flat=Flatten()(mode1)
    reshaped=tf.keras.backend.reshape(flat,(1,-1))
    final = self.model2(reshaped)

    return final

Последние плотные слои не выровнены должным образом, но они просто представлены в виде представления.

...