Я намагаюся навчити свою модель, яка класифікує зображення. Проблема у мене полягає в тому, що вони мають різні розміри. як відформатувати зображення / архітектуру моделі?
Я намагаюся навчити свою модель, яка класифікує зображення. Проблема у мене полягає в тому, що вони мають різні розміри. як відформатувати зображення / архітектуру моделі?
Відповіді:
Ви не сказали, про яку архітектуру ви говорите. Оскільки ви сказали, що хочете класифікувати зображення, я припускаю, що це частково згорнута, частково повністю підключена мережа, така як 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 завжди отримували постійні розмірні вектори як вхідні дані. Під час навчання тренуйте зображення з усього набору даних, використовуючи певний розмір зображення протягом однієї епохи. Потім на наступну епоху перейдіть на інший розмір зображення і продовжуйте тренування.