diff --git a/testdata/dnn/onnx/data/input_torch_attention_single_head.npy b/testdata/dnn/onnx/data/input_torch_attention_single_head.npy new file mode 100644 index 000000000..e59a39adb Binary files /dev/null and b/testdata/dnn/onnx/data/input_torch_attention_single_head.npy differ diff --git a/testdata/dnn/onnx/data/input_unflatten.npy b/testdata/dnn/onnx/data/input_unflatten.npy new file mode 100644 index 000000000..f01242c26 Binary files /dev/null and b/testdata/dnn/onnx/data/input_unflatten.npy differ diff --git a/testdata/dnn/onnx/data/output_torch_attention_single_head.npy b/testdata/dnn/onnx/data/output_torch_attention_single_head.npy new file mode 100644 index 000000000..d36fda7c3 Binary files /dev/null and b/testdata/dnn/onnx/data/output_torch_attention_single_head.npy differ diff --git a/testdata/dnn/onnx/data/output_unflatten.npy b/testdata/dnn/onnx/data/output_unflatten.npy new file mode 100644 index 000000000..f844fd211 Binary files /dev/null and b/testdata/dnn/onnx/data/output_unflatten.npy differ diff --git a/testdata/dnn/onnx/generate_onnx_models.py b/testdata/dnn/onnx/generate_onnx_models.py index 07dcc0a34..a9ce31706 100644 --- a/testdata/dnn/onnx/generate_onnx_models.py +++ b/testdata/dnn/onnx/generate_onnx_models.py @@ -1540,6 +1540,47 @@ def forward(self, x): save_data_and_model("einsum_transpose", mat, einsum, export_params=True) +class TorchAttentionLayer(nn.Module): + def __init__(self, embed_dim=6, num_heads=1): + super(TorchAttentionLayer, self).__init__() + self.attention = nn.MultiheadAttention( + embed_dim=embed_dim, + num_heads=num_heads, + bias=True, + batch_first=True) + def forward(self, x): + return self.attention(x, x, x)[0] + +num_heads = 1 +batch_size = 2 +num_tokens = 5 +emb_dim = 6 +model = TorchAttentionLayer(embed_dim=emb_dim, num_heads=num_heads).eval() + +x = torch.rand(batch_size, num_tokens, emb_dim) +with torch.no_grad(): + output = model(x) + +save_data_and_model("torch_attention_single_head", x, model, export_params=True) +class Unflatten(torch.nn.Module): + def __init__(self, E, times): + super(Unflatten, self).__init__() + self.E = E + self.times = times + + def forward(self, x): + return x.unflatten(-1, (self.times, self.E)) + +unflatten_dim = 5 +times = 3 +model = Unflatten(unflatten_dim, times).eval() + +x = torch.rand(10, 3, unflatten_dim * times) +with torch.no_grad(): + output = model(x) + +save_data_and_model("unflatten", x, model, export_params=True) + def _extract_value_info(x, name, type_proto=None): # type: (Union[List[Any], np.ndarray, None], Text, Optional[TypeProto]) -> onnx.ValueInfoProto if type_proto is None: if x is None: diff --git a/testdata/dnn/onnx/models/torch_attention_single_head.onnx b/testdata/dnn/onnx/models/torch_attention_single_head.onnx new file mode 100644 index 000000000..5be90217e Binary files /dev/null and b/testdata/dnn/onnx/models/torch_attention_single_head.onnx differ diff --git a/testdata/dnn/onnx/models/unflatten.onnx b/testdata/dnn/onnx/models/unflatten.onnx new file mode 100644 index 000000000..caaf71f6d Binary files /dev/null and b/testdata/dnn/onnx/models/unflatten.onnx differ