Загрузка только определенных цифр MNIST - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь загрузить только часть базы данных MNIST рукописных цифр для проекта.В частности, я хочу, чтобы только цифры 0, 1, 2 и 3 отправлялись в нейронную сеть.

В настоящее время я загружаю данные, подобные этим (основанные на «Нейронные сети и глубокое обучение» МихалаДаниэль Добрзански ):

import cPickle
import gzip
import numpy as np

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

def load_data_wrapper():
    tr_d, va_d, te_d = load_data()
    training_inputs = [np.reshape(x, (784, 1)) for x in tr_d[0]]
    training_results = [vectorized_result(y) for y in tr_d[1]]
    training_data = zip(training_inputs, training_results)
    validation_inputs = [np.reshape(x, (784, 1)) for x in va_d[0]]
    validation_data = zip(validation_inputs, va_d[1])
    test_inputs = [np.reshape(x, (784, 1)) for x in te_d[0]]
    test_data = zip(test_inputs, te_d[1])
    return (training_data, validation_data, test_data)

Я пытался создать функцию, создающую новые наборы данных из load_data() перед отправкой в ​​load_data_wrapper() (путем изменения tr_d, va_d, te_d = load_data() на tr_d, va_d, te_d = digitTest() в load_data_wrapper()), без везения, см. ниже:

def digitTest():
    tr_d, va_d, te_d = load_data()
    tr_d = list(tr_d)
    va_d = list(va_d)
    te_d = list(te_d)

    newTrD = []
    newTrD.append([])
    newTrD.append([])

    newVaD = []
    newVaD.append([])
    newVaD.append([])

    newTeD = []
    newTeD.append([])
    newTeD.append([])

    for index,label in enumerate(tr_d[1]):
        if tr_d[1][index] < 4:
            newTrD[0].append(tr_d[0][index])
            newTrD[1].append(tr_d[1][index])

    for index,label in enumerate(va_d[1]):
        if va_d[1][index] < 4:
            newVaD[0].append(va_d[0][index])
            newVaD[1].append(va_d[1][index])

    for index,label in enumerate(te_d[1]):
        if te_d[1][index] < 4:
            newTeD[0].append(te_d[0][index])
            newTeD[1].append(te_d[1][index])

    return (newTrD, newVaD, newTeD)

Возможно ли достичь того, что я пытаюсь?Как я могу это сделать?Обратите внимание, что данные хранятся в кортежах при разборе из функции load_data.

1 Ответ

0 голосов
/ 30 декабря 2018

Я никогда не использовал cPickle для загрузки набора данных mnist, и я не знаю, что он возвращает.Читая ваш код, кажется, вы все сделали правильно, однако, если вы скажете, что он не работает, я полагаю, что что-то не так с тем, что или как cPickle возвращает данные.

У меня нет Python 2, поэтому я не могу отладить вашкод но:

Я склонен делать это сам:

def loadSet(values_path, labels_path):
    labels = []
    # labels:
    # 0000     32 bit integer  0x00000803(2051) magic number
    # 0008     32 bit integer  28               number of labels
    # 0009     unsigned byte   ??               label
    # 0010     unsigned byte   ??               label
    # ....     unsigned byte   ??               label

    with open(labels_path, 'rb') as f:
        m_number = int.from_bytes(f.read(4,), 'big')
        num_labels = int.from_bytes(f.read(4), 'big')
        for i in range(num_labels):
            labels.append(int.from_bytes(f.read(1), 'big'))

    images = []
    # images:
    # 0000     32 bit integer  0x00000803(2051) magic number
    # 0004     32 bit integer  60000            number of images
    # 0008     32 bit integer  28               number of rows
    # 0012     32 bit integer  28               number of columns
    # 0016     unsigned byte   ??               pixel
    # 0020     unsigned byte   ??               pixel
    # ....     unsigned byte   ??               pixel

    with open(values_path, 'rb') as f:
        m_number = int.from_bytes(f.read(4), 'big')
        num_images = int.from_bytes(f.read(4), 'big')
        num_rows = int.from_bytes(f.read(4), 'big')
        num_cols = int.from_bytes(f.read(4), 'big')
        for i in range(num_images):
            image = []
            for x in range(num_rows * num_cols):
                image.append(int.from_bytes(f.read(1), 'big'))
            images.append(image)

Эта функция будет загружать набор меток mnist и значений из файлов.Вы можете получить набор данных на http://yann.lecun.com/exdb/mnist/, и вам придется распаковать файлы.Метки были бы «train-tags.idx1-ubyte».Просто передайте путь для обучения меток и изображений или тестовых меток и изображений в функцию, и она загрузит эти значения.

Возвращаемое значение - кортеж из двух списков:

([number], [pixels])

где пикселиэто сам список.

Также здесь не выполняется проверка ошибок, кроме выдачи исключений, если файл не существует или (возможно), если он искажен, так что вы можете захотеть проверить это каким-либо образом.

IЯ также не привык к numpy, я обычно работаю в c ++ и java, но вы наверняка можете легко преобразовать эти значения в numpy массивы - просто прочитайте эту тему.

Фильтрация этих файлов теперь довольно проста, и вам следуетбыть в состоянии использовать ваш подход для digitTest сейчас.

Как вы можете видеть, если вы используете оригинальный набор данных mnist, вы получаете только обучающие и тестовые изображения.Здесь происходит то, что вы берете часть одного из наборов и используете его как - я не совсем уверен в вашей формулировке здесь - тестовые данные для оценки прогресса в обучении.После окончания обучения вы используете файлы «t10k», чтобы проверить, насколько хорошо обучены в сети.Здесь важно то, что если вы разделяете свои тестовые данные по этим t10k-изображениям, вы не используете их снова, а только оставшаяся часть, так как идея состоит в том, чтобы проверить обучение на данных, которые сеть еще не видела.

...