Tensorflow: 支持的數據類型和Tensor的一些接口(C++)

相信很多小夥伴對tensorflow的python接口使用都很熟悉了,前期,LZ已經將訓練的模型通過tensorflow 的C++接口移植成功,現在出現的問題是tensorflow的session run只能從CPU上進行inference,並且inference後得到的結果也在CPU上,那麼正常數據在CPU上,當然是沒有問題的,重點是LZ獲取的是GPU的buffer,如果使用cuda的接口進行memory的copy,那麼花在IO上的時間損耗會特別大,所以後期還在琢磨怎麼把整個程序移植到GPU端,從而加速整個算法的時間,這樣就要了解CUDA的一些函數和GPU上的基本知識,所以LZ又要開始新的學習了(≧▽≦)/,不說了,程序猿不就是一直都在學習嘛,可能又要寫點關於CUDA的學習博客了。

回到正題,我們先來看下tensorflow到底支持什麼數據類型,有些小夥伴會問,爲啥要了解數據類型呢?因爲GPU上的操作大多數是依賴於指針,所以數據類型是直接關係到buferr的大小的,不然你的cudamalloc都沒做對,後續還怎麼開始呢?

在<tensorflow_path>/bazel-genfiles/tensorflow/core/framework/types.pb.h中,有具體的定義:

namespace tensorflow {

enum DataType {
  DT_INVALID = 0,
  DT_FLOAT = 1,
  DT_DOUBLE = 2,
  DT_INT32 = 3,
  DT_UINT8 = 4,
  DT_INT16 = 5,
  DT_INT8 = 6,
  DT_STRING = 7,
  DT_COMPLEX64 = 8,
  DT_INT64 = 9,
  DT_BOOL = 10,
  DT_QINT8 = 11,
  DT_QUINT8 = 12,
  DT_QINT32 = 13,
  DT_BFLOAT16 = 14,
  DT_QINT16 = 15,
  DT_QUINT16 = 16,
  DT_UINT16 = 17,
  DT_COMPLEX128 = 18,
  DT_HALF = 19,
  DT_RESOURCE = 20,
  DT_VARIANT = 21,
  DT_UINT32 = 22,
  DT_UINT64 = 23,
  DT_FLOAT_REF = 101,
  DT_DOUBLE_REF = 102,
  DT_INT32_REF = 103,
  DT_UINT8_REF = 104,
  DT_INT16_REF = 105,
  DT_INT8_REF = 106,
  DT_STRING_REF = 107,
  DT_COMPLEX64_REF = 108,
  DT_INT64_REF = 109,
  DT_BOOL_REF = 110,
  DT_QINT8_REF = 111,
  DT_QUINT8_REF = 112,
  DT_QINT32_REF = 113,
  DT_BFLOAT16_REF = 114,
  DT_QINT16_REF = 115,
  DT_QUINT16_REF = 116,
  DT_UINT16_REF = 117,
  DT_COMPLEX128_REF = 118,
  DT_HALF_REF = 119,
  DT_RESOURCE_REF = 120,
  DT_VARIANT_REF = 121,
  DT_UINT32_REF = 122,
  DT_UINT64_REF = 123,
  DataType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
  DataType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
};

基本上涵蓋了各種數據類型了,甚至有些LZ都不是很熟悉。

我們使用tensorflow的接口來定義對應的Tensor,然後對tensor函數的基本使用:

// tensor的初始化方式
// cpu上初始化方式
Tensor(DataType type, const TensorShape& shape);

// device上初始化方式,如果buffer在GPU上,就是使用GPU上初始化方式
Tensor(Allocator* a, DataType type, const TensorShape& shape);

// 這個簡直是調試最常用的方式,會輸出對應tensor的類型,shape,以及部分數據,但是這個只限制在cpu上的tensor,gpu上的tensor需要先拷貝到cpu上才能使用
std::cout << tensor_name.DebugString() << std::endl;


// tensor的元素數量
std::cout << tensor_name.NumElements() << std::endl;

// tensor的元素類型,如果是DF_FLOAT,輸出就是1
std::cout << tensor_name.dtype() << std::endl;

上面就是tensorflow支持的數據類型和對於tensor的初始化和常用函數的使用。話說,好像快過年了呢(⊙o⊙)?

發佈了305 篇原創文章 · 獲贊 208 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章