onnx2tf 1.29.17__tar.gz → 1.29.19__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/PKG-INFO +15 -14
  2. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/README.md +14 -13
  3. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/__init__.py +1 -1
  4. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Col2Im.py +108 -64
  5. onnx2tf-1.29.19/onnx2tf/ops/DFT.py +245 -0
  6. onnx2tf-1.29.19/onnx2tf/ops/DeformConv.py +399 -0
  7. onnx2tf-1.29.19/onnx2tf/ops/ImageDecoder.py +147 -0
  8. onnx2tf-1.29.19/onnx2tf/ops/NegativeLogLikelihoodLoss.py +237 -0
  9. onnx2tf-1.29.19/onnx2tf/ops/RMSNormalization.py +175 -0
  10. onnx2tf-1.29.19/onnx2tf/ops/RegexFullMatch.py +108 -0
  11. onnx2tf-1.29.19/onnx2tf/ops/RotaryEmbedding.py +285 -0
  12. onnx2tf-1.29.19/onnx2tf/ops/Scan.py +438 -0
  13. onnx2tf-1.29.19/onnx2tf/ops/SoftmaxCrossEntropyLoss.py +289 -0
  14. onnx2tf-1.29.19/onnx2tf/ops/StringConcat.py +128 -0
  15. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/StringNormalizer.py +54 -39
  16. onnx2tf-1.29.19/onnx2tf/ops/StringSplit.py +156 -0
  17. onnx2tf-1.29.19/onnx2tf/ops/TensorScatter.py +223 -0
  18. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/pyproject.toml +1 -1
  19. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/__main__.py +0 -0
  20. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/onnx2tf.py +0 -0
  21. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Abs.py +0 -0
  22. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Acos.py +0 -0
  23. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Acosh.py +0 -0
  24. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Add.py +0 -0
  25. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/AffineGrid.py +0 -0
  26. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/And.py +0 -0
  27. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ArgMax.py +0 -0
  28. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ArgMin.py +0 -0
  29. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Asin.py +0 -0
  30. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Asinh.py +0 -0
  31. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Atan.py +0 -0
  32. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Atanh.py +0 -0
  33. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Attention.py +0 -0
  34. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/AveragePool.py +0 -0
  35. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/BatchNormalization.py +0 -0
  36. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Bernoulli.py +0 -0
  37. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/BitShift.py +0 -0
  38. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/BitwiseAnd.py +0 -0
  39. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/BitwiseNot.py +0 -0
  40. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/BitwiseOr.py +0 -0
  41. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/BitwiseXor.py +0 -0
  42. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/BlackmanWindow.py +0 -0
  43. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Cast.py +0 -0
  44. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Ceil.py +0 -0
  45. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Celu.py +0 -0
  46. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Clip.py +0 -0
  47. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Compress.py +0 -0
  48. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Concat.py +0 -0
  49. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ConcatFromSequence.py +0 -0
  50. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Constant.py +0 -0
  51. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ConstantOfShape.py +0 -0
  52. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Conv.py +0 -0
  53. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ConvInteger.py +0 -0
  54. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ConvTranspose.py +0 -0
  55. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Cos.py +0 -0
  56. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Cosh.py +0 -0
  57. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/CumProd.py +0 -0
  58. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/CumSum.py +0 -0
  59. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/DepthToSpace.py +0 -0
  60. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/DequantizeLinear.py +0 -0
  61. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Det.py +0 -0
  62. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Div.py +0 -0
  63. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Dropout.py +0 -0
  64. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/DynamicQuantizeLinear.py +0 -0
  65. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Einsum.py +0 -0
  66. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Elu.py +0 -0
  67. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Equal.py +0 -0
  68. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Erf.py +0 -0
  69. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Exp.py +0 -0
  70. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Expand.py +0 -0
  71. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/EyeLike.py +0 -0
  72. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Flatten.py +0 -0
  73. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Floor.py +0 -0
  74. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/FusedConv.py +0 -0
  75. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GRU.py +0 -0
  76. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Gather.py +0 -0
  77. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GatherElements.py +0 -0
  78. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GatherND.py +0 -0
  79. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Gelu.py +0 -0
  80. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Gemm.py +0 -0
  81. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GlobalAveragePool.py +0 -0
  82. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GlobalLpPool.py +0 -0
  83. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GlobalMaxPool.py +0 -0
  84. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Greater.py +0 -0
  85. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GreaterOrEqual.py +0 -0
  86. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GridSample.py +0 -0
  87. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/GroupNorm.py +0 -0
  88. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/HammingWindow.py +0 -0
  89. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/HannWindow.py +0 -0
  90. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/HardSigmoid.py +0 -0
  91. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/HardSwish.py +0 -0
  92. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Hardmax.py +0 -0
  93. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Identity.py +0 -0
  94. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/If.py +0 -0
  95. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Input.py +0 -0
  96. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/InstanceNormalization.py +0 -0
  97. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Inverse.py +0 -0
  98. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/IsInf.py +0 -0
  99. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/IsNaN.py +0 -0
  100. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LRN.py +0 -0
  101. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LSTM.py +0 -0
  102. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LayerNormalization.py +0 -0
  103. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LeakyRelu.py +0 -0
  104. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Less.py +0 -0
  105. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LessOrEqual.py +0 -0
  106. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Log.py +0 -0
  107. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LogSoftmax.py +0 -0
  108. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Loop.py +0 -0
  109. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LpNormalization.py +0 -0
  110. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/LpPool.py +0 -0
  111. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/MatMul.py +0 -0
  112. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/MatMulInteger.py +0 -0
  113. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Max.py +0 -0
  114. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/MaxPool.py +0 -0
  115. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/MaxRoiPool.py +0 -0
  116. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/MaxUnpool.py +0 -0
  117. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Mean.py +0 -0
  118. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/MeanVarianceNormalization.py +0 -0
  119. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/MelWeightMatrix.py +0 -0
  120. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Min.py +0 -0
  121. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Mish.py +0 -0
  122. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Mod.py +0 -0
  123. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Mul.py +0 -0
  124. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Multinomial.py +0 -0
  125. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Neg.py +0 -0
  126. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/NonMaxSuppression.py +0 -0
  127. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/NonZero.py +0 -0
  128. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Not.py +0 -0
  129. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/OneHot.py +0 -0
  130. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/OptionalGetElement.py +0 -0
  131. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/OptionalHasElement.py +0 -0
  132. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Or.py +0 -0
  133. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/PRelu.py +0 -0
  134. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Pad.py +0 -0
  135. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Pow.py +0 -0
  136. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearAdd.py +0 -0
  137. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearConcat.py +0 -0
  138. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearConv.py +0 -0
  139. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearLeakyRelu.py +0 -0
  140. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearMatMul.py +0 -0
  141. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearMul.py +0 -0
  142. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearSigmoid.py +0 -0
  143. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QLinearSoftmax.py +0 -0
  144. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/QuantizeLinear.py +0 -0
  145. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/RNN.py +0 -0
  146. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/RandomNormal.py +0 -0
  147. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/RandomNormalLike.py +0 -0
  148. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/RandomUniform.py +0 -0
  149. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/RandomUniformLike.py +0 -0
  150. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Range.py +0 -0
  151. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Reciprocal.py +0 -0
  152. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceL1.py +0 -0
  153. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceL2.py +0 -0
  154. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceLogSum.py +0 -0
  155. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceLogSumExp.py +0 -0
  156. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceMax.py +0 -0
  157. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceMean.py +0 -0
  158. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceMin.py +0 -0
  159. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceProd.py +0 -0
  160. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceSum.py +0 -0
  161. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReduceSumSquare.py +0 -0
  162. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Relu.py +0 -0
  163. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Reshape.py +0 -0
  164. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Resize.py +0 -0
  165. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ReverseSequence.py +0 -0
  166. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/RoiAlign.py +0 -0
  167. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Round.py +0 -0
  168. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/STFT.py +0 -0
  169. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ScaleAndTranslate.py +0 -0
  170. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Scatter.py +0 -0
  171. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ScatterElements.py +0 -0
  172. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ScatterND.py +0 -0
  173. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Selu.py +0 -0
  174. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SequenceAt.py +0 -0
  175. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SequenceConstruct.py +0 -0
  176. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SequenceEmpty.py +0 -0
  177. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SequenceErase.py +0 -0
  178. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SequenceInsert.py +0 -0
  179. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SequenceLength.py +0 -0
  180. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Shape.py +0 -0
  181. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Shrink.py +0 -0
  182. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Sigmoid.py +0 -0
  183. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Sign.py +0 -0
  184. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Sin.py +0 -0
  185. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Sinh.py +0 -0
  186. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Size.py +0 -0
  187. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Slice.py +0 -0
  188. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Softmax.py +0 -0
  189. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Softplus.py +0 -0
  190. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Softsign.py +0 -0
  191. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SpaceToDepth.py +0 -0
  192. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Split.py +0 -0
  193. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/SplitToSequence.py +0 -0
  194. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Sqrt.py +0 -0
  195. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Squeeze.py +0 -0
  196. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Sub.py +0 -0
  197. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Sum.py +0 -0
  198. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Tan.py +0 -0
  199. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Tanh.py +0 -0
  200. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/ThresholdedRelu.py +0 -0
  201. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Tile.py +0 -0
  202. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/TopK.py +0 -0
  203. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Transpose.py +0 -0
  204. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Trilu.py +0 -0
  205. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Unique.py +0 -0
  206. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Unsqueeze.py +0 -0
  207. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Upsample.py +0 -0
  208. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Where.py +0 -0
  209. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/Xor.py +0 -0
  210. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/ops/__init__.py +0 -0
  211. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/utils/__init__.py +0 -0
  212. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/utils/common_functions.py +0 -0
  213. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/utils/enums.py +0 -0
  214. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/utils/iterative_json_optimizer.py +0 -0
  215. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/utils/json_auto_generator.py +0 -0
  216. {onnx2tf-1.29.17 → onnx2tf-1.29.19}/onnx2tf/utils/logging.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onnx2tf
3
- Version: 1.29.17
3
+ Version: 1.29.19
4
4
  Summary: Self-Created Tools to convert ONNX files (NCHW) to TensorFlow/TFLite/Keras format (NHWC). The purpose of this tool is to solve the massive Transpose extrapolation problem in onnx-tensorflow (onnx-tf).
5
5
  Keywords: onnx,tensorflow,tflite,keras,deep-learning,machine-learning
6
6
  Author: Katsuya Hyodo
@@ -137,11 +137,11 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
137
137
  |Cos|:heavy_check_mark:|
138
138
  |CumProd|:heavy_check_mark:|
139
139
  |CumSum|:heavy_check_mark:|
140
- |DeformConv|**Help wanted**|
140
+ |DeformConv|:white_check_mark:|
141
141
  |DepthToSpace|:heavy_check_mark:|
142
142
  |Det|:heavy_check_mark:|
143
143
  |DequantizeLinear|:heavy_check_mark:|
144
- |DFT|**Help wanted**|
144
+ |DFT|:white_check_mark:|
145
145
  |Div|:heavy_check_mark:|
146
146
  |Dropout|:heavy_check_mark:|
147
147
  |DynamicQuantizeLinear|:heavy_check_mark:|
@@ -175,7 +175,7 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
175
175
  |HardSwish|:heavy_check_mark:|
176
176
  |Identity|:heavy_check_mark:|
177
177
  |If|:heavy_check_mark:|
178
- |ImageDecoder|**Help wanted**|
178
+ |ImageDecoder|:white_check_mark:|
179
179
  |Input|:heavy_check_mark:|
180
180
  |InstanceNormalization|:heavy_check_mark:|
181
181
  |Inverse|:heavy_check_mark:|
@@ -207,7 +207,7 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
207
207
  |Mul|:heavy_check_mark:|
208
208
  |Multinomial|:heavy_check_mark:|
209
209
  |Neg|:heavy_check_mark:|
210
- |NegativeLogLikelihoodLoss|**Help wanted**|
210
+ |NegativeLogLikelihoodLoss|:heavy_check_mark:|
211
211
  |NonMaxSuppression|:heavy_check_mark:|
212
212
  |NonZero|:heavy_check_mark:|
213
213
  |Optional|**Help wanted**|
@@ -244,19 +244,20 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
244
244
  |ReduceProd|:heavy_check_mark:|
245
245
  |ReduceSum|:heavy_check_mark:|
246
246
  |ReduceSumSquare|:heavy_check_mark:|
247
+ |RegexFullMatch|:heavy_check_mark:|
247
248
  |Relu|:heavy_check_mark:|
248
249
  |Reshape|:heavy_check_mark:|
249
250
  |Resize|:heavy_check_mark:|
250
251
  |ReverseSequence|:heavy_check_mark:|
251
252
  |RNN|:heavy_check_mark:|
252
253
  |RoiAlign|:heavy_check_mark:|
253
- |RotaryEmbedding|**Help wanted**|
254
+ |RotaryEmbedding|:heavy_check_mark:|
254
255
  |Round|:heavy_check_mark:|
255
256
  |ScaleAndTranslate|:heavy_check_mark:|
256
257
  |Scatter|:heavy_check_mark:|
257
258
  |ScatterElements|:heavy_check_mark:|
258
259
  |ScatterND|:heavy_check_mark:|
259
- |Scan|**Help wanted**|
260
+ |Scan|:heavy_check_mark:|
260
261
  |Selu|:heavy_check_mark:|
261
262
  |SequenceAt|:heavy_check_mark:|
262
263
  |SequenceConstruct|:heavy_check_mark:|
@@ -273,7 +274,7 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
273
274
  |Size|:heavy_check_mark:|
274
275
  |Slice|:heavy_check_mark:|
275
276
  |Softmax|:heavy_check_mark:|
276
- |SoftmaxCrossEntropyLoss|**Help wanted**|
277
+ |SoftmaxCrossEntropyLoss|:heavy_check_mark:|
277
278
  |Softplus|:heavy_check_mark:|
278
279
  |Softsign|:heavy_check_mark:|
279
280
  |SpaceToDepth|:heavy_check_mark:|
@@ -282,14 +283,14 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
282
283
  |Sqrt|:heavy_check_mark:|
283
284
  |Squeeze|:heavy_check_mark:|
284
285
  |STFT|:white_check_mark:|
285
- |StringConcat|**Help wanted**|
286
- |StringNormalizer|:white_check_mark:|
287
- |StringSplit|**Help wanted**|
286
+ |StringConcat|:heavy_check_mark:|
287
+ |StringNormalizer|:heavy_check_mark:|
288
+ |StringSplit|:heavy_check_mark:|
288
289
  |Sub|:heavy_check_mark:|
289
290
  |Sum|:heavy_check_mark:|
290
291
  |Tan|:heavy_check_mark:|
291
292
  |Tanh|:heavy_check_mark:|
292
- |TensorScatter|**Help wanted**|
293
+ |TensorScatter|:heavy_check_mark:|
293
294
  |TfIdfVectorizer|**Help wanted**|
294
295
  |ThresholdedRelu|:heavy_check_mark:|
295
296
  |Tile|:heavy_check_mark:|
@@ -364,7 +365,7 @@ Video speed is adjusted approximately 50 times slower than actual speed.
364
365
  docker run --rm -it \
365
366
  -v `pwd`:/workdir \
366
367
  -w /workdir \
367
- ghcr.io/pinto0309/onnx2tf:1.29.17
368
+ ghcr.io/pinto0309/onnx2tf:1.29.19
368
369
 
369
370
  or
370
371
 
@@ -372,7 +373,7 @@ Video speed is adjusted approximately 50 times slower than actual speed.
372
373
  docker run --rm -it \
373
374
  -v `pwd`:/workdir \
374
375
  -w /workdir \
375
- docker.io/pinto0309/onnx2tf:1.29.17
376
+ docker.io/pinto0309/onnx2tf:1.29.19
376
377
 
377
378
  or
378
379
 
@@ -95,11 +95,11 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
95
95
  |Cos|:heavy_check_mark:|
96
96
  |CumProd|:heavy_check_mark:|
97
97
  |CumSum|:heavy_check_mark:|
98
- |DeformConv|**Help wanted**|
98
+ |DeformConv|:white_check_mark:|
99
99
  |DepthToSpace|:heavy_check_mark:|
100
100
  |Det|:heavy_check_mark:|
101
101
  |DequantizeLinear|:heavy_check_mark:|
102
- |DFT|**Help wanted**|
102
+ |DFT|:white_check_mark:|
103
103
  |Div|:heavy_check_mark:|
104
104
  |Dropout|:heavy_check_mark:|
105
105
  |DynamicQuantizeLinear|:heavy_check_mark:|
@@ -133,7 +133,7 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
133
133
  |HardSwish|:heavy_check_mark:|
134
134
  |Identity|:heavy_check_mark:|
135
135
  |If|:heavy_check_mark:|
136
- |ImageDecoder|**Help wanted**|
136
+ |ImageDecoder|:white_check_mark:|
137
137
  |Input|:heavy_check_mark:|
138
138
  |InstanceNormalization|:heavy_check_mark:|
139
139
  |Inverse|:heavy_check_mark:|
@@ -165,7 +165,7 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
165
165
  |Mul|:heavy_check_mark:|
166
166
  |Multinomial|:heavy_check_mark:|
167
167
  |Neg|:heavy_check_mark:|
168
- |NegativeLogLikelihoodLoss|**Help wanted**|
168
+ |NegativeLogLikelihoodLoss|:heavy_check_mark:|
169
169
  |NonMaxSuppression|:heavy_check_mark:|
170
170
  |NonZero|:heavy_check_mark:|
171
171
  |Optional|**Help wanted**|
@@ -202,19 +202,20 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
202
202
  |ReduceProd|:heavy_check_mark:|
203
203
  |ReduceSum|:heavy_check_mark:|
204
204
  |ReduceSumSquare|:heavy_check_mark:|
205
+ |RegexFullMatch|:heavy_check_mark:|
205
206
  |Relu|:heavy_check_mark:|
206
207
  |Reshape|:heavy_check_mark:|
207
208
  |Resize|:heavy_check_mark:|
208
209
  |ReverseSequence|:heavy_check_mark:|
209
210
  |RNN|:heavy_check_mark:|
210
211
  |RoiAlign|:heavy_check_mark:|
211
- |RotaryEmbedding|**Help wanted**|
212
+ |RotaryEmbedding|:heavy_check_mark:|
212
213
  |Round|:heavy_check_mark:|
213
214
  |ScaleAndTranslate|:heavy_check_mark:|
214
215
  |Scatter|:heavy_check_mark:|
215
216
  |ScatterElements|:heavy_check_mark:|
216
217
  |ScatterND|:heavy_check_mark:|
217
- |Scan|**Help wanted**|
218
+ |Scan|:heavy_check_mark:|
218
219
  |Selu|:heavy_check_mark:|
219
220
  |SequenceAt|:heavy_check_mark:|
220
221
  |SequenceConstruct|:heavy_check_mark:|
@@ -231,7 +232,7 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
231
232
  |Size|:heavy_check_mark:|
232
233
  |Slice|:heavy_check_mark:|
233
234
  |Softmax|:heavy_check_mark:|
234
- |SoftmaxCrossEntropyLoss|**Help wanted**|
235
+ |SoftmaxCrossEntropyLoss|:heavy_check_mark:|
235
236
  |Softplus|:heavy_check_mark:|
236
237
  |Softsign|:heavy_check_mark:|
237
238
  |SpaceToDepth|:heavy_check_mark:|
@@ -240,14 +241,14 @@ https://github.com/PINTO0309/onnx2tf/wiki/model_status
240
241
  |Sqrt|:heavy_check_mark:|
241
242
  |Squeeze|:heavy_check_mark:|
242
243
  |STFT|:white_check_mark:|
243
- |StringConcat|**Help wanted**|
244
- |StringNormalizer|:white_check_mark:|
245
- |StringSplit|**Help wanted**|
244
+ |StringConcat|:heavy_check_mark:|
245
+ |StringNormalizer|:heavy_check_mark:|
246
+ |StringSplit|:heavy_check_mark:|
246
247
  |Sub|:heavy_check_mark:|
247
248
  |Sum|:heavy_check_mark:|
248
249
  |Tan|:heavy_check_mark:|
249
250
  |Tanh|:heavy_check_mark:|
250
- |TensorScatter|**Help wanted**|
251
+ |TensorScatter|:heavy_check_mark:|
251
252
  |TfIdfVectorizer|**Help wanted**|
252
253
  |ThresholdedRelu|:heavy_check_mark:|
253
254
  |Tile|:heavy_check_mark:|
@@ -322,7 +323,7 @@ Video speed is adjusted approximately 50 times slower than actual speed.
322
323
  docker run --rm -it \
323
324
  -v `pwd`:/workdir \
324
325
  -w /workdir \
325
- ghcr.io/pinto0309/onnx2tf:1.29.17
326
+ ghcr.io/pinto0309/onnx2tf:1.29.19
326
327
 
327
328
  or
328
329
 
@@ -330,7 +331,7 @@ Video speed is adjusted approximately 50 times slower than actual speed.
330
331
  docker run --rm -it \
331
332
  -v `pwd`:/workdir \
332
333
  -w /workdir \
333
- docker.io/pinto0309/onnx2tf:1.29.17
334
+ docker.io/pinto0309/onnx2tf:1.29.19
334
335
 
335
336
  or
336
337
 
@@ -1,3 +1,3 @@
1
1
  from onnx2tf.onnx2tf import convert, main
2
2
 
3
- __version__ = '1.29.17'
3
+ __version__ = '1.29.19'
@@ -1,9 +1,9 @@
1
+ import sys
1
2
  import random
2
3
  random.seed(0)
3
4
  import numpy as np
4
5
  np.random.seed(0)
5
6
  import tensorflow as tf
6
- import tf_keras
7
7
  import onnx_graphsurgeon as gs
8
8
  from onnx2tf.utils.common_functions import (
9
9
  get_constant_or_variable,
@@ -14,57 +14,32 @@ from onnx2tf.utils.common_functions import (
14
14
  pre_process_transpose,
15
15
  post_process_transpose,
16
16
  )
17
+ from onnx2tf.utils.logging import *
17
18
 
18
19
 
19
- class Col2ImLayer(tf_keras.layers.Layer):
20
- def __init__(self):
21
- super(Col2ImLayer, self).__init__()
20
+ def _build_col2im_kernel(
21
+ *,
22
+ k_h,
23
+ k_w,
24
+ dilation_h,
25
+ dilation_w,
26
+ dtype,
27
+ ):
28
+ k_h = tf.cast(k_h, tf.int32)
29
+ k_w = tf.cast(k_w, tf.int32)
30
+ eff_k_h = (k_h - 1) * dilation_h + 1
31
+ eff_k_w = (k_w - 1) * dilation_w + 1
22
32
 
23
- def call(
24
- self,
25
- input_tensor,
26
- input_block_shape,
27
- strides,
28
- input_image_shape,
29
- pads,
30
- dilations,
31
- output_shape = None,
32
- ):
33
- N, _, L = input_tensor.shape
34
- if output_shape is not None:
35
- C = tf.convert_to_tensor(output_shape[1])
36
- output_shape = tf.convert_to_tensor([output_shape[0]] + [s for s in output_shape[2:]] + [output_shape[1]])
37
- else:
38
- C = tf.convert_to_tensor(input_tensor.shape[1] // (input_block_shape[0] * input_block_shape[1]))
39
- output_shape = tf.convert_to_tensor([N] + input_image_shape + [C])
40
- im = tf.TensorArray(input_tensor.dtype, size=N, dynamic_size=True)
41
-
42
- def loop_over_l(n, im_n, l):
43
- row_idx = tf.convert_to_tensor((l // ((input_image_shape[1] - (input_block_shape[1] - 1) * dilations[1] - 1 + strides[1]) // strides[1])) * strides[0])
44
- col_idx = tf.convert_to_tensor((l % ((input_image_shape[1] - (input_block_shape[1] - 1) * dilations[1] - 1 + strides[1]) // strides[1])) * strides[1])
45
-
46
- def loop_over_c(c, im_n):
47
- patch_idx = tf.convert_to_tensor(c * input_block_shape[0] * input_block_shape[1])
48
- patch = tf.reshape(input_tensor[n, patch_idx:patch_idx + input_block_shape[0] * input_block_shape[1], l], input_block_shape)
49
- if dilations[0] > 1 or dilations[1] > 1:
50
- dilated_patch = tf.zeros([(input_block_shape[0] - 1) * dilations[0] + 1, (input_block_shape[1] - 1) * dilations[1] + 1], dtype=patch.dtype)
51
- for i in tf.range(input_block_shape[0]):
52
- for j in tf.range(input_block_shape[1]):
53
- dilated_patch = tf.tensor_scatter_nd_update(dilated_patch, [[i * dilations[0], j * dilations[1]]], [patch[i, j]])
54
- patch = dilated_patch
55
- patch_shape = tf.shape(patch)
56
- indices = tf.reshape(tf.stack(tf.meshgrid(row_idx + tf.range(patch_shape[0]), col_idx + tf.range(patch_shape[1]), c, indexing='ij'), axis=-1), [-1, 3])
57
- updates = tf.reshape(patch, [-1])
58
- return tf.tensor_scatter_nd_add(im_n, indices, updates)
59
- return tf.reduce_sum(tf.map_fn(lambda c: loop_over_c(c, im_n), tf.range(C), dtype=im_n.dtype), axis=0)
60
-
61
- def loop_over_n(n):
62
- im_n = tf.zeros(output_shape[1:], dtype=input_tensor.dtype)
63
- return tf.reduce_sum(tf.map_fn(lambda l: loop_over_l(n, im_n, l), tf.range(L), dtype=im_n.dtype), axis=0)
64
-
65
- im = tf.map_fn(loop_over_n, tf.range(N), dtype=input_tensor.dtype)
66
-
67
- return im[:, pads[0]:input_image_shape[0]-pads[2], pads[1]:input_image_shape[1]-pads[3], :]
33
+ ky = tf.reshape(tf.repeat(tf.range(k_h), k_w), tf.stack([k_h, k_w]))
34
+ kx = tf.reshape(tf.tile(tf.range(k_w), [k_h]), tf.stack([k_h, k_w]))
35
+
36
+ positions = ky * dilation_h * eff_k_w + kx * dilation_w
37
+ positions = tf.reshape(positions, [-1])
38
+ one_hot = tf.one_hot(positions, depth=eff_k_h * eff_k_w, dtype=dtype)
39
+ kernel = tf.reshape(one_hot, tf.stack([k_h * k_w, eff_k_h, eff_k_w]))
40
+ kernel = tf.transpose(kernel, [1, 2, 0])
41
+ kernel = tf.expand_dims(kernel, axis=2)
42
+ return kernel, eff_k_h, eff_k_w
68
43
 
69
44
 
70
45
  @print_node_info
@@ -114,10 +89,9 @@ def make_node(
114
89
  input_block_shape = tf_layers_dict[graph_node_input_3.name]['tf_node'] \
115
90
  if isinstance(graph_node_input_3, gs.Variable) else graph_node_input_3
116
91
 
117
- spatial_size = len(input_image_shape)
118
- dilations = graph_node.attrs.get('dilations', [1] * spatial_size)
119
- pads = graph_node.attrs.get('pads', [0, 0] * spatial_size)
120
- strides = graph_node.attrs.get('strides', [1] * spatial_size)
92
+ dilations = graph_node.attrs.get('dilations', [1, 1])
93
+ pads = graph_node.attrs.get('pads', [0, 0, 0, 0])
94
+ strides = graph_node.attrs.get('strides', [1, 1])
121
95
 
122
96
  # Preserving Graph Structure (Dict)
123
97
  tf_layers_dict[graph_node_output.name] = {
@@ -142,17 +116,87 @@ def make_node(
142
116
  tf_layers_dict[graph_node_output.name].pop('nhwc')
143
117
 
144
118
  # Generation of TF OP
145
- col2im = Col2ImLayer()
146
- tf_layers_dict[graph_node_output.name]['tf_node'] = \
147
- col2im(
148
- input_tensor=input_tensor,
149
- input_block_shape=input_block_shape,
150
- strides=strides,
151
- input_image_shape=input_image_shape,
152
- pads=pads,
153
- dilations=dilations,
154
- output_shape=shape,
155
- )
119
+ original_dtype = input_tensor.dtype
120
+ compute_dtype = original_dtype
121
+ if original_dtype not in (tf.float16, tf.float32, tf.float64, tf.bfloat16):
122
+ if original_dtype in (tf.complex64, tf.complex128):
123
+ error('Col2Im does not support complex types in non-Flex implementation.')
124
+ sys.exit(1)
125
+ compute_dtype = tf.float32
126
+ input_tensor = tf.cast(input_tensor, compute_dtype)
127
+
128
+ input_image_shape = tf.cast(input_image_shape, tf.int32)
129
+ input_block_shape = tf.cast(input_block_shape, tf.int32)
130
+
131
+ if input_image_shape.shape is not None \
132
+ and input_image_shape.shape.rank is not None \
133
+ and input_image_shape.shape.rank != 1:
134
+ error('Col2Im supports only 2D image_shape input.')
135
+ sys.exit(1)
136
+
137
+ if input_block_shape.shape is not None \
138
+ and input_block_shape.shape.rank is not None \
139
+ and input_block_shape.shape.rank != 1:
140
+ error('Col2Im supports only 2D block_shape input.')
141
+ sys.exit(1)
142
+
143
+ k_h = input_block_shape[0]
144
+ k_w = input_block_shape[1]
145
+ h_img = input_image_shape[0]
146
+ w_img = input_image_shape[1]
147
+
148
+ stride_h, stride_w = strides
149
+ dilation_h, dilation_w = dilations
150
+ pad_top, pad_left, pad_bottom, pad_right = pads
151
+
152
+ kernel, eff_k_h, eff_k_w = _build_col2im_kernel(
153
+ k_h=k_h,
154
+ k_w=k_w,
155
+ dilation_h=dilation_h,
156
+ dilation_w=dilation_w,
157
+ dtype=compute_dtype,
158
+ )
159
+
160
+ h_pad = h_img + pad_top + pad_bottom
161
+ w_pad = w_img + pad_left + pad_right
162
+
163
+ out_h = tf.math.floordiv(h_pad - eff_k_h, stride_h) + 1
164
+ out_w = tf.math.floordiv(w_pad - eff_k_w, stride_w) + 1
165
+
166
+ input_shape = tf.shape(input_tensor)
167
+ n = input_shape[0]
168
+ ck = input_shape[1]
169
+ c = tf.math.floordiv(ck, k_h * k_w)
170
+
171
+ cols = tf.reshape(
172
+ input_tensor,
173
+ tf.stack([n, c, k_h * k_w, out_h, out_w]),
174
+ )
175
+ cols = tf.transpose(cols, [0, 1, 3, 4, 2])
176
+ cols = tf.reshape(cols, tf.stack([n * c, out_h, out_w, k_h * k_w]))
177
+
178
+ output_shape = tf.stack([n * c, h_pad, w_pad, 1])
179
+ output = tf.nn.conv2d_transpose(
180
+ cols,
181
+ kernel,
182
+ output_shape=output_shape,
183
+ strides=[1, stride_h, stride_w, 1],
184
+ padding='VALID',
185
+ )
186
+
187
+ output = tf.reshape(output, tf.stack([n, c, h_pad, w_pad]))
188
+ output = tf.transpose(output, [0, 2, 3, 1])
189
+
190
+ output = tf.slice(
191
+ output,
192
+ tf.stack([0, pad_top, pad_left, 0]),
193
+ tf.stack([-1, h_img, w_img, -1]),
194
+ )
195
+
196
+ if output.dtype != original_dtype:
197
+ output = tf.cast(output, original_dtype)
198
+
199
+ tf_layers_dict[graph_node_output.name]['tf_node'] = output
156
200
 
157
201
  # Post-process transpose
158
202
  before_trans_shape = tf_layers_dict[graph_node_output.name]['tf_node'].shape
@@ -0,0 +1,245 @@
1
+ import sys
2
+ import random
3
+ random.seed(0)
4
+ import numpy as np
5
+ np.random.seed(0)
6
+ import tensorflow as tf
7
+ import onnx_graphsurgeon as gs
8
+ from onnx2tf.utils.common_functions import (
9
+ get_constant_or_variable,
10
+ print_node_info,
11
+ inverted_operation_enable_disable,
12
+ make_tf_node_info,
13
+ get_replacement_parameter,
14
+ pre_process_transpose,
15
+ post_process_transpose,
16
+ )
17
+ from onnx2tf.utils.logging import *
18
+
19
+
20
+ def _normalize_axis(axis, rank):
21
+ axis = tf.cast(axis, tf.int32)
22
+ rank = tf.cast(rank, tf.int32)
23
+ return tf.where(axis < 0, axis + rank, axis)
24
+
25
+
26
+ def _move_axis_to_last(x, axis):
27
+ rank = tf.rank(x)
28
+ axis = _normalize_axis(axis, rank)
29
+ range0 = tf.range(axis)
30
+ range1 = tf.range(axis + 1, rank)
31
+ perm = tf.concat([range0, range1, [axis]], axis=0)
32
+ x_t = tf.transpose(x, perm)
33
+ inv_perm = tf.argsort(perm)
34
+ return x_t, inv_perm
35
+
36
+
37
+ def _pad_or_slice_last(x, length):
38
+ length = tf.cast(length, tf.int32)
39
+ current = tf.shape(x)[-1]
40
+
41
+ def _pad():
42
+ pad_amount = length - current
43
+ pad = tf.concat(
44
+ [
45
+ tf.zeros([tf.rank(x) - 1, 2], dtype=tf.int32),
46
+ tf.stack([[0, pad_amount]]),
47
+ ],
48
+ axis=0,
49
+ )
50
+ return tf.pad(x, pad)
51
+
52
+ def _slice():
53
+ return x[..., :length]
54
+
55
+ x = tf.cond(current < length, _pad, lambda: x)
56
+ x = tf.cond(current > length, _slice, lambda: x)
57
+ return x
58
+
59
+
60
+ @print_node_info
61
+ @inverted_operation_enable_disable
62
+ @get_replacement_parameter
63
+ def make_node(
64
+ *,
65
+ graph_node: gs.Node,
66
+ tf_layers_dict: dict,
67
+ **kwargs: dict,
68
+ ):
69
+ """DFT
70
+
71
+ Parameters
72
+ ----------
73
+ graph_node: gs.Node
74
+ graph_surgeon Node
75
+
76
+ tf_layers_dict: dict
77
+ optype, shape, dtype, tensorflow graph
78
+ """
79
+ before_op_output_shape_trans_1 = \
80
+ tf_layers_dict.get(graph_node.inputs[0].name, {}).get('before_op_output_shape_trans', True)
81
+
82
+ graph_node_input_1 = get_constant_or_variable(
83
+ graph_node.inputs[0],
84
+ before_op_output_shape_trans_1,
85
+ )
86
+ graph_node_input_2 = get_constant_or_variable(
87
+ graph_node.inputs[1],
88
+ before_op_output_shape_trans=False,
89
+ ) if len(graph_node.inputs) >= 2 else None
90
+ graph_node_input_3 = get_constant_or_variable(
91
+ graph_node.inputs[2],
92
+ before_op_output_shape_trans=False,
93
+ ) if len(graph_node.inputs) >= 3 else None
94
+
95
+ graph_node_output: gs.Variable = graph_node.outputs[0]
96
+ shape = graph_node_output.shape
97
+ dtype = graph_node_output.dtype
98
+
99
+ input_tensor = tf_layers_dict[graph_node_input_1.name]['tf_node'] \
100
+ if isinstance(graph_node_input_1, gs.Variable) else graph_node_input_1
101
+ dft_length = tf_layers_dict[graph_node_input_2.name]['tf_node'] \
102
+ if isinstance(graph_node_input_2, gs.Variable) else graph_node_input_2
103
+ axis = tf_layers_dict[graph_node_input_3.name]['tf_node'] \
104
+ if isinstance(graph_node_input_3, gs.Variable) else graph_node_input_3
105
+
106
+ onesided = bool(graph_node.attrs.get('onesided', 0))
107
+ inverse = bool(graph_node.attrs.get('inverse', 0))
108
+
109
+ # Preserving Graph Structure (Dict)
110
+ tf_layers_dict[graph_node_output.name] = {
111
+ 'optype': graph_node.op,
112
+ 'shape': shape,
113
+ 'dtype': dtype,
114
+ 'nhwc': tf_layers_dict[graph_node_input_1.name]['nhwc'] \
115
+ if isinstance(graph_node_input_1, gs.Variable) \
116
+ and 'nhwc' in tf_layers_dict[graph_node_input_1.name].keys() else False,
117
+ }
118
+
119
+ # Pre-process transpose
120
+ input_tensor = pre_process_transpose(
121
+ value_before_transpose=input_tensor,
122
+ param_target='inputs',
123
+ param_name=graph_node.inputs[0].name,
124
+ **kwargs,
125
+ )
126
+
127
+ input_rank = tf.rank(input_tensor)
128
+ axis_attr = graph_node.attrs.get('axis', None)
129
+ if axis is None:
130
+ if axis_attr is not None:
131
+ axis = tf.constant(axis_attr, dtype=tf.int32)
132
+ else:
133
+ axis = tf.cast(input_rank - 2, tf.int32)
134
+ else:
135
+ axis = tf.cast(tf.reshape(axis, []), tf.int32)
136
+ axis = _normalize_axis(axis, input_rank)
137
+
138
+ dft_length_value = None
139
+ if dft_length is not None:
140
+ dft_length_value = tf.cast(tf.reshape(dft_length, []), tf.int32)
141
+
142
+ input_dtype = input_tensor.dtype
143
+ if input_dtype in (tf.float64,):
144
+ float_dtype = tf.float64
145
+ complex_dtype = tf.complex128
146
+ elif input_dtype in (tf.float32,):
147
+ float_dtype = tf.float32
148
+ complex_dtype = tf.complex64
149
+ elif input_dtype in (tf.float16, tf.bfloat16):
150
+ float_dtype = tf.float32
151
+ complex_dtype = tf.complex64
152
+ else:
153
+ error('DFT supports float/bfloat16 types only.')
154
+ sys.exit(1)
155
+
156
+ # Convert to complex tensor (drop last dim)
157
+ last_dim_static = input_tensor.shape[-1]
158
+ if last_dim_static is not None:
159
+ if last_dim_static == 1:
160
+ real = tf.squeeze(input_tensor, axis=-1)
161
+ imag = tf.zeros_like(real)
162
+ elif last_dim_static == 2:
163
+ real, imag = tf.unstack(input_tensor, axis=-1)
164
+ else:
165
+ error('DFT input last dimension must be 1 or 2.')
166
+ sys.exit(1)
167
+ else:
168
+ last_dim = tf.shape(input_tensor)[-1]
169
+ def _real_case():
170
+ real = tf.squeeze(input_tensor, axis=-1)
171
+ imag = tf.zeros_like(real)
172
+ return real, imag
173
+ def _complex_case():
174
+ real, imag = tf.unstack(input_tensor, axis=-1)
175
+ return real, imag
176
+ real, imag = tf.cond(
177
+ tf.equal(last_dim, 1),
178
+ _real_case,
179
+ _complex_case,
180
+ )
181
+
182
+ real = tf.cast(real, float_dtype)
183
+ imag = tf.cast(imag, float_dtype)
184
+ signal = tf.complex(real, imag)
185
+
186
+ signal_t, inv_perm = _move_axis_to_last(signal, axis)
187
+ signal_len = tf.shape(signal_t)[-1]
188
+
189
+ if onesided and inverse:
190
+ if last_dim_static == 1:
191
+ error('DFT onesided inverse supports only complex input.')
192
+ sys.exit(1)
193
+ if dft_length_value is None:
194
+ dft_length_value = tf.cast(signal_len * 2 - 2, tf.int32)
195
+ out_real = tf.signal.irfft(signal_t, fft_length=[dft_length_value])
196
+ out_real = tf.transpose(out_real, inv_perm)
197
+ output = tf.expand_dims(out_real, axis=-1)
198
+ elif onesided and not inverse:
199
+ if last_dim_static == 2:
200
+ error('DFT onesided forward supports only real input.')
201
+ sys.exit(1)
202
+ if dft_length_value is None:
203
+ dft_length_value = tf.cast(signal_len, tf.int32)
204
+ real_signal = tf.math.real(signal_t)
205
+ out_complex = tf.signal.rfft(real_signal, fft_length=[dft_length_value])
206
+ out_complex = tf.transpose(out_complex, inv_perm)
207
+ output = tf.stack([tf.math.real(out_complex), tf.math.imag(out_complex)], axis=-1)
208
+ else:
209
+ if dft_length_value is not None:
210
+ signal_t = _pad_or_slice_last(signal_t, dft_length_value)
211
+ if inverse:
212
+ out_complex = tf.signal.ifft(signal_t)
213
+ else:
214
+ out_complex = tf.signal.fft(signal_t)
215
+ out_complex = tf.transpose(out_complex, inv_perm)
216
+ output = tf.stack([tf.math.real(out_complex), tf.math.imag(out_complex)], axis=-1)
217
+
218
+ if output.dtype != input_dtype:
219
+ output = tf.cast(output, input_dtype)
220
+
221
+ # Post-process transpose
222
+ tf_layers_dict[graph_node_output.name]['tf_node'] = post_process_transpose(
223
+ value_before_transpose=output,
224
+ param_target='outputs',
225
+ param_name=graph_node.outputs[0].name,
226
+ **kwargs,
227
+ )
228
+
229
+ # Generation of Debug Info
230
+ tf_layers_dict[graph_node_output.name]['tf_node_info'] = \
231
+ make_tf_node_info(
232
+ node_info={
233
+ 'tf_op_type': 'DFT',
234
+ 'tf_inputs': {
235
+ 'input': input_tensor,
236
+ 'axis': axis,
237
+ 'dft_length': dft_length_value,
238
+ 'onesided': onesided,
239
+ 'inverse': inverse,
240
+ },
241
+ 'tf_outputs': {
242
+ 'output': tf_layers_dict[graph_node_output.name]['tf_node'],
243
+ },
244
+ }
245
+ )