Tensor RT 4 自定義層 layers

2021-09-24 15:56:23 字數 4548 閱讀 4626

tensor rt可以直接解析caffe模型。 對於不支援的操作op,您可以使用介面手動新增它們;

本部落格將提供了乙個廣播操作(broadcast_op)的示例, 此外,它還測試了pooling_layer,它還新增了乙個test_layer,它可以單獨列印結構中的引數並協助debug;

提供的介面類內部函式,需要根據自定義op修改

virtual int

getnboutputs()

const=0

; virtual dims getoutputdimensions

(int index,

const dims* inputs,

int nbinputdims)=0

; virtual void

configure

(const dims* inputdims,

int nbinputs,

const dims* outputdims,

int nboutputs,

int maxbatchsize)=0

; virtual int

initialize()

=0; virtual void

terminate()

=0; virtual size_t getworkspacesize

(int maxbatchsize)

const=0

; virtual int

enqueue

(int batchsize,

const

void

*const

* inputs,

void

** outputs,

void

* workspace, cudastream_t stream)=0

; virtual size_t getserializationsize()

=0; virtual void

serialize

(void

* buffer)=0

;

// 繼承 ipluginext 類

class broadcast: public ipluginext

~broadcast()

// 建構函式,定義一些必須的引數

broadcast

(const

char

* name,

const

void

* data, size_t length)

:layer_name

(name)

intgetnboutputs()

const override

// 指定該op操作的輸出tensor的shape

dims getoutputdimensions

(int index,

const dims* inputs,

int nbinputdims) override

bool supportsformat

(datatype type, pluginformat format)

const override

virtual size_t getworkspacesize

(int maxbatchsize)

const override

void

configurewithformat

(const dims* inputdims,

int nbinputs,

const dims* outputdims,

int nboutputs, datatype type, pluginformat format,

int maxbatchsize) override

intinitialize

() override

// 你需要重點關注的實現,相當於forward操作,在這裡實現op的內部操作

virtual int

enqueue

(int batchsize,

const

void

*const

* inputs,

void

** outputs,

void

* workspace, cudastream_t stream) override

}// 將計算結果再搬回gpu 用於後續layer操作

cudamemcpy

(outputs[0]

,(const

void

*)pbottom,

sizeof

(float

)* c * h * w,cudamemcpyhosttodevice)

;#if p_log

if(layer_name ==

"broadcast_mul1")}

#endif

free

(pbottom)

;free

(pbottom2)

;return0;

} virtual void

terminate

() override

virtual size_t getserializationsize

() override

virtual void

serialize

(void

* buffer) override

};

ker_size (3,3)

paddin = 1

stride =2

class poolinglayer: public ipluginext

~poolinglayer()

poolinglayer

(const

char

* name,

const

void

* data, size_t length)

:layer_name

(name)

intgetnboutputs()

const override

dims getoutputdimensions

(int index,

const dims* inputs,

int nbinputdims) override

bool supportsformat

(datatype type, pluginformat format)

const override

virtual size_t getworkspacesize

(int maxbatchsize)

const override

void

configurewithformat

(const dims* inputdims,

int nbinputs,

const dims* outputdims,

int nboutputs, datatype type, pluginformat format,

int maxbatchsize) override

intinitialize

() override

virtual int

enqueue

(int batchsize,

const

void

*const

* inputs,

void

** outputs,

void

* workspace, cudastream_t stream) override

// p2+= gap;

// }

for(

int n=

0;n<_c;n++)}

}}}}

#if p_log

// if(!strcmp(layer_name.c_str(),"reshape0"))

// fp.

close()

;// }

#endif

cudamemcpy

(outputs[0]

,(const

void

*)top,

sizeof

(float

)* _c * out_h * out_w,cudamemcpyhosttodevice)

;free

(pbottom)

;free

(top)

;return0;

} virtual void

terminate

() override

virtual size_t getserializationsize

() override

virtual void

serialize

(void

* buffer) override

};

TensorRT的自定義運算元Plugin的實現

這篇文章主要介紹了如何使用tensorrt實現自定義運算元。note 我使用的是tensorrt7.0,自定義運算元使用的ipluginv2ioext實現的。模型框架是caffe,所以以下實現都只適用於caffe模型的解析,但理論上解析tf和onnx的改動不大。實現細節不方便全部貼出,但是基本實現過...

CALayer4 自定義層

本文目錄 自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。回到頂部 方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcon...

CALayer4 自定義層

自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。回到頂部 方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcontextr...