создание последовательности keras для функциональной модели API - PullRequest
0 голосов
/ 27 июня 2019

Я создаю модель, которая использует функциональный API Keras, эта модель принимает 2 входа, следовательно, я использую

video_input = Input(shape=(16, 112, 112, 3))
image_input = Input(shape=(112, 112, 3))
Model(inputs=[video_input, image_input], outputs=merge_model)

Итак, как вы можете видеть, это означает, что модель ожидает массив с первым элементом, являющимсяформы (16, 112, 112, 3) и секунды формы (112, 112, 3).

Я использую созданный мной класс, который наследует класс Keras.util.sequence для предоставления сгенерированных пакетовданных.проблема возникает после генерации пакетов данных, когда тензор потока пытается заполнить модель входными данными, входные данные изменяются с массива 2 на массив 1, и этот элемент 1 состоит из 2, например, он должен ожидать [array(...), array(...)] instead it receives [array(array[...],array[...])]

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays: [array([[array([[[[-76.87925 , -81.45539 , -82.91122 ],
         [-76.90526 , -81.45103 , -83.00473 ],
         [-76.77082 , -81.259674, -82.92529 ],
         ...,
         [-76.17821 , -80.61866 , -8...

Я попытался сделать держатель данных в генераторе последовательностей в виде массива Python, где я добавляю данные, затем преобразую их в массив Numpy, но получил ошибку выше.каким-то образом keras упаковывает его в 1 массив, прежде чем возвращает его в модель.

это метод генерации данных

def __data_generation(self, list_IDs_temp):
        'Generates data containing batch_size samples'  # X : (n_samples, *dim, n_channels)
        # Initialization
        X = []
        y = np.empty((self.batch_size), dtype=int)
        # Generate data
        for i, ID in enumerate(list_IDs_temp):
            # Store sample
            print(ID)
            frame_data = input_data.get_frames_data(
                self.work_directory + ID, self.num_of_frames, self.crop_size)
            image_index = random.randint(0, len(frame_data) - 1)
            im = frame_data[image_index]
            X.append([frame_data, im])

            # Store class
            y[i] = self.labels[ID]

        return np.array(X), keras.utils.to_categorical(
            y, num_classes=self.n_classes)

отредактированная функция, которая работает

def __data_generation(self, list_IDs_temp):
        'Generates data containing batch_size samples'  # X : (n_samples, *dim, n_channels)
        # Initialization
        vX = np.empty((self.batch_size, *self.c3d_dim))
        iX = np.empty((self.batch_size, *self.static_dim))

        y = np.empty((self.batch_size), dtype=int)
        # Generate data
        for i, ID in enumerate(list_IDs_temp):
            # Store sample
            print(ID)
            frame_data = input_data.get_frames_data(
                self.work_directory + ID, self.num_of_frames, self.crop_size)
            image_index = random.randint(0, len(frame_data) - 1)
            im = frame_data[image_index]
            vX[i, ] = frame_data
            iX[i, ] = im
            # Store class
            y[i] = self.labels[ID]

        return vX, iX, keras.utils.to_categorical(
            y, num_classes=self.n_classes)

1 Ответ

0 голосов
/ 27 июня 2019

Насколько я помню, вы должны вводить каждый вход как независимый массив. Например, у вас есть 2 входных изображения, у вас не должно быть массива типа [[image_1, image_2], [image_3, image_4],[image_5, image_6] ..], но вместо этого у вас должно быть что-то вроде [[image_1, image_3,image_5 ..], [image_2, image_4, image_6 ..]], как вы видите, первый массив является входным для первого изображения, а второй массив является входным для второго изображения. Это относится и к вашему делу. Просто сохраняйте входные данные в разных массивах и объединяйте их, когда вы подходите. Должно быть что-то вроде [video_frames, images]

Надеюсь, это поможет.

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