tutorial - tensorflow python
¿Cómo entrenar imágenes, cuando tienen un tamaño diferente? (2)
Intenta hacer una capa de agrupación de pirámides espaciales. Luego póngalo después de su última capa de convolución para que las capas FC siempre obtengan vectores dimensionales constantes como entrada. Durante el entrenamiento, entrene las imágenes de todo el conjunto de datos utilizando un tamaño de imagen particular para una época. Luego, para la próxima época, cambie a un tamaño de imagen diferente y continúe el entrenamiento.
Estoy tratando de entrenar a mi modelo que clasifica las imágenes. El problema que tengo es que tienen diferentes tamaños. ¿Hay alguna posibilidad de entrenar esas imágenes sin cambiar su tamaño?
No dijiste de qué arquitectura estás hablando. Dado que usted dijo que desea clasificar las imágenes, supongo que es una red parcialmente convolucional, en parte totalmente conectada, como AlexNet, GoogLeNet, etc. En general, la respuesta a su pregunta depende del tipo de red con la que esté trabajando.
Si, por ejemplo, su red solo contiene unidades convolucionales, es decir, no contiene capas completamente conectadas, puede ser invariable al tamaño de la imagen de entrada. Dicha red podría procesar las imágenes de entrada y, a su vez, devolver otra imagen ("convolucional hasta el final"); tendrías que asegurarte de que la salida coincida con lo que esperas, ya que tienes que determinar la pérdida de alguna manera, por supuesto.
Sin embargo, si está utilizando unidades totalmente conectadas, tiene problemas: aquí tiene un número fijo de pesos aprendidos con los que su red tiene que trabajar, por lo que las entradas variables requerirían un número variable de pesos, y eso no es posible.
Si ese es su problema, aquí hay algunas cosas que puede hacer:
- No me importa aplastar las imágenes. Una red podría aprender a dar sentido al contenido de todos modos; ¿La escala y la perspectiva significan algo para el contenido de todos modos?
-
Recorta el centro de las imágenes a un tamaño específico.
Si temes perder datos, haz varios cultivos y úsalos para aumentar tus datos de entrada, de modo que la imagen original se divida en
N
imágenes diferentes del tamaño correcto. - Rellene las imágenes con un color sólido a un tamaño cuadrado, luego cambie el tamaño.
- Haz una combinación de eso.
La opción de relleno puede introducir una fuente de error adicional para la predicción de la red, ya que la red podría (leer: probablemente) estará sesgada a las imágenes que contienen dicho borde relleno.
Si necesita algunas ideas, eche un vistazo a la sección
Images
de la documentación de TensorFlow, hay piezas como
resize_image_with_crop_or_pad
que eliminan el trabajo más grande.
En cuanto a no preocuparse por el aplastamiento, here''s una parte de la tubería de preprocesamiento de la famosa red 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)
Son totalmente conscientes de ello y lo hacen de todos modos.
Dependiendo de cuán lejos quiera o necesite ir, en realidad hay un documento here llamado Spatial Pyramid Pooling in Deep Convolution Networks for Visual Recognition que maneja entradas de tamaños arbitrarios al procesarlas de una manera muy especial.