白癜风十大专业医院 https://m-mip.39.net/baidianfeng/mipso_4306815.html
这里使用TensorRT实现其不支持的算子。为了尽量避免引入其它操作干扰整个流程,这里使用自己训练mnist,训练的模型中包含不被TensorRT支持的算子gelu。此激活函数如下:
为了更加方便计算此函数使用了近似表达式:
此次实现包含如下步骤:
创建一个包含gelu算子的模型
使用gelu的近似函数实现对gelu的近似
替换原始的计算图中的gelu函数未近似gelu函数
使用近似的gelu实现序列化和推理。
两个函数的近似关系如图:
上图可以看出近似的gelu函数几乎和原始函数重合。下面开始训练一个tensorflow的模型,需要注意的是此gelu函数在tf2.4版本下才有,2.4但是TensorRT转换通常还是使用tensorflow的protobuf格式,所以这里还需要将h5模型转换为frozen.pb的序列化文件。importtensorflowastfimportnumpyasnpimportosfromtensorflow.python.framework.convert_to_constantsimportconvert_variables_to_constants_v2fromfunctoolsimportpartialimportdatetimeWORKING_DIR=os.environ.get("TRT_WORKING_DIR")oros.path.dirname(os.path.realpath(__file__))MODEL_DIR=os.path.join(WORKING_DIR,models)defload_data():mnist=tf.keras.datasets.mnist(x_train,y_train),(x_test,y_test)=mnist.load_data()x_train,x_test=x_train/.0,x_test/.0x_train=np.reshape(x_train,(-1,1,28,28))x_test=np.reshape(x_test,(-1,1,28,28))returnx_train,y_train,x_test,y_testdefbuild_model():model=tf.keras.models.Sequential()model.add(tf.keras.layers.InputLayer(input_shape=[1,28,28],name="InputLayer"))model.add(tf.keras.layers.Flatten())model.add(tf.keras.layers.Dense(32))model.add(tf.keras.layers.Activation(activation=tf.nn.gelu,name="Gelu"))model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax,name="OutputLayer"))returnmodeldeftrain_model(logs=mnist_summary,epochs=10):#Buildand