summaryrefslogtreecommitdiff
path: root/nn/runtime/test/specs/V1_3/qlstm.mod.py
blob: c00c61400989bdfd2e257cceb159daa6e803589c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#
# Copyright (C) 2019 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Test for QUANTIZED_LSTM op.
import copy

model = Model()

batch_size = 2
input_size = 5
num_units = 4
output_size = 3

input = Input("input",
              ("TENSOR_QUANT8_ASYMM_SIGNED", "{%d, %d}" % (batch_size, input_size), 0.0078125, 0))

input_to_input_weights = Input("input_to_input_weights",
                               ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, input_size), 0.00784314, 0))
input_to_forget_weights = Input("input_to_forget_weights",
                                ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, input_size), 0.00784314, 0))
input_to_cell_weights = Input("input_to_cell_weights",
                              ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, input_size), 0.00784314, 0))
input_to_output_weights = Input("input_to_output_weights",
                                ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, input_size), 0.00784314, 0))

recurrent_to_input_weights = Input("recurrent_to_intput_weights",
                                   ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, output_size),
                                    0.00784314, 0))
recurrent_to_forget_weights = Input("recurrent_to_forget_weights",
                                    ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, output_size),
                                     0.00784314, 0))
recurrent_to_cell_weights = Input("recurrent_to_cell_weights",
                                  ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, output_size),
                                   0.00784314, 0))
recurrent_to_output_weights = Input("recurrent_to_output_weights",
                                    ("TENSOR_QUANT8_SYMM", "{%d, %d}" % (num_units, output_size),
                                     0.00784314, 0))

cell_to_input_weights = Input("cell_to_input_weights",
                              ("TENSOR_QUANT16_SYMM", "{%d}" % (num_units), 1.0, 0))
cell_to_forget_weights = Input("cell_to_forget_weights",
                               ("TENSOR_QUANT16_SYMM", "{%d}" % (num_units), 1.0, 0))
cell_to_output_weights = Input("cell_to_output_weights",
                               ("TENSOR_QUANT16_SYMM", "{%d}" % (num_units), 1.0, 0))

input_gate_bias = Input("input_gate_bias",
                        ("TENSOR_INT32", "{%d}" % (num_units), 4.65661e-08, 0))
forget_gate_bias = Input("forget_gate_bias",
                         ("TENSOR_INT32", "{%d}" % (num_units), 4.65661e-08, 0))
cell_gate_bias = Input("cell_gate_bias",
                       ("TENSOR_INT32", "{%d}" % (num_units), 4.65661e-08, 0))
output_gate_bias = Input("output_gate_bias",
                         ("TENSOR_INT32", "{%d}" % (num_units), 4.65661e-08, 0))

projection_weights = Input("projection_weights",
                           ("TENSOR_QUANT8_SYMM", "{%d,%d}" % (output_size, num_units), 0.00392157, 0))
projection_bias = Input("projection_bias", "TENSOR_INT32", "{%d}" % (output_size))

output_state_in = Input("output_state_in",
                        ("TENSOR_QUANT8_ASYMM_SIGNED", "{%d, %d}" % (batch_size, output_size),
                         3.05176e-05, 0))
cell_state_in = Input("cell_state_in",
                      ("TENSOR_QUANT16_SYMM", "{%d, %d}" % (batch_size, num_units), 3.05176e-05, 0))

input_layer_norm_weights = Input("input_layer_norm_weights",
                                 ("TENSOR_QUANT16_SYMM", "{%d}" % num_units, 3.05182e-05, 0))
forget_layer_norm_weights = Input("forget_layer_norm_weights",
                                  ("TENSOR_QUANT16_SYMM", "{%d}" % num_units, 3.05182e-05, 0))
cell_layer_norm_weights = Input("cell_layer_norm_weights",
                                ("TENSOR_QUANT16_SYMM", "{%d}" % num_units, 3.05182e-05, 0))
output_layer_norm_weights = Input("output_layer_norm_weights",
                                  ("TENSOR_QUANT16_SYMM", "{%d}" % num_units, 3.05182e-05, 0))

cell_clip = Float32Scalar("cell_clip", 0.)
projection_clip = Float32Scalar("projection_clip", 0.)

input_intermediate_scale = Float32Scalar("input_intermediate_scale", 0.007059)
forget_intermediate_scale = Float32Scalar("forget_intermediate_scale", 0.007812)
cell_intermediate_scale = Float32Scalar("cell_intermediate_scale", 0.007059)
output_intermediate_scale = Float32Scalar("output_intermediate_scale", 0.007812)
hidden_state_zero_point = Int32Scalar("hidden_state_zero_point", 0)
hidden_state_scale = Float32Scalar("hidden_state_scale", 0.007)

output_state_out = Output("output_state_out",
                          ("TENSOR_QUANT8_ASYMM_SIGNED", "{%d, %d}" % (batch_size, output_size),
                           3.05176e-05, 0))
cell_state_out = Output("cell_state_out",
                        ("TENSOR_QUANT16_SYMM", "{%d, %d}" % (batch_size, num_units), 3.05176e-05, 0))
output = Output("output",
                ("TENSOR_QUANT8_ASYMM_SIGNED", "{%d, %d}" % (batch_size, output_size),
                           3.05176e-05, 0))

model = model.Operation(
    "QUANTIZED_LSTM", input, input_to_input_weights, input_to_forget_weights,
    input_to_cell_weights, input_to_output_weights, recurrent_to_input_weights,
    recurrent_to_forget_weights, recurrent_to_cell_weights,
    recurrent_to_output_weights, cell_to_input_weights, cell_to_forget_weights,
    cell_to_output_weights, input_gate_bias, forget_gate_bias, cell_gate_bias,
    output_gate_bias, projection_weights, projection_bias, output_state_in,
    cell_state_in, input_layer_norm_weights, forget_layer_norm_weights,
    cell_layer_norm_weights, output_layer_norm_weights, cell_clip, projection_clip,
    input_intermediate_scale, forget_intermediate_scale, cell_intermediate_scale,
    output_intermediate_scale, hidden_state_zero_point, hidden_state_scale).To([output_state_out,
    cell_state_out, output])

# Example 1. Input in operand 0,
input0 = {
    input_to_input_weights: [
        64, 77, 89, -102, -115, 13, 25, 38, -51, 64, -102, 89, -77, 64, -51, -64, -51, -38, -25, -13
    ],
    input_to_forget_weights: [
        -77, -13, 38, 25, 115, -64, -25, -51, 38, -102, -51, 38, -64, -51, -77, 38, -51, -77, -64, -64
    ],
    input_to_cell_weights: [
        -51, -38, -25, -13, -64, 64, -25, -38, -25, -77, 77, -13, -51, -38, -89, 89, -115, -64, 102, 77
    ],
    input_to_output_weights: [
        -102, -51, -25, -115, -13, -89, 38, -38, -102, -25, 77, -25, 51, -89, -38, -64, 13, 64, -77, -51
    ],
    input_gate_bias: [644245, 3221226, 4724464, 8160438],
    forget_gate_bias: [2147484, -6442451, -4294968, 2147484],
    cell_gate_bias: [-1073742, 15461883, 5368709, 1717987],
    output_gate_bias: [1073742, -214748, 4294968, 2147484],
    recurrent_to_input_weights: [
        -25, -38, 51, 13, -64, 115, -25, -38, -89, 6, -25, -77
    ],
    recurrent_to_forget_weights: [
        -64, -38, -64, -25, 77, 51, 115, 38, -13, 25, 64, 25
    ],
    recurrent_to_cell_weights: [
        -38, 25, 13, -38, 102, -10, -25, 38, 102, -77, -13, 25
    ],
    recurrent_to_output_weights: [
        38, -13, 13, -25, -64, -89, -25, -77, -13, -51, -89, -25
    ],
    projection_weights: [
        -25, 51, 3, -51, 25, 127, 77, 20, 18, 51, -102, 51
    ],
    projection_bias: [ 0 for _ in range(output_size) ],
    input_layer_norm_weights: [3277, 6553, 9830, 16384],
    forget_layer_norm_weights: [6553, 6553, 13107, 9830],
    cell_layer_norm_weights: [22937, 6553, 9830, 26214],
    output_layer_norm_weights: [19660, 6553, 6553, 16384],
}

test_input = [90, 102, 13, 26, 38, 102, 13, 26, 51, 64]

golden_output = [
    127, 127, -108, -67, 127, 127
]

output0 = {
    output_state_out: golden_output,
    cell_state_out: [-14650, 8939, 5771, 6715, -11843, 7847, 1508, 12939],
    output: golden_output,
}

input0[input] = test_input
input0[output_state_in] = [ 0 for _ in range(batch_size * output_size) ]
input0[cell_state_in] = [ 0 for _ in range(batch_size * num_units) ]
input0[cell_to_input_weights] = [0 for _ in range(num_units) ]
input0[cell_to_forget_weights] = [0 for _ in range(num_units) ]
input0[cell_to_output_weights] = [0 for _ in range(num_units) ]

Example((input0, output0))