Я никогда не использовал 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-изображениям, вы не используете их снова, а только оставшаяся часть, так как идея состоит в том, чтобы проверить обучение на данных, которые сеть еще не видела.