From c57f5fc6260f89b1c8f01f1762eb793d1ba03cfa Mon Sep 17 00:00:00 2001 From: Smirnov Egor Date: Mon, 19 Jul 2021 18:31:39 +0300 Subject: [PATCH] add tests for asymmetric padding in conv2d, max_pool and conv2d_backprop_input --- .../conv2d_asymmetric_pads_nchw_in.npy | Bin 0 -> 224 bytes .../conv2d_asymmetric_pads_nchw_net.pb | Bin 0 -> 770 bytes .../conv2d_asymmetric_pads_nchw_out.npy | Bin 0 -> 200 bytes .../conv2d_asymmetric_pads_nhwc_in.npy | Bin 0 -> 224 bytes .../conv2d_asymmetric_pads_nhwc_net.pb | Bin 0 -> 770 bytes .../conv2d_asymmetric_pads_nhwc_out.npy | Bin 0 -> 200 bytes ...backprop_input_asymmetric_pads_nchw_in.npy | Bin 0 -> 200 bytes ...backprop_input_asymmetric_pads_nchw_net.pb | Bin 0 -> 988 bytes ...ackprop_input_asymmetric_pads_nchw_out.npy | Bin 0 -> 224 bytes ...backprop_input_asymmetric_pads_nhwc_in.npy | Bin 0 -> 200 bytes ...backprop_input_asymmetric_pads_nhwc_net.pb | Bin 0 -> 988 bytes ...ackprop_input_asymmetric_pads_nhwc_out.npy | Bin 0 -> 224 bytes .../dnn/tensorflow/generate_tf2_models.py | 55 ++++++++++++++++-- .../max_pool2d_asymmetric_pads_nchw_in.npy | Bin 0 -> 152 bytes .../max_pool2d_asymmetric_pads_nchw_net.pb | Bin 0 -> 317 bytes .../max_pool2d_asymmetric_pads_nchw_out.npy | Bin 0 -> 136 bytes .../max_pool2d_asymmetric_pads_nhwc_in.npy | Bin 0 -> 152 bytes .../max_pool2d_asymmetric_pads_nhwc_net.pb | Bin 0 -> 317 bytes .../max_pool2d_asymmetric_pads_nhwc_out.npy | Bin 0 -> 136 bytes 19 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 testdata/dnn/tensorflow/conv2d_asymmetric_pads_nchw_in.npy create mode 100644 testdata/dnn/tensorflow/conv2d_asymmetric_pads_nchw_net.pb create mode 100644 testdata/dnn/tensorflow/conv2d_asymmetric_pads_nchw_out.npy create mode 100644 testdata/dnn/tensorflow/conv2d_asymmetric_pads_nhwc_in.npy create mode 100644 testdata/dnn/tensorflow/conv2d_asymmetric_pads_nhwc_net.pb create mode 100644 testdata/dnn/tensorflow/conv2d_asymmetric_pads_nhwc_out.npy create mode 100644 testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nchw_in.npy create mode 100644 testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nchw_net.pb create mode 100644 testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nchw_out.npy create mode 100644 testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nhwc_in.npy create mode 100644 testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nhwc_net.pb create mode 100644 testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nhwc_out.npy create mode 100644 testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nchw_in.npy create mode 100644 testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nchw_net.pb create mode 100644 testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nchw_out.npy create mode 100644 testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nhwc_in.npy create mode 100644 testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nhwc_net.pb create mode 100644 testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nhwc_out.npy diff --git a/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nchw_in.npy b/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nchw_in.npy new file mode 100644 index 0000000000000000000000000000000000000000..3dc59dbb9b92828d5591566127ef20da7ac5bf5e GIT binary patch literal 224 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoTQ3dTALCYm}5wF+bauERIe_Xjh~-q-WZz~13zx9#)mAMAC4ZrWA9 zS+M_pL7Kh!<|6x3((Dc@|1IpTPyE~$uXEGBKJ=cwZ@?CN)!L-}ZeINR-dx|ezwaZb a!}o;!``tFN+iM4$wfB>JxUbbNVIKhW8%qrU literal 0 HcmV?d00001 diff --git a/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nchw_net.pb b/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nchw_net.pb new file mode 100644 index 0000000000000000000000000000000000000000..4fb64436a5926329e146bd2b2a2243d5c64df8a0 GIT binary patch literal 770 zcmd_)XD(W zMSmE%Sj!S~N>hbCF*?0x1Ud=iFpz^l80`}XGk74l5>)$FA8RkN4kg%6xtdJrxp0wDx7(>7bK$MF+C9xziJ}ti}H?c&BO^C(M*&|#_l#4SZ zGbgbm6BwOB99(QtEQ~;)rN||iS^STw? z2yqEPK{44P07oP&(DibFDMma(qQCr dqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-Its=*3PwOuQ%9jzfegSk?eMQX@x^@yK5S>PkA2$YaPYz;hs=us4lj>; zIb8WrY=3Bu&w)qQOYJ}EecbPDVd${?{PF#hyTt8_?pN;P%Gk8uA>rs=+iH~q0Ov14 Ad;kCd literal 0 HcmV?d00001 diff --git a/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nhwc_in.npy b/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nhwc_in.npy new file mode 100644 index 0000000000000000000000000000000000000000..a67675944e96b11cfe4da124898a950f302239b8 GIT binary patch literal 224 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoTQ3dTALCYm}5wF+bau1(2L?1BXu_WuspXTP<@!+v^Iu)TZeBKuh# zx_gbzOxnk}VuO8o*+09^->mz@Ke*XDy-u~?+!A2V#&p}>bE)Y8qegZ6Ukz<`Q~6%( Z&0m^l$5O9uzg23+{-@DmcAek3?Enh6Mu-3a literal 0 HcmV?d00001 diff --git a/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nhwc_net.pb b/testdata/dnn/tensorflow/conv2d_asymmetric_pads_nhwc_net.pb new file mode 100644 index 0000000000000000000000000000000000000000..14fce4876d03d17b63379a0e5af6e312abad5942 GIT binary patch literal 770 zcmd zh*^M`iR&X1mtJmuN@`BLxqeBSUUGhJL1KwsnW0`@9*~n)W|R_dtnUnBxag;4=9Hus z39$mX#U)BQ`dRr&Ryp~}i8&eh#U=VhsRcQi$%$45`X!0Q*+42KwJb9^)yg>_)XD(W zMSmE%Sj!S~N>hbCF*?0x1Ud=iFp#4_mYAYwmD&(2O<|{ z=;hf@Q=VWKWwT=M)a7dSf0pmte~dq5|MmwH?2T4R*ggC&xc}1H1N-v}Q}>^IHP3!( zRJ;98?)mmR=T+Iidt9||KSSOAqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-Its=*3PwOuQ%9jzfegUKskLr@+DZQd{A$x2g72E!w-#Tu|6=^Zc5bBo z-pNJ_?2jK4cPQfJJy7&N+rjwe$Nj0N_#J-PbUVCW+q_@(%ToJz4FiWIzK-?)>3BT* literal 0 HcmV?d00001 diff --git a/testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nchw_in.npy b/testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nchw_in.npy new file mode 100644 index 0000000000000000000000000000000000000000..7f7a1f3728c8f7f1eab224018bb739d2971d4773 GIT binary patch literal 200 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-Its=*3PwOuQ%9jzfegTPU=gdmA<426@zMFE!>c%aak!~>GiXNn|{sSW5lP4rBiEOd)f!b}>b zpz3Ct2z5b9E>qXsv|5hltHHRc5hb}wd@U8g{RDrxd<9LP03AIqKz{gw0RERC_bh?0 z*Ppav(KbB%yq%vM+K<1#QS4tM4ZPXU&P}vEwMO5c-FxNYZG7(X9y|nE=StI)`^t{Y zTML~F_UMlhyz`Y|2gbVWhFdN8u1Mz2PgUc@L$>k3#>)9^OWk-^j<;_HYI(=Z9cu=Z z+s98;G@i*W^HpOl*z@5nU-LL?PbuSg>+mwprli z+X73KfxJ~!BAB8qt9nlgl|blYsplLFU;w@8Sv^4zu`P#UZP7@ygDZoc6iKSGQh3hE uaGRhvol*oTE$g~q=t7T~M$8TXCCEl)MJFm5M1`GiUBoU-?su|J+`j?*Lq*>J literal 0 HcmV?d00001 diff --git a/testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nchw_out.npy b/testdata/dnn/tensorflow/conv2d_backprop_input_asymmetric_pads_nchw_out.npy new file mode 100644 index 0000000000000000000000000000000000000000..9b884a8184abb5fd5a327e760b8311fa7d25c8aa GIT binary patch literal 224 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoTQ3dTALCYm}5wF+bauJc=z_h$qg+vlot=|J?alMZuw9PQ&>+V}6Z zYO&AAh~598;DAk@_sl(x=Vt9sbqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-Its=*3PwOuQ%9jzfegU4-Njz3s=g{rL-n z_qTo5*}se9gx#)p#hzSCA6SQTz1ezeujTi@@U??m_z#iyI>5{DSp-^B~ zIE-v@UCWrhn!s_rol|vDP`mVu8A!{9s)zy?446Wun+8eFDWc59TUxo`>UI{k3fgjl znw8P!1}|-5rERP}Hz+A7u~1kk7z+4_fd^MQn;m{pPZ@&g&xQP&MiVU;miTr->^9Q6 z!7G}PHTl{AC6@~~HY}AB#cH5KQB66$M0_Y_C5C5T^c1*5*YVdY z&&cCjI}3Zp<7D*CJu)}$NP1t_V?8t$y}jcqS?4Op!1IXAwH=NOUmhUM&cQ;{ zHy?R26O9fHt|wD37b2JHZ$vJPO&5}V<760DPPk$s=#&Ig;5+nmN-$9=vNrEO5@#!5nWU(KsZhHj2Q2kk z0bT4iST5&_R#i;i5F|;_Iy1-xq1Qoe2N>!?degpif*^A2JKAz65lqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoTQ3dTALCYm}5wF+baF8kAm_T6>%*}wHchkc9ERlB{)8yzlw`LNCHW data = data.transpose(0, 3, 1, 2) - elif data.ndim == 5: + elif not nchw and data.ndim == 5: # NDHWC->NCDHW data = data.transpose(0, 4, 1, 2, 3) @@ -32,7 +32,7 @@ def writeBlob(data, name): np.save(name + '.npy', data) -def save(model, name, **kwargs): +def save(model, name, nchw = False, **kwargs): model.save(name) assert(len(kwargs) == 1) @@ -40,8 +40,8 @@ def save(model, name, **kwargs): inputData = gen_data(next(iter(kwargs.values()))) outputData = model(inputData) - writeBlob(inputData, name + '_in') - writeBlob(outputData, name + '_out') + writeBlob(inputData, name + '_in', nchw) + writeBlob(outputData, name + '_out', nchw) # Freeze model loaded = tf.saved_model.load(name) @@ -78,6 +78,49 @@ def save(model, name, **kwargs): ]) save(model, 'tf2_permute_nhwc_ncwh', average_pooling2d_input=tf.TensorSpec(shape=[None, 4, 6, 3], dtype=tf.float32)) ################################################################################ +# TF 2.5.0 + python 3.6.13 +tf.keras.backend.set_image_data_format('channels_first') +x = tf.keras.layers.Input(batch_shape = (1, 2, 3, 4), name='x') +kernel = np.random.standard_normal((3, 3, 2, 3)).astype(np.float32) +y = tf.nn.conv2d(x, tf.constant(kernel, dtype=tf.float32), data_format = 'NCHW', padding = [[0, 0], [0, 0], [2, 1], [2, 1]], strides = [1, 1, 3, 2]) +model = tf.keras.Model(x, y) +save(model, 'conv2d_asymmetric_pads_nchw', True, x=tf.TensorSpec(shape=[1, 2, 3, 4], dtype=tf.float32)) +################################################################################ +# TF 2.5.0 + python 3.6.13 +tf.keras.backend.set_image_data_format('channels_last') +x = tf.keras.layers.Input(batch_shape = (1, 3, 4, 2), name='x') +kernel = np.random.standard_normal((3, 3, 2, 3)).astype(np.float32) +y = tf.nn.conv2d(x, tf.constant(kernel, dtype=tf.float32), data_format = 'NHWC', padding = [[0, 0], [2, 1], [2, 1], [0, 0]], strides = [1, 3, 2, 1]) +model = tf.keras.Model(x, y) +save(model, 'conv2d_asymmetric_pads_nhwc', False, x=tf.TensorSpec(shape=[1, 3, 4, 2], dtype=tf.float32)) +################################################################################ +# TF 2.5.0 + python 3.6.13 +tf.keras.backend.set_image_data_format('channels_first') +x = tf.keras.layers.Input(batch_shape = (1, 1, 2, 3), name='x') +y = tf.nn.max_pool(x, ksize=2, data_format = "NCHW", padding = [[0, 0], [0, 0], [1, 0], [1, 1]], strides = [1, 1, 3, 2]) +model = tf.keras.Model(x, y) +save(model, 'max_pool2d_asymmetric_pads_nchw', True, x=tf.TensorSpec(shape=(1, 1, 2, 3), dtype=tf.float32)) +################################################################################ +# TF 2.5.0 + python 3.6.13 +tf.keras.backend.set_image_data_format('channels_last') +x = tf.keras.layers.Input(batch_shape = (1, 2, 3, 1), name='x') +y = tf.nn.max_pool(x, ksize=2, data_format = "NHWC", padding = [[0, 0], [1, 0], [1, 1], [0, 0]], strides = [1, 3, 2, 1]) +model = tf.keras.Model(x, y) +save(model, 'max_pool2d_asymmetric_pads_nhwc', False, x=tf.TensorSpec(shape=(1, 2, 3, 1), dtype=tf.float32)) +################dd################################################################ +tf.keras.backend.set_image_data_format('channels_first') +x = tf.keras.layers.Input(batch_shape = (1, 3, 2, 3), name='x') +kernel = np.random.standard_normal((3, 3, 2, 3)).astype(np.float32) +y = tf.compat.v1.nn.conv2d_backprop_input(input_sizes=tf.constant([1, 2, 3, 4]), filter=kernel, out_backprop=x, data_format = "NCHW", padding = [[0, 0], [0, 0], [2, 1], [2, 1]], strides = [1, 1, 3, 2]) +model = tf.keras.Model(x, y) +save(model, 'conv2d_backprop_input_asymmetric_pads_nchw', True, x=tf.TensorSpec(shape=(1, 3, 2, 3), dtype=tf.float32)) +################################################################################ +tf.keras.backend.set_image_data_format('channels_last') +x = tf.keras.layers.Input(batch_shape = (1, 2, 3, 3), name='x') +kernel = np.random.standard_normal((3, 3, 2, 3)).astype(np.float32) +y = tf.compat.v1.nn.conv2d_backprop_input(input_sizes=tf.constant([1, 3, 4, 2]), filter=kernel, out_backprop=x, data_format = "NHWC", padding = [[0, 0], [2, 1], [2, 1], [0, 0]], strides = [1, 3, 2, 1]) +model = tf.keras.Model(x, y) +save(model, 'conv2d_backprop_input_asymmetric_pads_nhwc', False, x=tf.TensorSpec(shape=(1, 2, 3, 3), dtype=tf.float32)) # Uncomment to print the final graph. # with tf.io.gfile.GFile('tf2_prelu_net.pb', 'rb') as f: diff --git a/testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nchw_in.npy b/testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nchw_in.npy new file mode 100644 index 0000000000000000000000000000000000000000..17434123f67443d861287ecbb7aee7cc07de76ce GIT binary patch literal 152 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!q@!T0siRPUPWSj%lsEAD6nl>^zVCPHyq`uekp10|0ld BCHnvX literal 0 HcmV?d00001 diff --git a/testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nchw_net.pb b/testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nchw_net.pb new file mode 100644 index 0000000000000000000000000000000000000000..8160bc4d632592bdb497b981f739dfcde85beab6 GIT binary patch literal 317 zcma)%PfNo<5XC#2rdcK)>_{*1qsLKxygJ&Kw%2O(#-}wLi9o*gc4AjQfKc3~ernaTvvh9pN|NUDasg zvxCIDiN@n>(p3~`)gQvk-q0+TUJNc{1=d@k~0E3PoqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= hXCxM+0{I$-ItmbEq^YA&t3U?ey6Sez?v81#JpfWdAEW>P literal 0 HcmV?d00001 diff --git a/testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nhwc_in.npy b/testdata/dnn/tensorflow/max_pool2d_asymmetric_pads_nhwc_in.npy new file mode 100644 index 0000000000000000000000000000000000000000..095c93c7bc58888deface7de8e75850ce29d45cb GIT binary patch literal 152 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!q@!T0siRPu}n?J^+Td BCr`+aMO-GjKs$nDf%Xmv@9!yq;&{9`-<-c^k@ zrF>fY?V_$1mFi{NH06VqkIOgJ7bm88#1wiFBdkx=b4;}IN^YC3Ql6$Xd4KuH#0}0& z-qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= hXCxM+0{I$-ItmbEq^YA&t3U?e66