最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++基于文件流與armadillo讀取mnist示例詳解

 更新時(shí)間:2021年05月10日 10:42:19   作者:c艸用戶  
這篇文章主要給大家介紹了關(guān)于C++基于文件流與armadillo讀取mnist的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

發(fā)現(xiàn)網(wǎng)上大把都是用python讀取mnist的,用C++大都是用opencv讀取的,但我不怎么用opencv,因此自己摸索了個(gè)使用文件流讀取mnist的方法,armadillo僅作為儲(chǔ)存矩陣的一種方式。

1. mnist文件

首先避坑,這些文件要解壓。

官網(wǎng)截圖可知,文件頭很簡(jiǎn)單,只有若干個(gè)32位整數(shù),MSB,像素和標(biāo)簽均是無符號(hào)字節(jié)(即unsigned char)可以先讀取文件頭,再讀取剩下的部分。

2. 讀取文件頭

我覺得沒什么必要啊,直接跳過不行嗎

文件頭都是32位,那就整四個(gè)unsigned char唄。

 uchar a, b, c, d;
 File >> a >> b >> c >> d;

這樣a、b、c、d就保存了一個(gè)整數(shù)。

x = ((((a * 256) + b) * 256) + c) * 256 + d;

然后就得到了唄。

看每個(gè)文件有多少文件頭,就操作幾次(并可以順便與官方的magic number進(jìn)行對(duì)比),剩下的就是文件的內(nèi)容了。

3. 讀取內(nèi)容

這部分可以依照之前的方法,一次讀取一個(gè)字符,再保存至矩陣當(dāng)中。例如:

uchar a;
mat image(28, 28, fill::zeros); // 這是個(gè)矩陣!
for(int i = 0; i < 28; i++) //28行28列的圖像懶得改了
 for(int j = 0; j < 28; j++)
 {
  File >> a;
  image(i, j) = double(a);
 }

這樣就讀取了一張圖片。其余以此類推吧。

4. 完整代碼

可以復(fù)制,可以修改,也可以用于商用和學(xué)術(shù),但是請(qǐng)標(biāo)注原作者(就是我)。

mnist.h

#ifndef MNIST_H  
#define MNIST_H
#include<iostream>
#include<fstream>
#include<armadillo>

#define uchar unsigned char

using namespace std;
using namespace arma;

//小端存儲(chǔ)轉(zhuǎn)換
int reverseInt(uchar a, uchar b, uchar c, uchar d);

//讀取image數(shù)據(jù)集信息
mat read_mnist_image(const string fileName);

//讀取label數(shù)據(jù)集信息
mat read_mnist_label(const string fileName);
#endif

mnist.cpp

//mnist.cpp
//作者:C艸
#include "mnist.h"

int reverseInt(uchar a, uchar b, uchar c, uchar d)
{
 return ((((a * 256) + b) * 256) + c) * 256 + d;
}

mat read_mnist_image(const string fileName)
{
 fstream File;
 mat image;
 File.open(fileName);
 if (!File.is_open()) // cannot open file
 {
  cout << "文件打不開啊" << endl;
  return mat(0, 0, fill::zeros);
 }
 uchar a, b, c, d;
 File >> a >> b >> c >> d;
 int magic = reverseInt(a, b, c, d);
 if (magic != 2051) //magic number wrong
 {
  cout << magic;
  return mat(0, 0, fill::zeros);
 }
 File >> a >> b >> c >> d;
 int num_img = reverseInt(a, b, c, d);
 File >> a >> b >> c >> d;
 int num_row = reverseInt(a, b, c, d);
 File >> a >> b >> c >> d;
 int num_col = reverseInt(a, b, c, d);
 // 文件頭讀取完畢
 image = mat(num_img, num_col * num_row, fill::zeros);
 for(int i = 0; i < num_img; i++)
  for (int j = 0; j < num_col * num_row; j++)
  {
   File >> a;
   image(i, j) = double(a);
  }
 return image;
}

mat read_mnist_label(const string fileName)
{
 fstream File;
 mat label;
 File.open(fileName);
 if (!File.is_open()) // cannot open file
 {
  cout << "文件打不開啊" << endl;
  return mat(0, 0, fill::zeros);
 }
 uchar a, b, c, d;
 File >> a >> b >> c >> d;
 int magic = reverseInt(a, b, c, d);
 if (magic != 2049) //magic number wrong
 {
  cout << magic;
  return mat(0, 0, fill::zeros);
 }
 File >> a >> b >> c >> d;
 int num_lab = reverseInt(a, b, c, d);
 // 文件頭讀取完畢
 label = mat(num_lab, 10, fill::zeros);
 for (int i = 0; i < num_lab; i++)
 {
  File >> a;
  label(i, int(a)) = 1;
 }
 return label;
}

總結(jié)

到此這篇關(guān)于C++基于文件流與armadillo讀取mnist的文章就介紹到這了,更多相關(guān)C++ armadillo讀取mnist內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用

    C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用

    為了消除函數(shù)調(diào)用的時(shí)空開銷,C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語(yǔ)言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-08-08
  • C語(yǔ)言繪制三角函數(shù)曲線

    C語(yǔ)言繪制三角函數(shù)曲線

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言繪制三角函數(shù)曲線,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C++中的auto_ptr智能指針的作用及使用方法詳解

    C++中的auto_ptr智能指針的作用及使用方法詳解

    這篇文章主要介紹了C++中的auto_ptr智能指針的作用及使用方法詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++類的定義與實(shí)現(xiàn)

    C++類的定義與實(shí)現(xiàn)

    這篇文章主要介紹了C++類的定義與實(shí)現(xiàn),違章圍繞C++類的定義的相關(guān)資料展開全文內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-01-01
  • C語(yǔ)言中通用工具庫(kù)stdlib.h的一些常用函數(shù)

    C語(yǔ)言中通用工具庫(kù)stdlib.h的一些常用函數(shù)

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中通用工具庫(kù)stdlib.h的一些常用函數(shù),stdlib.h頭文件包含了許多C標(biāo)準(zhǔn)庫(kù)函數(shù)的原型聲明和宏定義,這些函數(shù)主要與動(dòng)態(tài)內(nèi)存分配、隨機(jī)數(shù)生成、進(jìn)程控制、字符串轉(zhuǎn)換等相關(guān),需要的朋友可以參考下
    2024-01-01
  • c++ vector模擬實(shí)現(xiàn)代碼

    c++ vector模擬實(shí)現(xiàn)代碼

    vector是C++ STL中一個(gè)非常重要的容器,了解 vector 的底層實(shí)現(xiàn)原理,可以很好的幫助我們更加熟練的使用vector。這篇文章通過實(shí)例代碼給大家介紹c++ vector模擬實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2020-02-02
  • C語(yǔ)言對(duì)棧的實(shí)現(xiàn)基本操作

    C語(yǔ)言對(duì)棧的實(shí)現(xiàn)基本操作

    棧只允許在一端進(jìn)行插入或刪除操作的線性表。首先棧是一種線性表,但是限定這種線性表只能在某一端進(jìn)行插入和刪除操作,這篇文章主要介紹了C語(yǔ)言對(duì)棧的實(shí)現(xiàn)基本操作.
    2016-10-10
  • VC++文件監(jiān)控之FindFirstChangeNotification

    VC++文件監(jiān)控之FindFirstChangeNotification

    因?yàn)镽eadDirectoryChangesW 上次測(cè)試發(fā)現(xiàn)不能多級(jí)目錄監(jiān)控,所以嘗試用FindFirstChangeNotification來實(shí)施文件監(jiān)控,需要的朋友可以參考下
    2019-04-04
  • C++使用回溯法解決黃金礦工問題

    C++使用回溯法解決黃金礦工問題

    在矩陣中考察回溯算法,分為任意起點(diǎn)、左上角開始等情況。從而有不同的模板,其實(shí)區(qū)別就是直接開始還是每個(gè)坐標(biāo)都去嘗試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10

最新評(píng)論

松江区| 济南市| 桂阳县| 长子县| 峨眉山市| 赣州市| 信宜市| 资兴市| 肥乡县| 即墨市| 博爱县| 织金县| 什邡市| 丽江市| 汨罗市| 清远市| 锦屏县| 尤溪县| 辽宁省| 高青县| 永登县| 福海县| 巴楚县| 南丹县| 庐江县| 巴塘县| 仪陇县| 南阳市| 嘉义县| 张家界市| 杭州市| 河源市| 墨竹工卡县| 常熟市| 渝中区| 昌邑市| 南木林县| 金华市| 石台县| 临清市| 宜都市|