Red de conocimiento informático - Material del sitio web - Cómo analizar mnist con Python

Cómo analizar mnist con Python

1. Primero echemos un vistazo a la estructura de datos de mnist:

2

Puedes ver que en train-images.idx3-ubyte, el primer número es de 32 bits. entero (el número mágico, el número de tipos de imágenes), el segundo número es un entero de 32 bits (el número de imágenes), el tercer y cuarto números también son enteros de 32 bits (el número de filas y columnas de la imagen). ). (el número de filas y columnas de la imagen respectivamente), seguido de un número sin signo de un byte (es decir, píxeles, que van de 0 a 255), por lo que solo necesitamos obtener el número mágico y el número de imágenes en secuencia, y luego obtenga la imagen. El largo y el ancho se pueden leer píxel a píxel.

3. ¿Cómo utilizar Python para analizar datos? Primero, debe instalar la biblioteca de procesamiento de gráficos PIL de Python. Esta biblioteca admite el procesamiento de imágenes a nivel de píxeles y es muy útil para aprender a procesar imágenes digitales. Una vez instalado, es hora de analizar las imágenes. Mire el código:

4. Primero abra el archivo y luego lea el número mágico, el número de imágenes, el número de filas y columnas respectivamente. En la estructura, puede ver que '>. Se utiliza IIII'. ¿Qué es esto? Significa usar reglas big endian para leer cuatro números enteros (Entero). Si desea leer un byte, puede usar '>B' (por supuesto, esto es lo mismo que no usar reglas big endian, por lo que solo dos o más bytes). son útiles).

5. ¿Qué son las reglas big-endian? Si no lo entiende, puede consultar Baidu, por lo que no entraré en detalles aquí (/link?url=Bgg8b0vRr3b_SeGyOl8U4DmAbIQT9swGuNtD_21ctEI_NliqsQ-mKF73YT90EILF2EQy50mEua_M4z6Cma3rmK)

6. imagen en blanco, donde "L" representa la imagen en escala de grises. Finalmente, se lee píxel por píxel, luego se escribe en una imagen en blanco y finalmente se guarda la imagen.

7. Echemos un vistazo a la estructura de datos de la etiqueta mnist:

Se puede encontrar que es muy similar a la estructura anterior, excepto que cada byte aquí es un byte.

8. Bueno, a través de la explicación anterior, finalmente podemos analizar mnist a través de Python y ver el efecto:

El código fuente del programa es el siguiente:

#! /usr/bin/env python

# -*- Codificación: utf-8 -*-

desde PIL importar imagen

importar estructura

def read_image(nombre de archivo):

f = open(nombre de archivo, 'rb')

index = 0

buf = f.read()

f.close()

magia, imágenes, filas, columnas = struct.unpack_from('>IIII' , buf , index)

index += struct.calcsize('>IIII')

para i en xrange(images):

#para i en xrange(2000):

imagen = Imagen .new( 'L', (columnas, filas))

para x en xrange(filas):

para y en xrange(columnas):

image.putpixel((y, x), int(struct.unpack_from('>. B', buf, index)[0]))

index += struct.calcsize('>B')

imprimir 'guardar ' + str(i) + 'imagen'

imagen.save('prueba/' + str(i) + '.

png')

def read_label(nombre de archivo, guardarnombre de archivo):

f = open(nombre de archivo, 'rb')

índice = 0

buf = f.read()

f.close()

magia, etiquetas = struct.unpack_from('>II', buf, index)

index += struct.

labelArr = [0] * etiquetas

# labelArr = [0] * 2000

para x en xrange(labels):

#para x en xrange(2000):

labelArr[x] = int(struct.unpack_from('>B', buf. index)[0 ])

index += struct.calcsize('>B')

save = open(saveFilename, 'w')

save.write(' ,'.join(map(lambda x: str(x), labelArr)))

save.write('\n')

save.close()

imprimir 'guardar etiquetas exitosamente'

if __name__ == '__main__':

read_ image('t10k-images.idx3-ubyte')

read_label('t10k-labels.idx1-ubyte', 'test/label.txt')