#python #tensorflow #keras #deep-learning #dataset
#питон #тензорный поток #keras #глубокое обучение
Вопрос:
Я тренирую классификатор и рефакторирую старый код, в котором использовался keras.Последовательность. Я завернул свой объект генератора в tf.data.Dataset.from_generator и попытался использовать чередование для параллельной загрузки изображений, как предлагает учебник TF.
мой код:
train_generator = WindowBatchGenerator(train_fn, config, shuffle=True, jitter=True, norm=normalize) test_generator = WindowBatchGenerator(test_fn, config, shuffle=False, jitter=False, norm=normalize) train_ds = tf.data.Dataset.interleave( lambda s: tf.data.Dataset.from_generator( lambda: (s for s in train_generator), output_signature=( tf.TensorSpec(shape=([config['BATCH_SIZE'], config['IMAGE_H'], config['IMAGE_W'], 3]), dtype=tf.float64), tf.TensorSpec(shape=(config['BATCH_SIZE'], 3), dtype=tf.float64))), num_parallel_calls=tf.data.AUTOTUNE) test_ds = tf.data.Dataset.interleave( lambda _: tf.data.Dataset.from_generator( lambda: (s for s in test_generator), output_signature=( tf.TensorSpec(shape=([config['BATCH_SIZE'], config['IMAGE_H'], config['IMAGE_W'], 3]), dtype=tf.float64), tf.TensorSpec(shape=(config['BATCH_SIZE'], 3), dtype=tf.float64))), num_parallel_calls=tf.data.AUTOTUNE) train_ds = train_ds.prefetch(tf.data.AUTOTUNE) test_ds = test_ds.prefetch(tf.data.AUTOTUNE) model = tf.keras.applications.ResNet50(input_shape=(128, 128, 3), include_top=False) x = tf.keras.layers.GlobalAveragePooling2D()(model.output) output = tf.keras.layers.Dense(3, activation='softmax')(x) model = tf.keras.Model(inputs=[model.inputs], outputs=[output]) opt = tf.keras.optimizers.Adam(learning_rate=1e-4) loss = tf.keras.losses.CategoricalCrossentropy() model.compile(optimizer=opt, loss=loss, metrics=['accuracy']) model.fit(train_ds, validation_data=test_ds, epochs=5, verbose=1)
Я получаю ошибку типа:
TypeError: interleave() missing 1 required positional argument: 'map_func'
Несколько вещей:
- Почему я получаю эту ошибку?
- WindowBatchGenerator-это класс последовательности. он одновременно загружает изображения и метки, а также выполняет некоторое увеличение этих изображений.
- Я хочу распараллелить загрузку данных, так как это узкое место в моей модели.
- Должен ли я использовать tf.данные.Набор данных.карта или чередование?
- Я знаю, что сначала нужно сгенерировать idx, а затем сопоставить его с «load_data_func», а затем сопоставить изображение с «augment_image_func». Но вот тф.данные.Объект набора данных получает данные после увеличения, это проблема?
Спасибо!