Как читать базу данных MNIST в R?

В настоящее время я работаю над тематическим исследованием, для которого мне нужно работать в базе данных MNIST.
Файлы в этот сайт, как говорят, находятся в формате файла IDX. Я попытался взглянуть на эти файлы, используя основные текстовые редакторы, такие как блокнот и текстовый блок, но не повезло. Ожидая, что они будут в формате high endian, я попробовал следующее:

to.read = file("t10k-images.idx3-ubyte", "rb")
readBin(to.read, integer(), n=100, endian = "high")

Я получил некоторые числа в качестве вывода, но ни один из них не имел никакого смысла для меня.

Может кто-нибудь объяснить, как читать файлы базы данных MNIST в R и как интерпретировать эти числа? Спасибо.

Ответ 1

endian="big", а не "high":

> to.read = file("~/Downloads/t10k-images-idx3-ubyte", "rb")

магическое число:

> readBin(to.read, integer(), n=1, endian="big")
[1] 2051

количество изображений:

> readBin(to.read, integer(), n=1, endian="big")
[1] 10000

количество рядов:

> readBin(to.read, integer(), n=1, endian="big")
[1] 28

Число столбцов:

> readBin(to.read, integer(), n=1, endian="big")
[1] 28

вот данные:

> readBin(to.read, integer(), n=1, endian="big")
[1] 0
> readBin(to.read, integer(), n=1, endian="big")
[1] 0

в соответствии с описанием данных об обучающем наборе на веб-сайте.

Теперь вам просто нужно зациклить и прочитать 28 * 28-байтовые куски в матрицы.

Начать снова:

 > to.read = file("~/Downloads/t10k-images-idx3-ubyte", "rb")

пропустить заголовок:

> readBin(to.read, integer(), n=4, endian="big")
[1]  2051 10000    28    28

должно действительно получить 28,28 из заголовка, прочитанного, но жестко запрограммированного здесь:

 > m = matrix(readBin(to.read,integer(), size=1, n=28*28, endian="big"),28,28)
 > image(m)

Возможно, нужно переставить или перевернуть матрицу, я думаю, это перевернутая "7".

par(mfrow=c(5,5))
par(mar=c(0,0,0,0))
for(i in 1:25){m = matrix(readBin(to.read,integer(), size=1, n=28*28, endian="big"),28,28);image(m[,28:1])}

получает вас:

enter image description here

О, и Google приводит меня к: http://www.inside-r.org/packages/cran/darch/docs/readMNIST, что может быть полезно.

Ответ 2

Следуя вышеупом нутому пакету darch (не ~ darch ~):

Пакет называется darch. Он был перенесен в MRAN (прикладная сеть Microsoft R), но также доступен в CRAN.

Он предоставляет две функции для данных MNIST:

readMNIST, который считывает файлы ubyte, хранящиеся на вашем жестком диске, и сохраняет их как архивы test.Rdata и train.Rdata.

provideMNIST, который загрузит файлы и вызовет readMNIST на них.

При вызове этих функций вам нужно указать имена каталогов, разделенные одной косой чертой, например. readMNIST("..\MNIST\") (требуется последняя косая черта).

Если вы сами загружаете файлы, вам нужно будет изменить имена файлов: gz-архивы содержат файлы с расширениями, например t10k-labels.idx1-ubyte, но readMNIST ищет файлы без расширения, например t10k-labels-idx1 -ubyte, поэтому вам нужно изменить точку на тире (с помощью darch version 0.12.0, возможно, они исправит это).

Чтобы загрузить файлы в R, вам нужно использовать функцию load (например, load("..\\MNIST\\test.Rdata")). Это создаст шаблоны trainData и testData в среде.

По какой-то причине я не получал никаких dimnames для матриц.

Ответ 3

Здесь вы можете сделать это с помощью пакета Darch:

Run readMNIST('C:/Users/pj_/Dir/')

Будет храниться test.RData и train.RData в вашем каталоге. Когда вы загружаете эти два файла в свою Рабочую область, вы сможете увидеть "testData", "testLabels", "trainData" и "trainLabels" в своей глобальной среде.

Ответ 4

Я попытался выше, используя:

data <- readBin(to.read, integer(), size = 1, n = 784, endian="big")

но в конечном итоге с положительными и отрицательными целыми числами в изображении. Следовательно, при построении, используя:

plot(as.cimg(data))

Я получаю серый фон с символом в пикселях, которые темнее или светлее фона.

Затем я использовал: (см. [1] https://tensorflow.rstudio.com/tfestimators/articles/examples/mnist.html)

data <- readBin(to.read, what = "raw", n = 784, endian="big")
conv <- as.integer(data)
mm <- matrix(conv, 28, 28)

Теперь у меня есть только положительные значения (от 0 до 255), и график дает правильный белый символ на черном фоне. Что я и хотел.

Ответ 5

Набор данных MNIST также доступен в пакете keras.

library(keras)
mnist <- dataset_mnist()
x_train <- mnist$train$x
y_train <- mnist$train$y
x_test <- mnist$test$x
y_test <- mnist$test$y