web-dev-qa-db-ger.com

Wie importiert man vorab heruntergeladenes MNIST-Dataset aus einem bestimmten Verzeichnis oder Ordner?

Ich habe den MNIST-Datensatz von der LeCun-Site heruntergeladen. Ich möchte den Python-Code schreiben, um den gzip zu extrahieren und das Dataset direkt aus dem Verzeichnis zu lesen. Das bedeutet, dass ich nicht mehr die MNIST-Site herunterladen oder darauf zugreifen muss. 

Desire-Prozess: Zugriff auf Ordner/Verzeichnis -> Extrahieren von GZIP -> Lesen von Dataset (eine Hot-Codierung)

Wie es geht? Da fast alle Tutorials auf die LeCun- oder Tensoflow-Site zugreifen müssen, um den Datensatz herunterzuladen und zu lesen. Danke im Voraus!

5
Joshua

Dieser Tensorflow-Aufruf

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

... lädt nichts herunter, wenn Sie die Dateien bereits dort haben.

Wenn Sie es jedoch aus irgendeinem Grund selbst entpacken möchten, gehen Sie wie folgt vor:

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

Wenn Sie die MNIST-Daten extrahiert haben, können Sie sie direkt mit NumPy laden:

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/" )

Und in Hot-Encoding konvertieren:

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

Ich werde zeigen, wie man es von Grund auf neu lädt (zum besseren Verständnis), und zeigen, wie man ein Ziffernbild von ihm zeigt, indem man 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

Mit dieser Beispielfunktion können Sie das Label auch in a 10-dimensional unit vector vektorisieren:

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

vektorisieren Sie das obige Etikett:

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

Wenn Sie es in eine CNN-Eingabe übersetzen möchten, können Sie es wie folgt umformen:

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