easy-cs-rec-custommodel 0.8.6__py2.py3-none-any.whl

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.

Potentially problematic release.


This version of easy-cs-rec-custommodel might be problematic. Click here for more details.

Files changed (336) hide show
  1. easy_cs_rec_custommodel-0.8.6.dist-info/LICENSE +203 -0
  2. easy_cs_rec_custommodel-0.8.6.dist-info/METADATA +48 -0
  3. easy_cs_rec_custommodel-0.8.6.dist-info/RECORD +336 -0
  4. easy_cs_rec_custommodel-0.8.6.dist-info/WHEEL +6 -0
  5. easy_cs_rec_custommodel-0.8.6.dist-info/top_level.txt +2 -0
  6. easy_rec/__init__.py +114 -0
  7. easy_rec/python/__init__.py +0 -0
  8. easy_rec/python/builders/__init__.py +0 -0
  9. easy_rec/python/builders/hyperparams_builder.py +78 -0
  10. easy_rec/python/builders/loss_builder.py +333 -0
  11. easy_rec/python/builders/optimizer_builder.py +211 -0
  12. easy_rec/python/builders/strategy_builder.py +44 -0
  13. easy_rec/python/compat/__init__.py +0 -0
  14. easy_rec/python/compat/adam_s.py +245 -0
  15. easy_rec/python/compat/array_ops.py +229 -0
  16. easy_rec/python/compat/dynamic_variable.py +542 -0
  17. easy_rec/python/compat/early_stopping.py +653 -0
  18. easy_rec/python/compat/embedding_ops.py +162 -0
  19. easy_rec/python/compat/embedding_parallel_saver.py +316 -0
  20. easy_rec/python/compat/estimator_train.py +116 -0
  21. easy_rec/python/compat/exporter.py +473 -0
  22. easy_rec/python/compat/feature_column/__init__.py +0 -0
  23. easy_rec/python/compat/feature_column/feature_column.py +3675 -0
  24. easy_rec/python/compat/feature_column/feature_column_v2.py +5233 -0
  25. easy_rec/python/compat/feature_column/sequence_feature_column.py +648 -0
  26. easy_rec/python/compat/feature_column/utils.py +154 -0
  27. easy_rec/python/compat/layers.py +329 -0
  28. easy_rec/python/compat/ops.py +14 -0
  29. easy_rec/python/compat/optimizers.py +619 -0
  30. easy_rec/python/compat/queues.py +311 -0
  31. easy_rec/python/compat/regularizers.py +208 -0
  32. easy_rec/python/compat/sok_optimizer.py +440 -0
  33. easy_rec/python/compat/sync_replicas_optimizer.py +528 -0
  34. easy_rec/python/compat/weight_decay_optimizers.py +475 -0
  35. easy_rec/python/core/__init__.py +0 -0
  36. easy_rec/python/core/easyrec_metrics/__init__.py +24 -0
  37. easy_rec/python/core/easyrec_metrics/distribute_metrics_impl_pai.py +3702 -0
  38. easy_rec/python/core/easyrec_metrics/distribute_metrics_impl_tf.py +3768 -0
  39. easy_rec/python/core/learning_schedules.py +228 -0
  40. easy_rec/python/core/metrics.py +402 -0
  41. easy_rec/python/core/sampler.py +844 -0
  42. easy_rec/python/eval.py +102 -0
  43. easy_rec/python/export.py +150 -0
  44. easy_rec/python/feature_column/__init__.py +0 -0
  45. easy_rec/python/feature_column/feature_column.py +664 -0
  46. easy_rec/python/feature_column/feature_group.py +89 -0
  47. easy_rec/python/hpo/__init__.py +0 -0
  48. easy_rec/python/hpo/emr_hpo.py +140 -0
  49. easy_rec/python/hpo/generate_hpo_sql.py +71 -0
  50. easy_rec/python/hpo/pai_hpo.py +297 -0
  51. easy_rec/python/inference/__init__.py +0 -0
  52. easy_rec/python/inference/csv_predictor.py +189 -0
  53. easy_rec/python/inference/hive_parquet_predictor.py +200 -0
  54. easy_rec/python/inference/hive_predictor.py +166 -0
  55. easy_rec/python/inference/odps_predictor.py +70 -0
  56. easy_rec/python/inference/parquet_predictor.py +147 -0
  57. easy_rec/python/inference/parquet_predictor_v2.py +147 -0
  58. easy_rec/python/inference/predictor.py +621 -0
  59. easy_rec/python/inference/processor/__init__.py +0 -0
  60. easy_rec/python/inference/processor/test.py +170 -0
  61. easy_rec/python/inference/vector_retrieve.py +124 -0
  62. easy_rec/python/input/__init__.py +0 -0
  63. easy_rec/python/input/batch_tfrecord_input.py +117 -0
  64. easy_rec/python/input/criteo_binary_reader.py +259 -0
  65. easy_rec/python/input/criteo_input.py +107 -0
  66. easy_rec/python/input/csv_input.py +175 -0
  67. easy_rec/python/input/csv_input_ex.py +72 -0
  68. easy_rec/python/input/csv_input_v2.py +68 -0
  69. easy_rec/python/input/datahub_input.py +320 -0
  70. easy_rec/python/input/dummy_input.py +58 -0
  71. easy_rec/python/input/hive_input.py +123 -0
  72. easy_rec/python/input/hive_parquet_input.py +140 -0
  73. easy_rec/python/input/hive_rtp_input.py +174 -0
  74. easy_rec/python/input/input.py +1064 -0
  75. easy_rec/python/input/kafka_dataset.py +144 -0
  76. easy_rec/python/input/kafka_input.py +235 -0
  77. easy_rec/python/input/load_parquet.py +317 -0
  78. easy_rec/python/input/odps_input.py +101 -0
  79. easy_rec/python/input/odps_input_v2.py +110 -0
  80. easy_rec/python/input/odps_input_v3.py +132 -0
  81. easy_rec/python/input/odps_rtp_input.py +187 -0
  82. easy_rec/python/input/odps_rtp_input_v2.py +104 -0
  83. easy_rec/python/input/parquet_input.py +397 -0
  84. easy_rec/python/input/parquet_input_v2.py +180 -0
  85. easy_rec/python/input/parquet_input_v3.py +203 -0
  86. easy_rec/python/input/rtp_input.py +225 -0
  87. easy_rec/python/input/rtp_input_v2.py +145 -0
  88. easy_rec/python/input/tfrecord_input.py +100 -0
  89. easy_rec/python/layers/__init__.py +0 -0
  90. easy_rec/python/layers/backbone.py +571 -0
  91. easy_rec/python/layers/capsule_layer.py +176 -0
  92. easy_rec/python/layers/cmbf.py +390 -0
  93. easy_rec/python/layers/common_layers.py +192 -0
  94. easy_rec/python/layers/dnn.py +87 -0
  95. easy_rec/python/layers/embed_input_layer.py +25 -0
  96. easy_rec/python/layers/fm.py +26 -0
  97. easy_rec/python/layers/input_layer.py +396 -0
  98. easy_rec/python/layers/keras/__init__.py +34 -0
  99. easy_rec/python/layers/keras/activation.py +114 -0
  100. easy_rec/python/layers/keras/attention.py +267 -0
  101. easy_rec/python/layers/keras/auxiliary_loss.py +47 -0
  102. easy_rec/python/layers/keras/blocks.py +262 -0
  103. easy_rec/python/layers/keras/bst.py +119 -0
  104. easy_rec/python/layers/keras/custom_ops.py +250 -0
  105. easy_rec/python/layers/keras/data_augment.py +133 -0
  106. easy_rec/python/layers/keras/din.py +67 -0
  107. easy_rec/python/layers/keras/einsum_dense.py +598 -0
  108. easy_rec/python/layers/keras/embedding.py +81 -0
  109. easy_rec/python/layers/keras/fibinet.py +251 -0
  110. easy_rec/python/layers/keras/interaction.py +416 -0
  111. easy_rec/python/layers/keras/layer_norm.py +364 -0
  112. easy_rec/python/layers/keras/mask_net.py +166 -0
  113. easy_rec/python/layers/keras/multi_head_attention.py +717 -0
  114. easy_rec/python/layers/keras/multi_task.py +125 -0
  115. easy_rec/python/layers/keras/numerical_embedding.py +376 -0
  116. easy_rec/python/layers/keras/ppnet.py +194 -0
  117. easy_rec/python/layers/keras/transformer.py +192 -0
  118. easy_rec/python/layers/layer_norm.py +51 -0
  119. easy_rec/python/layers/mmoe.py +83 -0
  120. easy_rec/python/layers/multihead_attention.py +162 -0
  121. easy_rec/python/layers/multihead_cross_attention.py +749 -0
  122. easy_rec/python/layers/senet.py +73 -0
  123. easy_rec/python/layers/seq_input_layer.py +134 -0
  124. easy_rec/python/layers/sequence_feature_layer.py +249 -0
  125. easy_rec/python/layers/uniter.py +301 -0
  126. easy_rec/python/layers/utils.py +248 -0
  127. easy_rec/python/layers/variational_dropout_layer.py +130 -0
  128. easy_rec/python/loss/__init__.py +0 -0
  129. easy_rec/python/loss/circle_loss.py +82 -0
  130. easy_rec/python/loss/contrastive_loss.py +79 -0
  131. easy_rec/python/loss/f1_reweight_loss.py +38 -0
  132. easy_rec/python/loss/focal_loss.py +93 -0
  133. easy_rec/python/loss/jrc_loss.py +128 -0
  134. easy_rec/python/loss/listwise_loss.py +161 -0
  135. easy_rec/python/loss/multi_similarity.py +68 -0
  136. easy_rec/python/loss/pairwise_loss.py +307 -0
  137. easy_rec/python/loss/softmax_loss_with_negative_mining.py +110 -0
  138. easy_rec/python/loss/zero_inflated_lognormal.py +76 -0
  139. easy_rec/python/main.py +878 -0
  140. easy_rec/python/model/__init__.py +0 -0
  141. easy_rec/python/model/autoint.py +73 -0
  142. easy_rec/python/model/cmbf.py +47 -0
  143. easy_rec/python/model/collaborative_metric_learning.py +182 -0
  144. easy_rec/python/model/custom_model.py +323 -0
  145. easy_rec/python/model/dat.py +138 -0
  146. easy_rec/python/model/dbmtl.py +116 -0
  147. easy_rec/python/model/dcn.py +70 -0
  148. easy_rec/python/model/deepfm.py +106 -0
  149. easy_rec/python/model/dlrm.py +73 -0
  150. easy_rec/python/model/dropoutnet.py +207 -0
  151. easy_rec/python/model/dssm.py +154 -0
  152. easy_rec/python/model/dssm_senet.py +143 -0
  153. easy_rec/python/model/dummy_model.py +48 -0
  154. easy_rec/python/model/easy_rec_estimator.py +739 -0
  155. easy_rec/python/model/easy_rec_model.py +467 -0
  156. easy_rec/python/model/esmm.py +242 -0
  157. easy_rec/python/model/fm.py +63 -0
  158. easy_rec/python/model/match_model.py +357 -0
  159. easy_rec/python/model/mind.py +445 -0
  160. easy_rec/python/model/mmoe.py +70 -0
  161. easy_rec/python/model/multi_task_model.py +303 -0
  162. easy_rec/python/model/multi_tower.py +62 -0
  163. easy_rec/python/model/multi_tower_bst.py +190 -0
  164. easy_rec/python/model/multi_tower_din.py +130 -0
  165. easy_rec/python/model/multi_tower_recall.py +68 -0
  166. easy_rec/python/model/pdn.py +203 -0
  167. easy_rec/python/model/ple.py +120 -0
  168. easy_rec/python/model/rank_model.py +485 -0
  169. easy_rec/python/model/rocket_launching.py +203 -0
  170. easy_rec/python/model/simple_multi_task.py +54 -0
  171. easy_rec/python/model/uniter.py +46 -0
  172. easy_rec/python/model/wide_and_deep.py +121 -0
  173. easy_rec/python/ops/1.12/incr_record.so +0 -0
  174. easy_rec/python/ops/1.12/kafka.so +0 -0
  175. easy_rec/python/ops/1.12/libcustom_ops.so +0 -0
  176. easy_rec/python/ops/1.12/libembed_op.so +0 -0
  177. easy_rec/python/ops/1.12/libhiredis.so.1.0.0 +0 -0
  178. easy_rec/python/ops/1.12/librdkafka++.so.1 +0 -0
  179. easy_rec/python/ops/1.12/librdkafka.so.1 +0 -0
  180. easy_rec/python/ops/1.12/libredis++.so +0 -0
  181. easy_rec/python/ops/1.12/libredis++.so.1 +0 -0
  182. easy_rec/python/ops/1.12/libredis++.so.1.2.3 +0 -0
  183. easy_rec/python/ops/1.12/libstr_avx_op.so +0 -0
  184. easy_rec/python/ops/1.12/libwrite_sparse_kv.so +0 -0
  185. easy_rec/python/ops/1.15/incr_record.so +0 -0
  186. easy_rec/python/ops/1.15/kafka.so +0 -0
  187. easy_rec/python/ops/1.15/libcustom_ops.so +0 -0
  188. easy_rec/python/ops/1.15/libembed_op.so +0 -0
  189. easy_rec/python/ops/1.15/libhiredis.so.1.0.0 +0 -0
  190. easy_rec/python/ops/1.15/librdkafka++.so +0 -0
  191. easy_rec/python/ops/1.15/librdkafka++.so.1 +0 -0
  192. easy_rec/python/ops/1.15/librdkafka.so +0 -0
  193. easy_rec/python/ops/1.15/librdkafka.so.1 +0 -0
  194. easy_rec/python/ops/1.15/libredis++.so.1 +0 -0
  195. easy_rec/python/ops/1.15/libstr_avx_op.so +0 -0
  196. easy_rec/python/ops/2.12/libcustom_ops.so +0 -0
  197. easy_rec/python/ops/2.12/libload_embed.so +0 -0
  198. easy_rec/python/ops/2.12/libstr_avx_op.so +0 -0
  199. easy_rec/python/ops/__init__.py +0 -0
  200. easy_rec/python/ops/gen_kafka_ops.py +193 -0
  201. easy_rec/python/ops/gen_str_avx_op.py +28 -0
  202. easy_rec/python/ops/incr_record.py +30 -0
  203. easy_rec/python/predict.py +170 -0
  204. easy_rec/python/protos/__init__.py +0 -0
  205. easy_rec/python/protos/autoint_pb2.py +122 -0
  206. easy_rec/python/protos/backbone_pb2.py +1416 -0
  207. easy_rec/python/protos/cmbf_pb2.py +435 -0
  208. easy_rec/python/protos/collaborative_metric_learning_pb2.py +252 -0
  209. easy_rec/python/protos/custom_model_pb2.py +57 -0
  210. easy_rec/python/protos/dat_pb2.py +262 -0
  211. easy_rec/python/protos/data_source_pb2.py +422 -0
  212. easy_rec/python/protos/dataset_pb2.py +1920 -0
  213. easy_rec/python/protos/dbmtl_pb2.py +191 -0
  214. easy_rec/python/protos/dcn_pb2.py +197 -0
  215. easy_rec/python/protos/deepfm_pb2.py +163 -0
  216. easy_rec/python/protos/dlrm_pb2.py +163 -0
  217. easy_rec/python/protos/dnn_pb2.py +329 -0
  218. easy_rec/python/protos/dropoutnet_pb2.py +239 -0
  219. easy_rec/python/protos/dssm_pb2.py +262 -0
  220. easy_rec/python/protos/dssm_senet_pb2.py +282 -0
  221. easy_rec/python/protos/easy_rec_model_pb2.py +1672 -0
  222. easy_rec/python/protos/esmm_pb2.py +133 -0
  223. easy_rec/python/protos/eval_pb2.py +930 -0
  224. easy_rec/python/protos/export_pb2.py +379 -0
  225. easy_rec/python/protos/feature_config_pb2.py +1359 -0
  226. easy_rec/python/protos/fm_pb2.py +90 -0
  227. easy_rec/python/protos/hive_config_pb2.py +138 -0
  228. easy_rec/python/protos/hyperparams_pb2.py +624 -0
  229. easy_rec/python/protos/keras_layer_pb2.py +692 -0
  230. easy_rec/python/protos/layer_pb2.py +1936 -0
  231. easy_rec/python/protos/loss_pb2.py +1713 -0
  232. easy_rec/python/protos/mind_pb2.py +497 -0
  233. easy_rec/python/protos/mmoe_pb2.py +215 -0
  234. easy_rec/python/protos/multi_tower_pb2.py +295 -0
  235. easy_rec/python/protos/multi_tower_recall_pb2.py +198 -0
  236. easy_rec/python/protos/optimizer_pb2.py +2017 -0
  237. easy_rec/python/protos/pdn_pb2.py +293 -0
  238. easy_rec/python/protos/pipeline_pb2.py +516 -0
  239. easy_rec/python/protos/ple_pb2.py +231 -0
  240. easy_rec/python/protos/predict_pb2.py +1140 -0
  241. easy_rec/python/protos/rocket_launching_pb2.py +169 -0
  242. easy_rec/python/protos/seq_encoder_pb2.py +1084 -0
  243. easy_rec/python/protos/simi_pb2.py +54 -0
  244. easy_rec/python/protos/simple_multi_task_pb2.py +97 -0
  245. easy_rec/python/protos/tf_predict_pb2.py +630 -0
  246. easy_rec/python/protos/tower_pb2.py +661 -0
  247. easy_rec/python/protos/train_pb2.py +1197 -0
  248. easy_rec/python/protos/uniter_pb2.py +307 -0
  249. easy_rec/python/protos/variational_dropout_pb2.py +91 -0
  250. easy_rec/python/protos/wide_and_deep_pb2.py +131 -0
  251. easy_rec/python/test/__init__.py +0 -0
  252. easy_rec/python/test/csv_input_test.py +340 -0
  253. easy_rec/python/test/custom_early_stop_func.py +19 -0
  254. easy_rec/python/test/dh_local_run.py +104 -0
  255. easy_rec/python/test/embed_test.py +155 -0
  256. easy_rec/python/test/emr_run.py +119 -0
  257. easy_rec/python/test/eval_metric_test.py +107 -0
  258. easy_rec/python/test/excel_convert_test.py +64 -0
  259. easy_rec/python/test/export_test.py +513 -0
  260. easy_rec/python/test/fg_test.py +70 -0
  261. easy_rec/python/test/hive_input_test.py +311 -0
  262. easy_rec/python/test/hpo_test.py +235 -0
  263. easy_rec/python/test/kafka_test.py +373 -0
  264. easy_rec/python/test/local_incr_test.py +122 -0
  265. easy_rec/python/test/loss_test.py +110 -0
  266. easy_rec/python/test/odps_command.py +61 -0
  267. easy_rec/python/test/odps_local_run.py +86 -0
  268. easy_rec/python/test/odps_run.py +254 -0
  269. easy_rec/python/test/odps_test_cls.py +39 -0
  270. easy_rec/python/test/odps_test_prepare.py +198 -0
  271. easy_rec/python/test/odps_test_util.py +237 -0
  272. easy_rec/python/test/pre_check_test.py +54 -0
  273. easy_rec/python/test/predictor_test.py +394 -0
  274. easy_rec/python/test/rtp_convert_test.py +133 -0
  275. easy_rec/python/test/run.py +138 -0
  276. easy_rec/python/test/train_eval_test.py +1299 -0
  277. easy_rec/python/test/util_test.py +85 -0
  278. easy_rec/python/test/zero_inflated_lognormal_test.py +53 -0
  279. easy_rec/python/tools/__init__.py +0 -0
  280. easy_rec/python/tools/add_boundaries_to_config.py +67 -0
  281. easy_rec/python/tools/add_feature_info_to_config.py +145 -0
  282. easy_rec/python/tools/convert_config_format.py +48 -0
  283. easy_rec/python/tools/convert_rtp_data.py +79 -0
  284. easy_rec/python/tools/convert_rtp_fg.py +106 -0
  285. easy_rec/python/tools/create_config_from_excel.py +427 -0
  286. easy_rec/python/tools/criteo/__init__.py +0 -0
  287. easy_rec/python/tools/criteo/convert_data.py +157 -0
  288. easy_rec/python/tools/edit_lookup_graph.py +134 -0
  289. easy_rec/python/tools/faiss_index_pai.py +116 -0
  290. easy_rec/python/tools/feature_selection.py +316 -0
  291. easy_rec/python/tools/hit_rate_ds.py +223 -0
  292. easy_rec/python/tools/hit_rate_pai.py +138 -0
  293. easy_rec/python/tools/pre_check.py +120 -0
  294. easy_rec/python/tools/predict_and_chk.py +111 -0
  295. easy_rec/python/tools/read_kafka.py +55 -0
  296. easy_rec/python/tools/split_model_pai.py +286 -0
  297. easy_rec/python/tools/split_pdn_model_pai.py +272 -0
  298. easy_rec/python/tools/test_saved_model.py +80 -0
  299. easy_rec/python/tools/view_saved_model.py +39 -0
  300. easy_rec/python/tools/write_kafka.py +65 -0
  301. easy_rec/python/train_eval.py +325 -0
  302. easy_rec/python/utils/__init__.py +15 -0
  303. easy_rec/python/utils/activation.py +120 -0
  304. easy_rec/python/utils/check_utils.py +87 -0
  305. easy_rec/python/utils/compat.py +14 -0
  306. easy_rec/python/utils/config_util.py +652 -0
  307. easy_rec/python/utils/constant.py +43 -0
  308. easy_rec/python/utils/convert_rtp_fg.py +616 -0
  309. easy_rec/python/utils/dag.py +192 -0
  310. easy_rec/python/utils/distribution_utils.py +268 -0
  311. easy_rec/python/utils/ds_util.py +65 -0
  312. easy_rec/python/utils/embedding_utils.py +73 -0
  313. easy_rec/python/utils/estimator_utils.py +1036 -0
  314. easy_rec/python/utils/export_big_model.py +630 -0
  315. easy_rec/python/utils/expr_util.py +118 -0
  316. easy_rec/python/utils/fg_util.py +53 -0
  317. easy_rec/python/utils/hit_rate_utils.py +220 -0
  318. easy_rec/python/utils/hive_utils.py +183 -0
  319. easy_rec/python/utils/hpo_util.py +137 -0
  320. easy_rec/python/utils/hvd_utils.py +56 -0
  321. easy_rec/python/utils/input_utils.py +108 -0
  322. easy_rec/python/utils/io_util.py +282 -0
  323. easy_rec/python/utils/load_class.py +249 -0
  324. easy_rec/python/utils/meta_graph_editor.py +941 -0
  325. easy_rec/python/utils/multi_optimizer.py +62 -0
  326. easy_rec/python/utils/numpy_utils.py +18 -0
  327. easy_rec/python/utils/odps_util.py +79 -0
  328. easy_rec/python/utils/pai_util.py +86 -0
  329. easy_rec/python/utils/proto_util.py +90 -0
  330. easy_rec/python/utils/restore_filter.py +89 -0
  331. easy_rec/python/utils/shape_utils.py +432 -0
  332. easy_rec/python/utils/static_shape.py +71 -0
  333. easy_rec/python/utils/test_utils.py +866 -0
  334. easy_rec/python/utils/tf_utils.py +56 -0
  335. easy_rec/version.py +4 -0
  336. test/__init__.py +0 -0
@@ -0,0 +1,432 @@
1
+ # -*- encoding:utf-8 -*-
2
+ # Copyright 2017 The TensorFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ==============================================================================
16
+ """Utils used to manipulate tensor shapes."""
17
+ from __future__ import absolute_import
18
+ from __future__ import division
19
+ from __future__ import print_function
20
+
21
+ import six
22
+ import tensorflow as tf
23
+
24
+ from easy_rec.python.utils import static_shape
25
+
26
+
27
+ def _is_tensor(t):
28
+ """Returns a boolean indicating whether the input is a tensor.
29
+
30
+ Args:
31
+ t: the input to be tested.
32
+
33
+ Returns:
34
+ a boolean that indicates whether t is a tensor.
35
+ """
36
+ return isinstance(t, (tf.Tensor, tf.SparseTensor, tf.Variable))
37
+
38
+
39
+ def _set_dim_0(t, d0):
40
+ """Sets the 0-th dimension of the input tensor.
41
+
42
+ Args:
43
+ t: the input tensor, assuming the rank is at least 1.
44
+ d0: an integer indicating the 0-th dimension of the input tensor.
45
+
46
+ Returns:
47
+ the tensor t with the 0-th dimension set.
48
+ """
49
+ t_shape = t.get_shape().as_list()
50
+ t_shape[0] = d0
51
+ t.set_shape(t_shape)
52
+ return t
53
+
54
+
55
+ def merge_shape(t, shape_list):
56
+ """Merge static shape info into tensor.
57
+
58
+ Args:
59
+ t: the input tensor, assuming the rank is at least 1.
60
+ shape_list: a list of shape, the same length of t.get_shape()
61
+
62
+ Return:
63
+ the tensor t with shape updated
64
+ """
65
+ t_shape = t.get_shape().as_list()
66
+ assert len(shape_list) == len(
67
+ t_shape), 'input shape size should be the same of the tensor'
68
+ for idx, size in enumerate(shape_list):
69
+ if size is not None:
70
+ t_shape[idx] = size
71
+ t.set_shape(t_shape)
72
+ return t
73
+
74
+
75
+ def pad_tensor(t, length):
76
+ """Pads the input tensor with 0s along the first dimension up to the length.
77
+
78
+ Args:
79
+ t: the input tensor, assuming the rank is at least 1.
80
+ length: a tensor of shape [1] or an integer, indicating the first dimension
81
+ of the input tensor t after padding, assuming length <= t.shape[0].
82
+
83
+ Returns:
84
+ padded_t: the padded tensor, whose first dimension is length. If the length
85
+ is an integer, the first dimension of padded_t is set to length
86
+ statically.
87
+ """
88
+ t_rank = tf.rank(t)
89
+ t_shape = tf.shape(t)
90
+ t_d0 = t_shape[0]
91
+ pad_d0 = tf.expand_dims(length - t_d0, 0)
92
+ pad_shape = tf.cond(
93
+ tf.greater(t_rank, 1), lambda: tf.concat([pad_d0, t_shape[1:]], 0),
94
+ lambda: tf.expand_dims(length - t_d0, 0))
95
+ padded_t = tf.concat([t, tf.zeros(pad_shape, dtype=t.dtype)], 0)
96
+ if not _is_tensor(length):
97
+ padded_t = _set_dim_0(padded_t, length)
98
+ return padded_t
99
+
100
+
101
+ def clip_tensor(t, length):
102
+ """Clips the input tensor along the first dimension up to the length.
103
+
104
+ Args:
105
+ t: the input tensor, assuming the rank is at least 1.
106
+ length: a tensor of shape [1] or an integer, indicating the first dimension
107
+ of the input tensor t after clipping, assuming length <= t.shape[0].
108
+
109
+ Returns:
110
+ clipped_t: the clipped tensor, whose first dimension is length. If the
111
+ length is an integer, the first dimension of clipped_t is set to length
112
+ statically.
113
+ """
114
+ clipped_t = tf.gather(t, tf.range(length))
115
+ if not _is_tensor(length):
116
+ clipped_t = _set_dim_0(clipped_t, length)
117
+ return clipped_t
118
+
119
+
120
+ def pad_or_clip_tensor(t, length):
121
+ """Pad or clip the input tensor along the first dimension.
122
+
123
+ Args:
124
+ t: the input tensor, assuming the rank is at least 1.
125
+ length: a tensor of shape [1] or an integer, indicating the first dimension
126
+ of the input tensor t after processing.
127
+
128
+ Returns:
129
+ processed_t: the processed tensor, whose first dimension is length. If the
130
+ length is an integer, the first dimension of the processed tensor is set
131
+ to length statically.
132
+ """
133
+ return pad_or_clip_nd(t, [length] + t.shape.as_list()[1:])
134
+
135
+
136
+ def pad_nd(tensor, output_shape):
137
+ """Pad given tensor to the output shape.
138
+
139
+ Args:
140
+ tensor: Input tensor to pad or clip.
141
+ output_shape: A list of integers / scalar tensors (or None for dynamic dim)
142
+ representing the size to pad or clip each dimension of the input tensor.
143
+
144
+ Returns:
145
+ Input tensor padded and clipped to the output shape.
146
+ """
147
+ tensor_shape = tf.shape(tensor)
148
+
149
+ trailing_paddings = [
150
+ shape - tensor_shape[i] if shape is not None else 0
151
+ for i, shape in enumerate(output_shape)
152
+ ]
153
+ paddings = tf.stack(
154
+ [tf.zeros(len(trailing_paddings), dtype=tf.int32), trailing_paddings],
155
+ axis=1)
156
+ padded_tensor = tf.pad(tensor, paddings=paddings)
157
+ output_static_shape = [
158
+ dim if not isinstance(dim, tf.Tensor) else None for dim in output_shape
159
+ ]
160
+ padded_tensor.set_shape(output_static_shape)
161
+ return padded_tensor
162
+
163
+
164
+ def pad_or_clip_nd(tensor, output_shape):
165
+ """Pad or Clip given tensor to the output shape.
166
+
167
+ Args:
168
+ tensor: Input tensor to pad or clip.
169
+ output_shape: A list of integers / scalar tensors (or None for dynamic dim)
170
+ representing the size to pad or clip each dimension of the input tensor.
171
+
172
+ Returns:
173
+ Input tensor padded and clipped to the output shape.
174
+ """
175
+ tensor_shape = tf.shape(tensor)
176
+ clip_size = [
177
+ tf.where(tensor_shape[i] - shape > 0, shape, -1)
178
+ if shape is not None else -1 for i, shape in enumerate(output_shape)
179
+ ]
180
+ clipped_tensor = tf.slice(
181
+ tensor, begin=tf.zeros(len(clip_size), dtype=tf.int32), size=clip_size)
182
+
183
+ # Pad tensor if the shape of clipped tensor is smaller than the expected
184
+ # shape.
185
+ return pad_nd(clipped_tensor, output_shape)
186
+
187
+
188
+ def combined_static_and_dynamic_shape(tensor):
189
+ """Returns a list containing static and dynamic values for the dimensions.
190
+
191
+ Returns a list of static and dynamic values for shape dimensions. This is
192
+ useful to preserve static shapes when available in reshape operation.
193
+
194
+ Args:
195
+ tensor: A tensor of any type.
196
+
197
+ Returns:
198
+ A list of size tensor.shape.ndims containing integers or a scalar tensor.
199
+ """
200
+ static_tensor_shape = tensor.shape.as_list()
201
+ dynamic_tensor_shape = tf.shape(tensor)
202
+ combined_shape = []
203
+ for index, dim in enumerate(static_tensor_shape):
204
+ if dim is not None:
205
+ combined_shape.append(dim)
206
+ else:
207
+ combined_shape.append(dynamic_tensor_shape[index])
208
+ return combined_shape
209
+
210
+
211
+ def check_min_image_dim(min_dim, image_tensor):
212
+ """Checks that the image width/height are greater than some number.
213
+
214
+ This function is used to check that the width and height of an image are above
215
+ a certain value. If the image shape is static, this function will perform the
216
+ check at graph construction time. Otherwise, if the image shape varies, an
217
+ Assertion control dependency will be added to the graph.
218
+
219
+ Args:
220
+ min_dim: The minimum number of pixels along the width and height of the
221
+ image.
222
+ image_tensor: The image tensor to check size for.
223
+
224
+ Returns:
225
+ If `image_tensor` has dynamic size, return `image_tensor` with a Assert
226
+ control dependency. Otherwise returns image_tensor.
227
+
228
+ Raises:
229
+ ValueError: if `image_tensor`'s' width or height is smaller than `min_dim`.
230
+ """
231
+ image_shape = image_tensor.get_shape()
232
+ image_height = static_shape.get_height(image_shape)
233
+ image_width = static_shape.get_width(image_shape)
234
+ if image_height is None or image_width is None:
235
+ shape_assert = tf.Assert(
236
+ tf.logical_and(
237
+ tf.greater_equal(tf.shape(image_tensor)[1], min_dim),
238
+ tf.greater_equal(tf.shape(image_tensor)[2], min_dim)),
239
+ ['image size must be >= {} in both height and width.'.format(min_dim)])
240
+ with tf.control_dependencies([shape_assert]):
241
+ return tf.identity(image_tensor)
242
+
243
+ if image_height < min_dim or image_width < min_dim:
244
+ raise ValueError(
245
+ 'image size must be >= %d in both height and width; image dim = %d,%d' %
246
+ (min_dim, image_height, image_width))
247
+
248
+ return image_tensor
249
+
250
+
251
+ def assert_shape_equal(shape_a, shape_b):
252
+ """Asserts that shape_a and shape_b are equal.
253
+
254
+ If the shapes are static, raises a ValueError when the shapes
255
+ mismatch.
256
+
257
+ If the shapes are dynamic, raises a tf InvalidArgumentError when the shapes
258
+ mismatch.
259
+
260
+ Args:
261
+ shape_a: a list containing shape of the first tensor.
262
+ shape_b: a list containing shape of the second tensor.
263
+
264
+ Returns:
265
+ Either a tf.no_op() when shapes are all static and a tf.assert_equal() op
266
+ when the shapes are dynamic.
267
+
268
+ Raises:
269
+ ValueError: When shapes are both static and unequal.
270
+ """
271
+ if (all(isinstance(dim, int) for dim in shape_a) and
272
+ all(isinstance(dim, int) for dim in shape_b)):
273
+ if shape_a != shape_b:
274
+ raise ValueError('Unequal shapes {}, {}'.format(shape_a, shape_b))
275
+ else:
276
+ return tf.no_op()
277
+ else:
278
+ return tf.assert_equal(shape_a, shape_b)
279
+
280
+
281
+ def assert_shape_equal_along_first_dimension(shape_a, shape_b):
282
+ """Asserts that shape_a and shape_b are the same along the 0th-dimension.
283
+
284
+ If the shapes are static, raises a ValueError when the shapes
285
+ mismatch.
286
+
287
+ If the shapes are dynamic, raises a tf InvalidArgumentError when the shapes
288
+ mismatch.
289
+
290
+ Args:
291
+ shape_a: a list containing shape of the first tensor.
292
+ shape_b: a list containing shape of the second tensor.
293
+
294
+ Returns:
295
+ Either a tf.no_op() when shapes are all static and a tf.assert_equal() op
296
+ when the shapes are dynamic.
297
+
298
+ Raises:
299
+ ValueError: When shapes are both static and unequal.
300
+ """
301
+ if isinstance(shape_a[0], int) and isinstance(shape_b[0], int):
302
+ if shape_a[0] != shape_b[0]:
303
+ raise ValueError('Unequal first dimension {}, {}'.format(
304
+ shape_a[0], shape_b[0]))
305
+ else:
306
+ return tf.no_op()
307
+ else:
308
+ return tf.assert_equal(shape_a[0], shape_b[0])
309
+
310
+
311
+ def assert_box_normalized(boxes, maximum_normalized_coordinate=1.1):
312
+ """Asserts the input box tensor is normalized.
313
+
314
+ Args:
315
+ boxes: a tensor of shape [N, 4] where N is the number of boxes.
316
+ maximum_normalized_coordinate: Maximum coordinate value to be considered
317
+ as normalized, default to 1.1.
318
+
319
+ Returns:
320
+ a tf.Assert op which fails when the input box tensor is not normalized.
321
+
322
+ Raises:
323
+ ValueError: When the input box tensor is not normalized.
324
+ """
325
+ box_minimum = tf.reduce_min(boxes)
326
+ box_maximum = tf.reduce_max(boxes)
327
+ return tf.Assert(
328
+ tf.logical_and(
329
+ tf.less_equal(box_maximum, maximum_normalized_coordinate),
330
+ tf.greater_equal(box_minimum, 0)), [boxes])
331
+
332
+
333
+ def get_shape_list(tensor, expected_rank=None, name=None):
334
+ """Returns a list of the shape of tensor, preferring static dimensions.
335
+
336
+ Args:
337
+ tensor: A tf.Tensor object to find the shape of.
338
+ expected_rank: (optional) int. The expected rank of `tensor`. If this is
339
+ specified and the `tensor` has a different rank, and exception will be
340
+ thrown.
341
+ name: Optional name of the tensor for the error message.
342
+
343
+ Returns:
344
+ A list of dimensions of the shape of tensor. All static dimensions will
345
+ be returned as python integers, and dynamic dimensions will be returned
346
+ as tf.Tensor scalars.
347
+ """
348
+ if name is None and not tf.executing_eagerly():
349
+ name = tensor.name
350
+ if expected_rank is not None:
351
+ assert_rank(tensor, expected_rank, name)
352
+ shape = tensor.shape.as_list()
353
+ non_static_indexes = []
354
+ for (index, dim) in enumerate(shape):
355
+ if dim is None:
356
+ non_static_indexes.append(index)
357
+ if not non_static_indexes:
358
+ return shape
359
+ dyn_shape = tf.shape(tensor)
360
+ for index in non_static_indexes:
361
+ shape[index] = dyn_shape[index]
362
+ return shape
363
+
364
+
365
+ def assert_rank(tensor, expected_rank, name=None):
366
+ """Raises an exception if the tensor rank is not of the expected rank.
367
+
368
+ Args:
369
+ tensor: A tf.Tensor to check the rank of.
370
+ expected_rank: Python integer or list of integers, expected rank.
371
+ name: Optional name of the tensor for the error message.
372
+
373
+ Raises:
374
+ ValueError: If the expected shape doesn't match the actual shape.
375
+ """
376
+ if name is None and not tf.executing_eagerly():
377
+ name = tensor.name
378
+ expected_rank_dict = {}
379
+ if isinstance(expected_rank, six.integer_types):
380
+ expected_rank_dict[expected_rank] = True
381
+ else:
382
+ for x in expected_rank:
383
+ expected_rank_dict[x] = True
384
+ actual_rank = tensor.shape.ndims
385
+ if actual_rank not in expected_rank_dict:
386
+ scope_name = tf.get_variable_scope().name
387
+ raise ValueError(
388
+ 'For the tensor `%s` in scope `%s`, the actual rank '
389
+ '`%d` (shape = %s) is not equal to the expected rank `%s`' %
390
+ (name, scope_name, actual_rank, str(tensor.shape), str(expected_rank)))
391
+
392
+
393
+ def truncate_sequence(seq_emb, seq_len, limited_len):
394
+
395
+ def truncate(seq_embed, seq_length):
396
+ seq_embed = tf.slice(seq_embed, [0, 0, 0],
397
+ [shape[0], limited_len, shape[2]])
398
+ seq_length = tf.where(
399
+ tf.greater(seq_length, limited_len),
400
+ tf.ones_like(seq_length) * limited_len, seq_length)
401
+ return seq_embed, seq_length
402
+
403
+ def keep(seq_embed, seq_length):
404
+ return seq_embed, seq_length
405
+
406
+ shape = get_shape_list(seq_emb)
407
+ max_seq_len = shape[1]
408
+
409
+ return tf.cond(max_seq_len > limited_len, lambda: truncate(seq_emb, seq_len),
410
+ lambda: keep(seq_emb, seq_len))
411
+
412
+
413
+ def pad_or_truncate_sequence(seq_emb, seq_len, fixed_len):
414
+ padding_length = fixed_len - tf.shape(seq_emb)[1]
415
+
416
+ def padding():
417
+ paddings = tf.stack([[0, 0], [0, padding_length], [0, 0]])
418
+ padded = tf.pad(seq_emb, paddings)
419
+ return padded, seq_len
420
+
421
+ def truncate():
422
+ sliced = tf.slice(seq_emb, [0, 0, 0], [-1, fixed_len, -1])
423
+ length = tf.where(seq_len < fixed_len, seq_len,
424
+ tf.ones_like(seq_len) *
425
+ fixed_len) if seq_len is not None else None
426
+ return sliced, length
427
+
428
+ def keep():
429
+ return seq_emb, seq_len
430
+
431
+ return tf.cond(padding_length > 0, padding,
432
+ lambda: tf.cond(padding_length < 0, truncate, keep))
@@ -0,0 +1,71 @@
1
+ # -*- encoding:utf-8 -*-
2
+ # Copyright 2017 The TensorFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ==============================================================================
16
+ """Helper functions to access TensorShape values.
17
+
18
+ The rank 4 tensor_shape must be of the form [batch_size, height, width, depth].
19
+ """
20
+
21
+
22
+ def get_batch_size(tensor_shape):
23
+ """Returns batch size from the tensor shape.
24
+
25
+ Args:
26
+ tensor_shape: A rank 4 TensorShape.
27
+
28
+ Returns:
29
+ An integer representing the batch size of the tensor.
30
+ """
31
+ tensor_shape.assert_has_rank(rank=4)
32
+ return tensor_shape[0].value
33
+
34
+
35
+ def get_height(tensor_shape):
36
+ """Returns height from the tensor shape.
37
+
38
+ Args:
39
+ tensor_shape: A rank 4 TensorShape.
40
+
41
+ Returns:
42
+ An integer representing the height of the tensor.
43
+ """
44
+ tensor_shape.assert_has_rank(rank=4)
45
+ return tensor_shape[1].value
46
+
47
+
48
+ def get_width(tensor_shape):
49
+ """Returns width from the tensor shape.
50
+
51
+ Args:
52
+ tensor_shape: A rank 4 TensorShape.
53
+
54
+ Returns:
55
+ An integer representing the width of the tensor.
56
+ """
57
+ tensor_shape.assert_has_rank(rank=4)
58
+ return tensor_shape[2].value
59
+
60
+
61
+ def get_depth(tensor_shape):
62
+ """Returns depth from the tensor shape.
63
+
64
+ Args:
65
+ tensor_shape: A rank 4 TensorShape.
66
+
67
+ Returns:
68
+ An integer representing the depth of the tensor.
69
+ """
70
+ tensor_shape.assert_has_rank(rank=4)
71
+ return tensor_shape[3].value