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!
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)
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 )
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()
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)