Skip to content

Commit c1c5cd0

Browse files
committed
Add pad and gaussiannoise layer
1 parent 87f6401 commit c1c5cd0

File tree

6 files changed

+174
-2
lines changed

6 files changed

+174
-2
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ input_data = np.array(input, dtype=np.float32)
6464
result = sess.run([output_name], {input_name: input_data})
6565
print('onnx out', result)
6666
```
67-
The converted onnx file can be viewed via Netron.
67+
The converted onnx file can be viewed via [Netron](https://github.com/lutzroeder/netron).
6868

6969
<p align="center"><img src="https://git.openi.org.cn/laich/pose_data/raw/commit/7ac74f03dbfdd8e023cdb205cd415a8571ebb91a/onnxfile.png" width="580"\></p>
7070

tests/test_noise.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#! /usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
import os
5+
os.environ["TL_BACKEND"] = 'tensorflow'
6+
import tensorlayerx as tlx
7+
from tensorlayerx.nn import Module
8+
from tensorlayerx.nn import GaussianNoise
9+
from tlx2onnx.main import export
10+
import onnxruntime as rt
11+
import numpy as np
12+
13+
class CustomModel(Module):
14+
def __init__(self):
15+
super(CustomModel, self).__init__(name="custom")
16+
self.noise = GaussianNoise()
17+
18+
def forward(self, inputs):
19+
x = self.noise(inputs)
20+
return x
21+
22+
net = CustomModel()
23+
input = tlx.nn.Input(shape=(3, 20), init=tlx.initializers.RandomNormal())
24+
net.set_eval()
25+
output = net(input)
26+
print("tlx out", output)
27+
onnx_model = export(net, input_spec=input, path='noise.onnx')
28+
29+
# Infer Model
30+
sess = rt.InferenceSession('noise.onnx')
31+
32+
input_name = sess.get_inputs()[0].name
33+
output_name = sess.get_outputs()[0].name
34+
35+
input_data = np.array(input, dtype=np.float32)
36+
37+
result = sess.run([output_name], {input_name: input_data})
38+
print('onnx out', result)

tests/test_padding.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#! /usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
import os
5+
os.environ["TL_BACKEND"] = 'tensorflow'
6+
import tensorlayerx as tlx
7+
from tensorlayerx.nn import Module
8+
from tensorlayerx.nn import PadLayer, ZeroPad1d, ZeroPad2d, ZeroPad3d
9+
from tlx2onnx.main import export
10+
import onnxruntime as rt
11+
import numpy as np
12+
13+
class CustomModel(Module):
14+
def __init__(self):
15+
super(CustomModel, self).__init__(name="custom")
16+
self.pad = PadLayer([[1, 2], [3, 4], [5, 6], [7, 8]], "REFLECT", name='inpad')
17+
18+
def forward(self, inputs):
19+
x = self.pad(inputs)
20+
return x
21+
22+
net = CustomModel()
23+
input = tlx.nn.Input(shape=(5, 5, 10, 10), init=tlx.initializers.RandomNormal())
24+
net.set_eval()
25+
output = net(input)
26+
print("tlx out", output.shape)
27+
onnx_model = export(net, input_spec=input, path='padding.onnx')
28+
29+
# Infer Model
30+
sess = rt.InferenceSession('padding.onnx')
31+
32+
input_name = sess.get_inputs()[0].name
33+
output_name = sess.get_outputs()[0].name
34+
35+
input_data = np.array(input, dtype=np.float32)
36+
37+
result = sess.run([output_name], {input_name: input_data})
38+
print('onnx out', np.shape(result))

tlx2onnx/op_mapper/nn/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@
1616
from .extend import *
1717
from .rnn import *
1818
from .resampling import *
19-
from .merge import *
19+
from .merge import *
20+
from .noise import *
21+
from .padding import *

tlx2onnx/op_mapper/nn/noise.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#! /usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
from onnx import helper
5+
from ..op_mapper import OpMapper
6+
from ...common import make_node
7+
from ..datatype_mapping import NP_TYPE_TO_TENSOR_TYPE
8+
9+
@OpMapper(['GaussianNoise'])
10+
class GaussianNoise():
11+
# supports v1-v12
12+
13+
@classmethod
14+
def version_1(cls, node, **kwargs):
15+
onnx_node = []
16+
onnx_value = []
17+
onnx_init = []
18+
# get inputs outputs
19+
in_name = node['in_nodes_name'][0]
20+
out_name = node['out_nodes_name'][0]
21+
out_shape = node['out_tensors'][0]
22+
dtype = NP_TYPE_TO_TENSOR_TYPE[node['dtype']]
23+
24+
layer = node['node'].layer
25+
mean = layer.mean
26+
scale = layer.stddev
27+
seed = layer.seed
28+
# make random normal node
29+
r_out = helper.make_tensor_value_info(out_name + '_r', dtype, shape=out_shape)
30+
onnx_value.append(r_out)
31+
r_node, out = make_node('RandomNormal', inputs='', outputs=[out_name + 'r'],
32+
dtype=dtype, mean=mean, scale=scale, seed=seed, shape=out_shape)
33+
onnx_node.append(r_node)
34+
35+
a_out = helper.make_tensor_value_info(out_name, dtype, shape=out_shape)
36+
onnx_value.append(a_out)
37+
a_node, out = make_node('Add', inputs=[in_name, out], outputs=[out_name])
38+
onnx_node.append(a_node)
39+
return onnx_node, onnx_value, onnx_init

tlx2onnx/op_mapper/nn/padding.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#! /usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
from onnx import helper, numpy_helper
5+
from ..op_mapper import OpMapper
6+
from ...common import make_node
7+
from ..datatype_mapping import NP_TYPE_TO_TENSOR_TYPE
8+
import numpy as np
9+
10+
@OpMapper(['PadLayer'])
11+
class PadLayer():
12+
# supports v1-v12
13+
14+
@classmethod
15+
def version_1(cls, node, **kwargs):
16+
onnx_node, onnx_value, onnx_init = [], [], []
17+
# get inputs outputs
18+
in_name = node['in_nodes_name'][0]
19+
out_name = node['out_nodes_name'][0]
20+
out_shape = node['out_tensors'][0]
21+
dtype = NP_TYPE_TO_TENSOR_TYPE[node['dtype']]
22+
layer = node['node'].layer
23+
# get attrs
24+
value = np.array(layer.constant_values).astype(node['dtype'])
25+
c_value = numpy_helper.from_array(value, name='value')
26+
onnx_init.append(c_value)
27+
# processing mode
28+
mode_dict = {"CONSTANT": 'constant', "REFLECT": 'reflect',"SYMMETRIC": 'edge'}
29+
mode = mode_dict[layer.mode]
30+
# processing padding. `pads` should be a 1D tensor of shape [2 * input_rank].
31+
# `pads` format should be: [x1_begin, x2_begin,...,x1_end, x2_end,...],
32+
padding = layer.padding
33+
pads_temp = padding[0]
34+
for i in np.arange(1, len(padding)):
35+
pads_temp += padding[i]
36+
pads = []
37+
for i in range(len(pads_temp)//2):
38+
pads.append(pads_temp[2*i])
39+
for i in range(len(pads_temp) // 2):
40+
pads.append(pads_temp[i*2+1])
41+
pads = np.array(pads).astype(np.int64)
42+
p_value = numpy_helper.from_array(pads, name='pads')
43+
onnx_init.append(p_value)
44+
# make nodes
45+
v_out = helper.make_tensor_value_info(out_name, dtype, shape=out_shape)
46+
onnx_value.append(v_out)
47+
48+
if mode == 'constant':
49+
p_node, out = make_node('Pad', inputs=[in_name, 'pads', 'value'], outputs=[out_name], mode='constan')
50+
onnx_node.append(p_node)
51+
else:
52+
p_node, out = make_node('Pad', inputs=[in_name, 'pads'], outputs=[out_name], mode=mode)
53+
onnx_node.append(p_node)
54+
55+
return onnx_node, onnx_value, onnx_init

0 commit comments

Comments
 (0)