17 const std::string& full_path) {
18 std::ifstream
file(full_path.c_str(), std::ios::binary);
19 std::int32_t magic_number = 0;
20 std::int32_t number_of_images = 0;
21 std::int32_t n_rows = 0;
22 std::int32_t n_cols = 0;
24 file.read(
reinterpret_cast<char*
>(&magic_number),
sizeof(magic_number));
26 magic_number = ntohl(magic_number);
31 const std::int32_t required_magic = 0x0803;
32 if (magic_number != required_magic) {
33 throw std::runtime_error(
34 std::format(
"The MNIST input file at {} has the magic number {:#06x}! "
36 full_path, magic_number, required_magic));
41 file.read(
reinterpret_cast<char*
>(&number_of_images),
42 sizeof(number_of_images));
43 number_of_images = ntohl(number_of_images);
44 file.read(
reinterpret_cast<char*
>(&n_rows),
sizeof(n_rows));
45 n_rows = ntohl(n_rows);
47 throw std::runtime_error(
48 std::format(
"The MNIST input file at {} has images with {} rows",
51 file.read(
reinterpret_cast<char*
>(&n_cols),
sizeof(n_cols));
52 n_cols = ntohl(n_cols);
54 throw std::runtime_error(
55 std::format(
"The MNIST input file at {} has images with {} columns",
60 std::vector<std::vector<std::vector<float>>> input_tensor_values;
61 input_tensor_values.resize(
63 std::vector<std::vector<float>>(n_rows, std::vector<float>(n_cols)));
64 for (
int i = 0;
i < number_of_images; ++
i) {
65 for (
int r = 0;
r < n_rows; ++
r) {
66 for (
int c = 0;
c < n_cols; ++
c) {
67 std::uint8_t temp = 0;
68 file.read((
char*)&temp,
sizeof(temp));
69 input_tensor_values[
i][
r][
c] =
70 float(temp) / std::numeric_limits<std::uint8_t>::max();
74 return input_tensor_values;
78 const std::vector<std::vector<float>>& nestedVector) {
79 const std::size_t total_size = std::transform_reduce(
80 nestedVector.cbegin(), nestedVector.cend(), 0, std::plus<>{},
81 [](
const std::vector<float>& c) { return c.size(); });
83 std::vector<float> result{};
84 result.reserve(total_size);
86 for (
const auto& v : nestedVector) {
87 std::ranges::copy(v, std::back_inserter(result));
std::vector< std::vector< std::vector< float > > > read_mnist_pixel_notFlat(const std::string &full_path)
std::vector< float > flattenNestedVectors(const std::vector< std::vector< float > > &nestedVector)