相信很多小夥伴對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⊙)?