Использование td.data.Dataset с Model.fit в подклассовой модели, когда модель имеет несколько входов - PullRequest
0 голосов
/ 17 января 2020

Я использую Tensorflow 2.0, и у меня есть модель, построенная с использованием метода подклассов.

Модель является более быстрой, и для всех целей она такая же: https://github.com/dragen1860/TensorFlow-2.x-Tutorials/tree/master/16-fasterRCNN

Модель принимает четыре входа, у меня есть tf.data.dataset, который выдает эти четыре входа.

Вот как я создаю набор данных:

class COCO_DataSet():
    def __init__(self, train_dataset):
        self.train_dataset = train_dataset

    def load_image(self, image_idx):
        img, img_meta, bboxes, labels = self.train_dataset[image_idx]
        return [img, img_meta, bboxes, labels]

    def load_image_map_func(self, image_idx):
        img, img_meta, bboxes, labels = tf.py_function(
            self.load_image, [image_idx], [tf.float32, tf.float32, tf.float32, tf.float32])
        return [img, img_meta, bboxes, labels] #img, img_meta, bboxes, labels

    def create_dataset(self):

        image_idxs = np.arange(len(self.train_dataset))

        ds = tf.data.Dataset.from_tensor_slices(image_idxs)
        ds = ds.map(self.load_image_map_func, num_parallel_calls=20)

        return ds

При использовании пользовательского тренинга l oop, как в train_model.ipynb по ссылке выше, модель работает нормально.

например: это работает нормально и моделирует поезда

ds_batched = ds.padded_batch(
batch_size, padded_shapes=([None, None, None], [None], [None, None], [None]))

for batch_imgs, batch_metas, batch_bboxes, batch_labels in ds_batched :
    with tf.GradientTape() as tape:
        output = model((batch_imgs, batch_metas, batch_bboxes, batch_labels))
    # other stuff

Например: метод вызова модели распаковывает входные данные:

def call(self, inputs, training=True):
    imgs, img_metas, gt_boxes, gt_class_ids = inputs
    # Other stuff

Однако я хотел бы использовать керасы подходящая функция для обучения модели. Кажется, что функция подбора требует, чтобы входы передавались как один единственный вход, однако я не уверен, как объединить вывод padded_batch в одно значение, которое будет принимать подгонка?

Этот код:

optimizer = tf.compat.v1.train.MomentumOptimizer(1e-3, 0.9, use_nesterov=True)
model.compile(optimizer=optimizer)
ds_batched = ds.padded_batch(
    batch_size, padded_shapes=([None, None, None], [None], [None, None], [None]))
model.fit(ds_batched)

Сбой при ошибке ValueError:

ValueError: Выход генератора должен состоять из 1, 2 или 3 элементов: (input,) или (input, target) или (input, target, sample_weights)

Таким образом, он получает все четыре выхода пакета как отдельные входы. Как я могу собрать их все вместе в один вход?

Полная ошибка, если это полезно:

ValueError Traceback (последний последний вызов) в 9 #outputs = model (входы) 10 #_model = tf.keras.Model (входы = входы, выходы = выходы) ---> 11 model.fit (ds_batched, epochs = 10, steps_per_epoch = 30, validation_data = ds_batched, validation_steps = 3)

C: \ Anaconda3 \ envs \ ml-tf200 \ lib \ site-packages \ tenorsflow_core \ python \ keras \ engine \ training.py в соответствии (self, x, y, batch_size, эпохи, подробности, обратные вызовы , validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, работники, use_multiprocessing, ** kwargs) 726 max_queue_size = working_secess = 7_3029_32_pro_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_32_0_0_0_0_0_5_0_5_0_0 оценивать (self,

C: \ Anaconda3 \ envs \ ml-tf200 \ lib \ site-packages \ tenorflow_core \ python \ keras \ engine \ training_generator.py в соответствии (self, model , x, y, batch_size, эпохи, подробности, обратные вызовы, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, ** kwargs) 691 shuffle = начальное_процедурное_имя_элемента_произведения_3_произведения_перечисления_имя_переменных_переменных_представлений_переменных_переменных_процедур_переменных_символов_представления_перечисления_перечисления_перечисления_выпуска_элемент_переменного_произведения> начального_ шага> начальное_имя_перечисления_6 = 'steps_per_epoch') 694 695 def оценивать (self,

C: \ Anaconda3 \ envs \ ml-tf200 \ lib \ site-packages \ tenorflow_core \ python \ keras \ engine \ training_generator.py в модели model_iteration (модель, данные, steps_per_epoch, эпохи, подробные данные, обратные вызовы, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, рабочие, use_multiprocessing, shuffle, initial_epoch, режим, пакетная обработка_size, steps_name, step_sept_seps 220, step_segs_steps 220, step_segs_steps 220, step_segs_steps, target_name, step_seg_2, 221 batch_data = _get_next_batch (генератор) 222, если batch_data равен None: 223, если is_dataset:

C: \ Anaconda3 \ envs \ ml-tf200 \ lib \ site-packages \ tenorsflow_core \ python \ keras \ engine \ training_generator.py в _get_next_batch (генератор) 372 'Вывод генерируемых или должен быть набором из 1, 2 или 3 элементов «373»: (вход,) или (вход, цель) или «-> 374» (вход, цель, sample_weights). Получено {} '. Format (generator_output)) 375 return generator_output 376

ValueError: Выход генератора должен быть кортежем из 1, 2 или 3 элементов: (input,) или (input, target) или (input) , target, sample_weights). Получено (

    [[ -46.675,  -39.28 ,  -36.53 ],
     [ -59.675,  -45.28 ,  -41.53 ],
     [ -64.675,  -62.28 ,  -55.53 ],
     ...,
     [-106.675,  -95.28 ,  -70.53 ],
     [-109.675, -102.28 ,  -88.53 ],
     [-107.675, -100.28 ,  -81.53 ]],

    [[ -53.675,  -38.28 ,  -40.53 ],
     [ -71.675,  -65.28 ,  -63.53 ],
     [ -51.675,  -61.28 ,  -53.53 ],
     ...,
     [-108.675,  -95.28 ,  -68.53 ],
     [-108.675,  -99.28 ,  -81.53 ],
     [-103.675,  -99.28 ,  -80.53 ]],

    ...,

    [[   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     ...,
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ]],

    [[   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     ...,
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ]],

    [[   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     ...,
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ],
     [   0.   ,    0.   ,    0.   ]]]], dtype=float32)>, <tf.Tensor: id=24248, shape=(1, 11), dtype=float32, numpy=

массив ([[480., 640., 3., 432., 576., 3., 448., 576. , 3., 0.9, 0.]], dtype = float32)>, 0.9269999, 299.178, 288.95398], [1.701, 2.7899997, 138.303, 400.44598], [33.975, 62.127, 425.27698, 518.472], [1.143, 510.3, 78.41699 , 575,1], [82,521, 531,018, 168,984, 574,776], [78,597, 225,252, 196,875, 334,584]]], dtype = float32)>,)

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