28 #include "tiny_dnn/util/util.h"
33 #define CIFAR10_IMAGE_DEPTH (3)
34 #define CIFAR10_IMAGE_WIDTH (32)
35 #define CIFAR10_IMAGE_HEIGHT (32)
36 #define CIFAR10_IMAGE_AREA (CIFAR10_IMAGE_WIDTH*CIFAR10_IMAGE_HEIGHT)
37 #define CIFAR10_IMAGE_SIZE (CIFAR10_IMAGE_AREA*CIFAR10_IMAGE_DEPTH)
53 inline void parse_cifar10(
const std::string& filename,
54 std::vector<vec_t> *train_images,
55 std::vector<label_t> *train_labels,
61 if (x_padding < 0 || y_padding < 0)
62 throw nn_error(
"padding size must not be negative");
63 if (scale_min >= scale_max)
64 throw nn_error(
"scale_max must be greater than scale_min");
66 std::ifstream ifs(filename.c_str(), std::ios::in | std::ios::binary);
67 if (ifs.fail() || ifs.bad())
68 throw nn_error(
"failed to open file:" + filename);
71 std::vector<unsigned char> buf(CIFAR10_IMAGE_SIZE);
73 while (ifs.read((
char*) &label, 1)) {
76 if (!ifs.read((
char*) &buf[0], CIFAR10_IMAGE_SIZE))
break;
78 if (x_padding || y_padding)
80 int w = CIFAR10_IMAGE_WIDTH + 2 * x_padding;
81 int h = CIFAR10_IMAGE_HEIGHT + 2 * y_padding;
83 img.resize(w * h * CIFAR10_IMAGE_DEPTH, scale_min);
85 for (
int c = 0; c < CIFAR10_IMAGE_DEPTH; c++) {
86 for (
int y = 0; y < CIFAR10_IMAGE_HEIGHT; y++) {
87 for (
int x = 0; x < CIFAR10_IMAGE_WIDTH; x++) {
88 img[c * w * h + (y + y_padding) * w + x + x_padding]
89 = scale_min + (scale_max - scale_min) * buf[c * CIFAR10_IMAGE_AREA + y * CIFAR10_IMAGE_WIDTH + x] / 255;
96 std::transform(buf.begin(), buf.end(), std::back_inserter(img),
97 [=](
unsigned char c) { return scale_min + (scale_max - scale_min) * c / 255; });
100 train_images->push_back(img);
101 train_labels->push_back(label);