@@ -78,6 +78,33 @@ class OpNativeBatchNormLegitOutTest : public OperatorTest {
78
78
}
79
79
};
80
80
81
+ class OpNativeBatchNormLegitNoStatsOutTest : public OperatorTest {
82
+ protected:
83
+ ::std::tuple<exec_aten::Tensor&, exec_aten::Tensor&, exec_aten::Tensor&>
84
+ op_native_batch_norm_legit_no_stats_out (
85
+ const exec_aten::Tensor& input,
86
+ const exec_aten::optional<exec_aten::Tensor>& weight,
87
+ const exec_aten::optional<exec_aten::Tensor>& bias,
88
+ bool training,
89
+ double momentum,
90
+ double eps,
91
+ exec_aten::Tensor& out0,
92
+ exec_aten::Tensor& out1,
93
+ exec_aten::Tensor& out2) {
94
+ return torch::executor::aten::_native_batch_norm_legit_outf (
95
+ context_,
96
+ input,
97
+ weight,
98
+ bias,
99
+ training,
100
+ momentum,
101
+ eps,
102
+ out0,
103
+ out1,
104
+ out2);
105
+ }
106
+ };
107
+
81
108
TEST_F (OpNativeBatchNormLegitNoTrainingOutTest, SampleAtomicTest2D) {
82
109
torch::executor::testing::TensorFactory<exec_aten::ScalarType::Float> tfFloat;
83
110
@@ -949,3 +976,111 @@ TEST_F(OpNativeBatchNormLegitOutTest, SampleAtomicTest2D) {
949
976
EXPECT_TENSOR_CLOSE (out1, out1_expected);
950
977
EXPECT_TENSOR_CLOSE (out2, out2_expected);
951
978
}
979
+
980
+ TEST_F (OpNativeBatchNormLegitNoStatsOutTest, SampleAtomicTest2D) {
981
+ torch::executor::testing::TensorFactory<exec_aten::ScalarType::Float> tfFloat;
982
+
983
+ exec_aten::Tensor input =
984
+ tfFloat.make ({3 , 4 }, {0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 , 100 , 121 });
985
+ exec_aten::optional<exec_aten::Tensor> weight =
986
+ exec_aten::optional<exec_aten::Tensor>();
987
+ exec_aten::optional<exec_aten::Tensor> bias =
988
+ exec_aten::optional<exec_aten::Tensor>();
989
+ bool training = true ;
990
+ double momentum = 1e-3 ;
991
+ double eps = 1e-5 ;
992
+ exec_aten::Tensor out0 = tfFloat.zeros ({3 , 4 });
993
+ exec_aten::Tensor out1 = tfFloat.zeros ({4 });
994
+ exec_aten::Tensor out2 = tfFloat.zeros ({4 });
995
+ exec_aten::Tensor out0_expected = tfFloat.make (
996
+ {3 , 4 },
997
+ {-0.98058063 ,
998
+ -1.03422451 ,
999
+ -1.06904495 ,
1000
+ -1.09332705 ,
1001
+ -0.39223224 ,
1002
+ -0.31822300 ,
1003
+ -0.26726127 ,
1004
+ -0.23017406 ,
1005
+ 1.37281299 ,
1006
+ 1.35244739 ,
1007
+ 1.33630610 ,
1008
+ 1.32350123 });
1009
+ exec_aten::Tensor out1_expected =
1010
+ tfFloat.make ({4 }, {26.66666603 , 35.66666794 , 46.66666794 , 59.66666794 });
1011
+ exec_aten::Tensor out2_expected =
1012
+ tfFloat.make ({4 }, {0.03677177 , 0.02983340 , 0.02505574 , 0.02157882 });
1013
+ op_native_batch_norm_legit_no_stats_out (
1014
+ input, weight, bias, training, momentum, eps, out0, out1, out2);
1015
+ EXPECT_TENSOR_CLOSE (out0, out0_expected);
1016
+ EXPECT_TENSOR_CLOSE (out1, out1_expected);
1017
+ EXPECT_TENSOR_CLOSE (out2, out2_expected);
1018
+ }
1019
+
1020
+ TEST_F (OpNativeBatchNormLegitNoStatsOutTest, SampleAtomicTest3D) {
1021
+ torch::executor::testing::TensorFactory<exec_aten::ScalarType::Float> tfFloat;
1022
+
1023
+ exec_aten::Tensor input = tfFloat.make (
1024
+ {2 , 3 , 4 }, {0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 , 100 , 121 ,
1025
+ 144 , 169 , 196 , 225 , 256 , 289 , 324 , 361 , 400 , 441 , 484 , 529 });
1026
+ exec_aten::optional<exec_aten::Tensor> weight =
1027
+ exec_aten::optional<exec_aten::Tensor>();
1028
+ exec_aten::optional<exec_aten::Tensor> bias =
1029
+ exec_aten::optional<exec_aten::Tensor>();
1030
+ bool training = true ;
1031
+ double momentum = 1e-3 ;
1032
+ double eps = 1e-5 ;
1033
+ exec_aten::Tensor out0 = tfFloat.zeros ({2 , 3 , 4 });
1034
+ exec_aten::Tensor out1 = tfFloat.zeros ({3 });
1035
+ exec_aten::Tensor out2 = tfFloat.zeros ({3 });
1036
+ exec_aten::Tensor out0_expected = tfFloat.make (
1037
+ {2 , 3 , 4 },
1038
+ {-1.01045656 , -0.99964952 , -0.96722847 , -0.91319335 , -1.08850884 ,
1039
+ -1.02468753 , -0.94668359 , -0.85449719 , -1.12558389 , -1.03595889 ,
1040
+ -0.93578988 , -0.82507670 , 0.54575467 , 0.81593025 , 1.10771990 ,
1041
+ 1.42112350 , 0.61339414 , 0.84740579 , 1.09560001 , 1.35797679 ,
1042
+ 0.64582670 , 0.86198103 , 1.08867943 , 1.32592189 });
1043
+ exec_aten::Tensor out1_expected = tfFloat.make ({3 }, {93.5 , 169.5 , 277.5 });
1044
+ exec_aten::Tensor out2_expected =
1045
+ tfFloat.make ({3 }, {0.01080702 , 0.00709126 , 0.00527206 });
1046
+ op_native_batch_norm_legit_no_stats_out (
1047
+ input, weight, bias, training, momentum, eps, out0, out1, out2);
1048
+ EXPECT_TENSOR_CLOSE (out0, out0_expected);
1049
+ EXPECT_TENSOR_CLOSE (out1, out1_expected);
1050
+ EXPECT_TENSOR_CLOSE (out2, out2_expected);
1051
+ }
1052
+
1053
+ TEST_F (OpNativeBatchNormLegitNoStatsOutTest, SampleAtomicTest4D) {
1054
+ torch::executor::testing::TensorFactory<exec_aten::ScalarType::Float> tfFloat;
1055
+
1056
+ exec_aten::Tensor input =
1057
+ tfFloat.make ({2 , 3 , 2 , 2 }, {0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 ,
1058
+ 64 , 81 , 100 , 121 , 144 , 169 , 196 , 225 ,
1059
+ 256 , 289 , 324 , 361 , 400 , 441 , 484 , 529 });
1060
+ exec_aten::optional<exec_aten::Tensor> weight =
1061
+ exec_aten::optional<exec_aten::Tensor>(
1062
+ tfFloat.make ({3 }, {1.1 , 0.7 , 0.3 }));
1063
+ exec_aten::optional<exec_aten::Tensor> bias =
1064
+ exec_aten::optional<exec_aten::Tensor>(
1065
+ tfFloat.make ({3 }, {1.7 , 2.2 , 3.3 }));
1066
+ bool training = true ;
1067
+ double momentum = 1e-3 ;
1068
+ double eps = 1e-5 ;
1069
+ exec_aten::Tensor out0 = tfFloat.zeros ({2 , 3 , 2 , 2 });
1070
+ exec_aten::Tensor out1 = tfFloat.zeros ({3 });
1071
+ exec_aten::Tensor out2 = tfFloat.zeros ({3 });
1072
+ exec_aten::Tensor out0_expected = tfFloat.make (
1073
+ {2 , 3 , 2 , 2 },
1074
+ {0.58849782 , 0.60038555 , 0.63604873 , 0.69548732 , 1.43804383 , 1.48271883 ,
1075
+ 1.53732157 , 1.60185206 , 2.96232486 , 2.98921227 , 3.01926303 , 3.05247688 ,
1076
+ 2.30033016 , 2.59752321 , 2.91849184 , 3.26323581 , 2.62937593 , 2.79318404 ,
1077
+ 2.96691990 , 3.15058374 , 3.49374819 , 3.55859423 , 3.62660384 , 3.69777656 });
1078
+ exec_aten::Tensor out1_expected = tfFloat.make ({3 }, {93.5 , 169.5 , 277.5 });
1079
+ exec_aten::Tensor out2_expected =
1080
+ tfFloat.make ({3 }, {0.01080702 , 0.00709126 , 0.00527206 });
1081
+ op_native_batch_norm_legit_no_stats_out (
1082
+ input, weight, bias, training, momentum, eps, out0, out1, out2);
1083
+ EXPECT_TENSOR_CLOSE (out0, out0_expected);
1084
+ EXPECT_TENSOR_CLOSE (out1, out1_expected);
1085
+ EXPECT_TENSOR_CLOSE (out2, out2_expected);
1086
+ }
0 commit comments