web-dev-qa-db-fra.com

Comment importer un jeu de données MNIST pré-téléchargé à partir d'un répertoire ou d'un dossier spécifique?

J'ai téléchargé le jeu de données MNIST à partir du site LeCun. Ce que je veux, c'est écrire le code Python afin d'extraire le gzip et lire le jeu de données directement à partir du répertoire, ce qui signifie que je n'ai plus besoin de télécharger ni d'accéder au site MNIST. 

Processus souhaité: Accéder au dossier/répertoire -> extraire gzip -> lire le jeu de données (un encodage à chaud)

Comment faire? Comme presque tous les tutoriels doivent accéder au site LeCun ou Tensoflow pour télécharger et lire le jeu de données. Merci d'avance!

5
Joshua

Cet appel de tensorflow

from tensorflow.examples.tutorials.mnist import input_data
input_data.read_data_sets('my/directory')

... ne téléchargera pas rien cela si vous avez déjà les fichiers là-bas.

Mais si, pour une raison quelconque, vous souhaitez décompresser le fichier vous-même, voici comment procéder:

from tensorflow.contrib.learn.python.learn.datasets.mnist import extract_images, extract_labels

with open('my/directory/train-images-idx3-ubyte.gz', 'rb') as f:
  train_images = extract_images(f)
with open('my/directory/train-labels-idx1-ubyte.gz', 'rb') as f:
  train_labels = extract_labels(f)

with open('my/directory/t10k-images-idx3-ubyte.gz', 'rb') as f:
  test_images = extract_images(f)
with open('my/directory/t10k-labels-idx1-ubyte.gz', 'rb') as f:
  test_labels = extract_labels(f)
6
Maxim

Si vous avez les données MNIST extraites, vous pouvez les charger directement à bas niveau avec NumPy:

def loadMNIST( prefix, folder ):
    intType = np.dtype( 'int32' ).newbyteorder( '>' )
    nMetaDataBytes = 4 * intType.itemsize

    data = np.fromfile( folder + "/" + prefix + '-images-idx3-ubyte', dtype = 'ubyte' )
    magicBytes, nImages, width, height = np.frombuffer( data[:nMetaDataBytes].tobytes(), intType )
    data = data[nMetaDataBytes:].astype( dtype = 'float32' ).reshape( [ nImages, width, height ] )

    labels = np.fromfile( folder + "/" + prefix + '-labels-idx1-ubyte',
                          dtype = 'ubyte' )[2 * intType.itemsize:]

    return data, labels

trainingImages, trainingLabels = loadMNIST( "train", "../datasets/mnist/" )
testImages, testLabels = loadMNIST( "t10k", "../datasets/mnist/" )

Et pour convertir en encodage à chaud:

def toHotEncoding( classification ):
    # emulates the functionality of tf.keras.utils.to_categorical( y )
    hotEncoding = np.zeros( [ len( classification ), 
                              np.max( classification ) + 1 ] )
    hotEncoding[ np.arange( len( hotEncoding ) ), classification ] = 1
    return hotEncoding

trainingLabels = toHotEncoding( trainingLabels )
testLabels = toHotEncoding( testLabels )
4
mxmlnkn

Je vais montrer comment le charger à partir de zéro (pour une meilleure compréhension) et montrer comment afficher une image numérique à l'aide de matplotlib.pyplot

import cPickle
import gzip
import numpy as np
import matplotlib.pyplot as plt

def load_data():
    path = '../../data/mnist.pkl.gz'
    f = gzip.open(path, 'rb')
    training_data, validation_data, test_data = cPickle.load(f)
    f.close()

    X_train, y_train = training_data[0], training_data[1]
    print X_train.shape, y_train.shape
    # (50000L, 784L) (50000L,)

    # get the first image and it's label
    img1_arr, img1_label = X_train[0], y_train[0]
    print img1_arr.shape, img1_label
    # (784L,) , 5

    # reshape first image(1 D vector) to 2D dimension image
    img1_2d = np.reshape(img1_arr, (28, 28))
    # show it
    plt.subplot(111)
    plt.imshow(img1_2d, cmap=plt.get_cmap('gray'))
    plt.show()

 enter image description here

Vous pouvez également vectoriser l'étiquette en a 10-dimensional unit vector par cet exemple de fonction:

def vectorized_result(label):
    e = np.zeros((10, 1))
    e[label] = 1.0
    return e

vectoriser l'étiquette ci-dessus:

print vectorized_result(img1_label)
# output as below:
[[ 0.]
 [ 0.]
 [ 0.]
 [ 0.]
 [ 0.]
 [ 1.]
 [ 0.]
 [ 0.]
 [ 0.]
 [ 0.]]

Si vous voulez le traduire en entrée CNN, vous pouvez le remodeler comme suit:

def load_data_v2():
    path = '../../data/mnist.pkl.gz'
    f = gzip.open(path, 'rb')
    training_data, validation_data, test_data = cPickle.load(f)
    f.close()

    X_train, y_train = training_data[0], training_data[1]
    print X_train.shape, y_train.shape
    # (50000L, 784L) (50000L,)

    X_train = np.array([np.reshape(item, (28, 28)) for item in X_train])
    y_train = np.array([vectorized_result(item) for item in y_train])

    print X_train.shape, y_train.shape
    # (50000L, 28L, 28L) (50000L, 10L, 1L)
3
Jayhello