Я работаю с набором данных MNIST и применяю к нему различные методы классификации, но время выполнения у меня просто смешное, поэтому я ищу способ, возможно, использовать часть обучающей части набора, но сохранить тестовую часть на уровне 10 КБ. Я пробовал много разных вариантов, но ничего не работает.
Мне нужно взять выборку либо из всего набора, либо снизить обучающие x и y с 60 000 до, возможно, 20 000.
Мой текущий код:
library(keras)
mnist <- dataset_mnist()
train_images <- mnist$train$x
train_labels <- mnist$train$y
test_images <- mnist$test$x
test_labels <- mnist$test$y
Я пытался использовать функцию sample() и другие типы разделения, но безрезультатно.





В следующем примере я сам загружаю MNIST и загружаю его через reticulate/numpy. Не должно иметь большого значения. Если вы хотите получить выборку с помощью sample(), вы обычно берете выборку индексов, которые будете использовать для подмножества. Чтобы получить сбалансированную выборку, вы можете получить определенное число или пропорцию из каждой группы меток:
library(reticulate)
library(dplyr)
# Download MNIST dataset as numpy npz,
# load through reticulate, build something along the lines of keras::dataset_mnist() output
np <- import("numpy")
mnist_npz <- curl::curl_download("https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz", "mnist.npz")
mnist_np <- np$load(mnist_npz)
mnist_lst <- list(
train = list(
x = mnist_np[["x_train"]],
y = mnist_np[["y_train"]]
),
test = list(
x = mnist_np[["x_test"]],
y = mnist_np[["y_test"]]
)
)
train_images <- mnist_lst$train$x
train_labels <- mnist_lst$train$y
test_images <- mnist_lst$test$x
test_labels <- mnist_lst$test$y
# sample row indices,
# 100 per class to keep the dataset balanced
sample_idx <-
train_labels |>
tibble(y = _) |>
tibble::rowid_to_column("idx") |>
slice_sample(n = 100, by = y ) |>
arrange(idx) |>
pull(idx)
# use sample_idx for subsetting
train_images_sample <- train_images[sample_idx,,]
train_labels_sample <- train_labels[sample_idx]
str(train_images_sample)
#> int [1:1000, 1:28, 1:28] 0 0 0 0 0 0 0 0 0 0 ...
str(train_labels_sample)
#> int [1:1000(1d)] 9 7 5 6 8 7 7 5 2 9 ...
# original label distribution
table(train_labels)
#> train_labels
#> 0 1 2 3 4 5 6 7 8 9
#> 5923 6742 5958 6131 5842 5421 5918 6265 5851 5949
# sample distribution
table(train_labels_sample)
#> train_labels_sample
#> 0 1 2 3 4 5 6 7 8 9
#> 100 100 100 100 100 100 100 100 100 100
Created on 2024-03-29 with reprex v2.1.0
Это сработало отлично! Большое спасибо! Я использовал образец, но он не привел меня туда, куда мне нужно было.