15 const std::string& full_path) {
16 std::ifstream
file(full_path.c_str(), std::ios::binary);
17 std::int32_t magic_number = 0;
18 std::int32_t number_of_images = 0;
19 std::int32_t n_rows = 0;
20 std::int32_t n_cols = 0;
22 file.read(
reinterpret_cast<char*
>(&magic_number),
sizeof(magic_number));
24 magic_number = ntohl(magic_number);
29 const std::int32_t required_magic = 0x0803;
30 if (magic_number != required_magic) {
31 throw std::runtime_error(
32 std::format(
"The MNIST input file at {} has the magic number {:#06x}! "
34 full_path, magic_number, required_magic));
39 file.read(
reinterpret_cast<char*
>(&number_of_images),
40 sizeof(number_of_images));
41 number_of_images = ntohl(number_of_images);
42 file.read(
reinterpret_cast<char*
>(&n_rows),
sizeof(n_rows));
43 n_rows = ntohl(n_rows);
45 throw std::runtime_error(
46 std::format(
"The MNIST input file at {} has images with {} rows",
49 file.read(
reinterpret_cast<char*
>(&n_cols),
sizeof(n_cols));
50 n_cols = ntohl(n_cols);
52 throw std::runtime_error(
53 std::format(
"The MNIST input file at {} has images with {} columns",
58 std::vector<std::vector<std::vector<float>>> input_tensor_values;
59 input_tensor_values.resize(
61 std::vector<std::vector<float>>(n_rows, std::vector<float>(n_cols)));
62 for (
int i = 0; i < number_of_images; ++i) {
63 for (
int r = 0;
r < n_rows; ++
r) {
64 for (
int c = 0; c < n_cols; ++c) {
65 std::uint8_t temp = 0;
66 file.read((
char*)&temp,
sizeof(temp));
67 input_tensor_values[i][
r][c] =
68 float(temp) / std::numeric_limits<std::uint8_t>::max();
72 return input_tensor_values;