Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.2K
Vistas
¿Cómo normalizar una matriz numpy 4D?

Tengo una matriz numpy tridimensional de imágenes ( conjunto de datos CIFAR-10 ). La forma de la matriz de imágenes es la siguiente:

 a = np.random.rand(32, 32, 3)

Antes de realizar un aprendizaje profundo, quiero normalizar los datos para obtener un mejor resultado. Con una matriz 1D, sé que podemos hacer una normalización min max como esta:

 v = np.random.rand(6) (v - v.min())/(v.max() - v.min()) Out[68]: array([ 0.89502294, 0. , 1. , 0.65069468, 0.63657915, 0.08932196])

Sin embargo, cuando se trata de una matriz 3D, estoy totalmente perdido. En concreto, tengo las siguientes preguntas:

  1. ¿A lo largo de qué eje tomamos el mínimo y el máximo?
  2. ¿Cómo implementamos esto con la matriz 3D?

¡Aprecio tu ayuda!


EDITAR: Resulta que necesito trabajar con una matriz 4D Numpy con forma (202, 32, 32, 3) , por lo que la primera dimensión sería el índice de la imagen y las últimas 3 dimensiones son la imagen real. Sería genial si alguien me puede proporcionar el código para normalizar una matriz 4D de este tipo. ¡Gracias!


EDIT 2: gracias al código de @Eric a continuación, lo descubrí:

 x_min = x.min(axis=(1, 2), keepdims=True) x_max = x.max(axis=(1, 2), keepdims=True) x = (x - x_min)/(x_max-x_min)
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Suponiendo que está trabajando con datos de imagen de forma (W, H, 3) , probablemente debería normalizar cada canal ( axis=2 ) por separado, como se menciona en la otra respuesta.

Puedes hacer esto con:

 # keepdims makes the result shape (1, 1, 3) instead of (3,). This doesn't matter here, but # would matter if you wanted to normalize over a different axis. v_min = v.min(axis=(0, 1), keepdims=True) v_max = v.max(axis=(0, 1), keepdims=True) (v - v_min)/(v_max - v_min)
over 4 years ago · Santiago Trujillo Denunciar

0

  1. ¿A lo largo de qué eje tomamos el mínimo y el máximo?

Para responder a esto, probablemente necesitemos más información sobre sus datos, pero en general, cuando se habla de imágenes de 3 canales, por ejemplo, normalizaríamos el uso de los valores mínimo y máximo por canal. esto significa que realizaríamos la normalización 3 veces, una por canal. Aquí hay un ejemplo:

 img = numpy.random.randint(0, 100, size=(10, 10, 3)) # Generating some random numbers img = img.astype(numpy.float32) # converting array of ints to floats img_a = img[:, :, 0] img_b = img[:, :, 1] img_c = img[:, :, 2] # Extracting single channels from 3 channel image # The above code could also be replaced with cv2.split(img) << which will return 3 numpy arrays (using opencv) # normalizing per channel data: img_a = (img_a - numpy.min(img_a)) / (numpy.max(img_a) - numpy.min(img_a)) img_b = (img_b - numpy.min(img_b)) / (numpy.max(img_b) - numpy.min(img_b)) img_c = (img_c - numpy.min(img_c)) / (numpy.max(img_c) - numpy.min(img_c)) # putting the 3 channels back together: img_norm = numpy.empty((10, 10, 3), dtype=numpy.float32) img_norm[:, :, 0] = img_a img_norm[:, :, 1] = img_b img_norm[:, :, 2] = img_c

Editar: se me acaba de ocurrir que una vez que tenga los datos de un canal (imagen de 32x32, por ejemplo), simplemente puede usar:

 from sklearn.preprocessing import normalize img_a_norm = normalize(img_a)
  1. ¿Cómo trabajamos con la matriz 3D?

Bueno, esta es una gran pregunta. Si necesita funciones como min y max en forma de matriz, usaría las versiones de Numpy. La indexación, por ejemplo, se logra a través de separadores de todo el eje, como puede ver en mi ejemplo anterior. Además, consulte la documentación de Numpy de ndarray @ https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html para obtener más información. realmente tienen un increíble conjunto de herramientas para arreglos n-dimensionales.

over 4 years ago · Santiago Trujillo Denunciar

0

Hay diferentes enfoques aquí. Puede decidir normalizar todo el lote de imágenes o normalizar por imagen individual. Para hacerlo, puede usar la media de una sola imagen o usar la media de todo el lote de imágenes o usar una media fija de otro conjunto de datos; por ejemplo, puede usar el valor medio de ImageNet .

Si desea hacer lo mismo que tf.image.per_image_standardization de tf.image.per_image_standardization , debe normalizar por imagen individual con la media de esta imagen. Entonces recorre todas las imágenes y realiza la normalización para todos los ejes en una sola imagen como esta:

 import math import numpy as np from PIL import Image # open images image_1 = Image.open("your_image_1.jpg") image_2 = Image.open("your_image_2.jpg") images = [image_1, image_2] images = np.array(images) standardized_images = [] # standardize images for image in images: mean = image.mean() stddev = image.std() adjusted_stddev = max(stddev, 1.0/math.sqrt(image.size)) standardized_image = (image - mean) / adjusted_stddev standardized_images.append(standardized_image) standardized_images = np.array(standardized_images)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda