Ошибка при подаче последовательности NUMP в LSTM в Керасе - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь передать функции, извлеченные из 2-х точно настроенных VGG16 (каждый в отдельном потоке), затем для каждой последовательности из 9 пар данных объединить их массивы и передать последовательность из 9 выходов (сцепленных) вдвунаправленный LSTM в Керасе.

Проблема в том, что я сталкиваюсь с ошибкой при попытке построить часть LSTM.Ниже показан генератор, который я написал для чтения потоков RGB и Optical, извлечения функций и объединения каждой пары:

def generate_generator_multiple(generator,dir1, dir2, batch_rgb, batch_flow, img_height,img_width):

    print("Processing inside generate multiple")

    genX1 = generator.flow_from_directory(dir1,
                                          target_size = (img_height,img_width),
                                          class_mode = 'categorical',
                                          batch_size = batch_rgb,
                                          shuffle=False 
                                          )

    genX2 = generator.flow_from_directory(dir2,
                                          target_size = (img_height,img_width),
                                          class_mode = 'categorical',
                                          batch_size = batch_flow,
                                          shuffle=False    
                                          )

    while True:

            imgs, labels = next(genX1)
            X1i = RGB_model.predict(imgs, verbose=0)

            imgs2, labels2 = next(genX2)            
            X2i = FLOW_model.predict(imgs2,verbose=0)

            Xi = []
            for i in range(9):
                Xi.append(np.concatenate([X1i[i+1],X2i[i]]))

            Xi = np.asarray(Xi)

            if np.array_equal(labels[1:],labels2)==False:
                print("ERROR !! problem of labels matching: RGB and FLOW have different labels")

            yield Xi, labels2[2]

Я ожидаю, что генератор выдаст последовательность из 9 массивов, поэтому форма Xiкогда я заставляю цикл выполняться дважды: (9, 14, 7, 512)

Когда я использую while True (как в коде выше) и пытаюсь вызвать метод, чтобы проверить, что он возвращает, послеПосле трех итераций я получаю сообщение об ошибке:

ValueError: too many values to unpack (expected 2)

Теперь, предполагая, что с генератором нет проблем, я пытаюсь передать данные, возвращаемые генератором, в двунаправленный LSTM, как показано ниже:

n_frames = 9
seq = 100

Bi_LSTM = Sequential()
Bi_LSTM.add(Bidirectional(LSTM(seq, return_sequences=True, dropout=0.25, recurrent_dropout=0.1),input_shape=(n_frames,14,7,512)))
Bi_LSTM.add(GlobalMaxPool1D())
Bi_LSTM.add(TimeDistributed(Dense(100, activation="relu")))
Bi_LSTM.add(layers.Dropout(0.25))
Bi_LSTM.add(Dense(4, activation="relu"))

model.compile(Adam(lr=.00001), loss='categorical_crossentropy', metrics=['accuracy'])

Но я продолжаю получать следующую ошибку: (журнал ошибок немного длинный)

InvalidArgumentError: Shape must be rank 4 but is rank 2 for 'bidirectional_2/Tile_1' (op: 'Tile') with input shapes: [?,7,512,1], [2].

Кажется, это вызвано этой строкой:

Bi_LSTM.add(Bidirectional(LSTM(seq, return_sequences=True, dropout=0.25, recurrent_dropout=0.1),input_shape=(n_frames,14,7,512)))

Iя больше не уверен, что проблема в том, как я пытаюсь построить LSTM, как я возвращаю данные из генератора, или как я определяю ввод LSTM.

Большое спасибо за любую помощь, которую выможем предоставить.

1 Ответ

0 голосов
/ 10 октября 2018

Кажется, что эта ошибка, в частности, вызвана следующей строкой:

input_shape=(n_frames,14,7,512)

Я был озадачен вводом для LSTM.Вместо того, чтобы явно задавать форму ввода, нам просто нужно указать размеры ввода.В моем случае это 3, поскольку вход является трехмерным массивом np.У меня все еще есть другие проблемы с моим кодом, но для этой конкретной ошибки решение изменяет эту часть следующим образом:

input_shape=(n_frames,3) 

Редактировать: При прогнозировании нам нужно получить среднее значениепредсказание, поскольку LSTM ожидает 1D ввода.

Еще одна проблема в моем коде - форма Си.Он должен быть изменен перед выдачей, чтобы он соответствовал вводу, ожидаемому LSTM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...