Я пытаюсь обучить свою модель, которая классифицирует изображения. У меня проблема в том, что у них разные размеры. как мне отформатировать мои изображения / или архитектуру модели?
Я пытаюсь обучить свою модель, которая классифицирует изображения. У меня проблема в том, что у них разные размеры. как мне отформатировать мои изображения / или архитектуру модели?
Ответы:
Вы не сказали, о какой архитектуре говорите. Поскольку вы сказали, что хотите классифицировать изображения, я предполагаю, что это частично сверточная, частично полностью связанная сеть, такая как AlexNet, GoogLeNet и т. Д. В общем, ответ на ваш вопрос зависит от типа сети, с которой вы работаете.
Если, например, ваша сеть содержит только сверточные блоки, т. Е. Не содержит полностью связанных слоев, она может быть инвариантной по отношению к размеру входного изображения. Такая сеть могла бы обрабатывать входные изображения и, в свою очередь, возвращать другое изображение («полностью сверточное»); вам нужно будет убедиться, что результат соответствует тому, что вы ожидаете, поскольку, конечно, вы должны каким-то образом определить потери.
Однако если вы используете полностью подключенные устройства, у вас могут возникнуть проблемы: здесь у вас есть фиксированное количество изученных весов, с которыми ваша сеть должна работать, поэтому для различных входных данных потребуется разное количество весов - а это невозможно.
Если это ваша проблема, вы можете сделать следующее:
N
разные изображения правильного размера.Параметр заполнения может внести дополнительный источник ошибок в предсказание сети, поскольку сеть может (читай: вероятно, будет) смещаться к изображениям, которые содержат такую заполненную границу. Если вам нужны идеи, загляните в раздел изображений в документации TensorFlow, там есть такие вещи, resize_image_with_crop_or_pad
которые снимают большую работу.
Что касается того, чтобы просто не заботиться о раздавливании, вот часть конвейера предварительной обработки известной сети Inception:
# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.
# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
distorted_image,
lambda x, method: tf.image.resize_images(x, [height, width], method=method),
num_cases=num_resize_cases)
Они полностью осознают это и все равно это делают.
В зависимости от того , насколько вы хотите , или нужно идти, там на самом деле документ здесь называется Spatial Пирамида Пулы в глубоких сверточных сетей для визуального распознавания , который обрабатывает входы произвольных размеров по обработке их в совершенно особым образом.
Попробуйте создать слой пула пространственной пирамиды. Затем поместите его после вашего последнего сверточного слоя, чтобы слои FC всегда получали в качестве входных данных векторы постоянной размерности. Во время обучения обучайте изображения из всего набора данных, используя определенный размер изображения для одной эпохи. Затем для следующей эпохи переключитесь на другой размер изображения и продолжите тренировку.