Я пытаюсь передать функции, извлеченные из 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.
Большое спасибо за любую помощь, которую выможем предоставить.