nextrec 0.4.21__tar.gz → 0.4.22__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.
- {nextrec-0.4.21 → nextrec-0.4.22}/PKG-INFO +5 -5
- {nextrec-0.4.21 → nextrec-0.4.22}/README.md +4 -4
- {nextrec-0.4.21 → nextrec-0.4.22}/README_en.md +4 -4
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/conf.py +1 -1
- nextrec-0.4.22/nextrec/__version__.py +1 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/activation.py +1 -1
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/heads.py +2 -3
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/model.py +54 -14
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/loss/__init__.py +0 -4
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/loss/grad_norm.py +3 -3
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/__init__.py +5 -1
- nextrec-0.4.21/nextrec/loss/loss_utils.py → nextrec-0.4.22/nextrec/utils/loss.py +17 -7
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/types.py +27 -23
- {nextrec-0.4.21 → nextrec-0.4.22}/pyproject.toml +1 -1
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_losses.py +54 -1
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_ranking_models.py +2 -0
- nextrec-0.4.21/nextrec/__version__.py +0 -1
- {nextrec-0.4.21 → nextrec-0.4.22}/.github/workflows/publish.yml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/.github/workflows/tests.yml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/.gitignore +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/.readthedocs.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/CODE_OF_CONDUCT.md +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/CONTRIBUTING.md +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/LICENSE +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/MANIFEST.in +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/Feature Configuration.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/Model Parameters.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/Training Configuration.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/Training logs.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/logo.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/mmoe_tutorial.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/nextrec_diagram.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/assets/test data.png +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/dataset/ctcvr_task.csv +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/dataset/ecommerce_task.csv +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/dataset/match_task.csv +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/dataset/movielens_100k.csv +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/dataset/multitask_task.csv +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/dataset/ranking_task.csv +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/en/Getting started guide.md +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/Makefile +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/index.md +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/make.bat +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/modules.rst +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/nextrec.basic.rst +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/nextrec.data.rst +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/nextrec.loss.rst +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/nextrec.rst +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/nextrec.utils.rst +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/rtd/requirements.txt +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/docs/zh//345/277/253/351/200/237/344/270/212/346/211/213.md" +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/callback.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/features.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/layers.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/loggers.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/metrics.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/session.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/basic/summary.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/cli.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/data/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/data/batch_utils.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/data/data_processing.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/data/data_utils.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/data/dataloader.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/data/preprocessor.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/loss/listwise.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/loss/pairwise.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/loss/pointwise.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/generative/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/generative/tiger.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/multi_task/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/multi_task/esmm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/multi_task/mmoe.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/multi_task/ple.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/multi_task/poso.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/multi_task/share_bottom.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/afm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/autoint.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/dcn.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/dcn_v2.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/deepfm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/dien.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/din.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/eulernet.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/ffm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/fibinet.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/fm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/lr.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/masknet.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/pnn.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/widedeep.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/ranking/xdeepfm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/autorec.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/bpr.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/cl4srec.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/lightgcn.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/mf.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/rqvae.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/representation/s3rec.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/retrieval/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/retrieval/dssm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/retrieval/dssm_v2.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/retrieval/mind.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/retrieval/sdm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/retrieval/youtube_dnn.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/sequential/hstu.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/models/sequential/sasrec.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/config.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/console.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/data.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/embedding.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/feature.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/model.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec/utils/torch_utils.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/NextRec-CLI.md +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/NextRec-CLI_zh.md +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/feature_config.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/afm.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/autoint.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/dcn.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/deepfm.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/din.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/esmm.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/fibinet.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/fm.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/masknet.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/mmoe.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/ple.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/pnn.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/poso.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/share_bottom.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/widedeep.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/model_configs/xdeepfm.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/predict_config.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/predict_config_template.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/train_config.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/nextrec_cli_preset/train_config_template.yaml +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/pytest.ini +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/requirements.txt +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/scripts/format_code.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/__init__.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/conftest.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/helpers.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/run_tests.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_base_model_regularization.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_generative_models.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_layers.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_match_models.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_multitask_models.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_preprocessor.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_utils_console.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_utils_data.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test/test_utils_embedding.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/test_requirements.txt +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/distributed/example_distributed_training.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/distributed/example_distributed_training_large_dataset.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/example_match.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/example_multitask.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/example_ranking_din.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/movielen_match_dssm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/movielen_ranking_deepfm.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/notebooks/en/Build semantic ID with RQ-VAE.ipynb +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/notebooks/en/Hands on dataprocessor.ipynb +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/notebooks/en/Hands on nextrec.ipynb +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/notebooks/zh//344/275/277/347/224/250RQ-VAE/346/236/204/345/273/272/350/257/255/344/271/211ID.ipynb" +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/notebooks/zh//345/246/202/344/275/225/344/275/277/347/224/250DataProcessor/350/277/233/350/241/214/351/242/204/345/244/204/347/220/206.ipynb" +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/notebooks/zh//345/277/253/351/200/237/345/205/245/351/227/250nextrec.ipynb" +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/run_all_match_models.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/run_all_multitask_models.py +0 -0
- {nextrec-0.4.21 → nextrec-0.4.22}/tutorials/run_all_ranking_models.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nextrec
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.22
|
|
4
4
|
Summary: A comprehensive recommendation library with match, ranking, and multi-task learning models
|
|
5
5
|
Project-URL: Homepage, https://github.com/zerolovesea/NextRec
|
|
6
6
|
Project-URL: Repository, https://github.com/zerolovesea/NextRec
|
|
@@ -65,11 +65,11 @@ Description-Content-Type: text/markdown
|
|
|
65
65
|
|
|
66
66
|
<div align="center">
|
|
67
67
|
|
|
68
|
-
[](https://pypistats.org/packages/nextrec)
|
|
69
69
|

|
|
70
70
|

|
|
71
71
|

|
|
72
|
-

|
|
73
73
|
[](https://deepwiki.com/zerolovesea/NextRec)
|
|
74
74
|
|
|
75
75
|
中文文档 | [English Version](README_en.md)
|
|
@@ -247,11 +247,11 @@ nextrec --mode=predict --predict_config=path/to/predict_config.yaml
|
|
|
247
247
|
|
|
248
248
|
预测结果固定保存到 `{checkpoint_path}/predictions/{name}.{save_data_format}`。
|
|
249
249
|
|
|
250
|
-
> 截止当前版本0.4.
|
|
250
|
+
> 截止当前版本0.4.22,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
|
|
251
251
|
|
|
252
252
|
## 兼容平台
|
|
253
253
|
|
|
254
|
-
当前最新版本为0.4.
|
|
254
|
+
当前最新版本为0.4.22,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
|
|
255
255
|
|
|
256
256
|
| 平台 | 配置 |
|
|
257
257
|
|------|------|
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
<div align="center">
|
|
6
6
|
|
|
7
|
-
[](https://pypistats.org/packages/nextrec)
|
|
8
8
|

|
|
9
9
|

|
|
10
10
|

|
|
11
|
-

|
|
12
12
|
[](https://deepwiki.com/zerolovesea/NextRec)
|
|
13
13
|
|
|
14
14
|
中文文档 | [English Version](README_en.md)
|
|
@@ -186,11 +186,11 @@ nextrec --mode=predict --predict_config=path/to/predict_config.yaml
|
|
|
186
186
|
|
|
187
187
|
预测结果固定保存到 `{checkpoint_path}/predictions/{name}.{save_data_format}`。
|
|
188
188
|
|
|
189
|
-
> 截止当前版本0.4.
|
|
189
|
+
> 截止当前版本0.4.22,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
|
|
190
190
|
|
|
191
191
|
## 兼容平台
|
|
192
192
|
|
|
193
|
-
当前最新版本为0.4.
|
|
193
|
+
当前最新版本为0.4.22,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
|
|
194
194
|
|
|
195
195
|
| 平台 | 配置 |
|
|
196
196
|
|------|------|
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
<div align="center">
|
|
6
6
|
|
|
7
|
-
[](https://pypistats.org/packages/nextrec)
|
|
8
8
|

|
|
9
9
|

|
|
10
10
|

|
|
11
|
-

|
|
12
12
|
[](https://deepwiki.com/zerolovesea/NextRec)
|
|
13
13
|
|
|
14
14
|
English | [中文文档](README.md)
|
|
@@ -191,11 +191,11 @@ nextrec --mode=predict --predict_config=path/to/predict_config.yaml
|
|
|
191
191
|
|
|
192
192
|
Prediction outputs are saved under `{checkpoint_path}/predictions/{name}.{save_data_format}`.
|
|
193
193
|
|
|
194
|
-
> As of version 0.4.
|
|
194
|
+
> As of version 0.4.22, NextRec CLI supports single-machine training; distributed training features are currently under development.
|
|
195
195
|
|
|
196
196
|
## Platform Compatibility
|
|
197
197
|
|
|
198
|
-
The current version is 0.4.
|
|
198
|
+
The current version is 0.4.22. All models and test code have been validated on the following platforms. If you encounter compatibility issues, please report them in the issue tracker with your system version:
|
|
199
199
|
|
|
200
200
|
| Platform | Configuration |
|
|
201
201
|
|----------|---------------|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.4.22"
|
|
@@ -15,6 +15,7 @@ import torch.nn as nn
|
|
|
15
15
|
import torch.nn.functional as F
|
|
16
16
|
|
|
17
17
|
from nextrec.basic.layers import PredictionLayer
|
|
18
|
+
from nextrec.utils.types import TaskTypeName
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
class TaskHead(nn.Module):
|
|
@@ -27,9 +28,7 @@ class TaskHead(nn.Module):
|
|
|
27
28
|
|
|
28
29
|
def __init__(
|
|
29
30
|
self,
|
|
30
|
-
task_type:
|
|
31
|
-
Literal["binary", "regression"] | list[Literal["binary", "regression"]]
|
|
32
|
-
) = "binary",
|
|
31
|
+
task_type: TaskTypeName | list[TaskTypeName] = "binary",
|
|
33
32
|
task_dims: int | list[int] | None = None,
|
|
34
33
|
use_bias: bool = True,
|
|
35
34
|
return_logits: bool = False,
|
|
@@ -60,8 +60,8 @@ from nextrec.loss import (
|
|
|
60
60
|
InfoNCELoss,
|
|
61
61
|
SampledSoftmaxLoss,
|
|
62
62
|
TripletLoss,
|
|
63
|
-
get_loss_fn,
|
|
64
63
|
)
|
|
64
|
+
from nextrec.utils.loss import get_loss_fn
|
|
65
65
|
from nextrec.loss.grad_norm import get_grad_norm_shared_params
|
|
66
66
|
from nextrec.utils.console import display_metrics_table, progress
|
|
67
67
|
from nextrec.utils.torch_utils import (
|
|
@@ -75,7 +75,13 @@ from nextrec.utils.torch_utils import (
|
|
|
75
75
|
)
|
|
76
76
|
from nextrec.utils.config import safe_value
|
|
77
77
|
from nextrec.utils.model import compute_ranking_loss
|
|
78
|
-
from nextrec.utils.types import
|
|
78
|
+
from nextrec.utils.types import (
|
|
79
|
+
LossName,
|
|
80
|
+
OptimizerName,
|
|
81
|
+
SchedulerName,
|
|
82
|
+
TrainingModeName,
|
|
83
|
+
TaskTypeName,
|
|
84
|
+
)
|
|
79
85
|
|
|
80
86
|
|
|
81
87
|
class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
@@ -94,11 +100,8 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
94
100
|
sequence_features: list[SequenceFeature] | None = None,
|
|
95
101
|
target: list[str] | str | None = None,
|
|
96
102
|
id_columns: list[str] | str | None = None,
|
|
97
|
-
task:
|
|
98
|
-
training_mode:
|
|
99
|
-
Literal["pointwise", "pairwise", "listwise"]
|
|
100
|
-
| list[Literal["pointwise", "pairwise", "listwise"]]
|
|
101
|
-
) = "pointwise",
|
|
103
|
+
task: TaskTypeName | list[TaskTypeName] | None = None,
|
|
104
|
+
training_mode: TrainingModeName | list[TrainingModeName] = "pointwise",
|
|
102
105
|
embedding_l1_reg: float = 0.0,
|
|
103
106
|
dense_l1_reg: float = 0.0,
|
|
104
107
|
embedding_l2_reg: float = 0.0,
|
|
@@ -179,8 +182,7 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
179
182
|
else:
|
|
180
183
|
training_modes = [training_mode] * self.nums_task
|
|
181
184
|
if any(
|
|
182
|
-
mode not in {"pointwise", "pairwise", "listwise"}
|
|
183
|
-
for mode in training_modes
|
|
185
|
+
mode not in {"pointwise", "pairwise", "listwise"} for mode in training_modes
|
|
184
186
|
):
|
|
185
187
|
raise ValueError(
|
|
186
188
|
"[BaseModel-init Error] training_mode must be one of {'pointwise', 'pairwise', 'listwise'}."
|
|
@@ -195,6 +197,7 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
195
197
|
self.regularization_weights = []
|
|
196
198
|
self.embedding_params = []
|
|
197
199
|
self.loss_weight = None
|
|
200
|
+
self.ignore_label = None
|
|
198
201
|
|
|
199
202
|
self.max_gradient_norm = 1.0
|
|
200
203
|
self.logger_initialized = False
|
|
@@ -407,6 +410,7 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
407
410
|
loss: LossName | nn.Module | list[LossName | nn.Module] | None = "bce",
|
|
408
411
|
loss_params: dict | list[dict] | None = None,
|
|
409
412
|
loss_weights: int | float | list[int | float] | dict | str | None = None,
|
|
413
|
+
ignore_label: int | float | None = -1,
|
|
410
414
|
):
|
|
411
415
|
"""
|
|
412
416
|
Configure the model for training.
|
|
@@ -419,7 +423,9 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
419
423
|
loss_params: Loss function parameters, or list for multi-task. e.g., {'weight': tensor([0.25, 0.75])}.
|
|
420
424
|
loss_weights: Weights for each task loss, int/float for single-task or list for multi-task. e.g., 1.0, or [1.0, 0.5].
|
|
421
425
|
Use "grad_norm" or {"method": "grad_norm", ...} to enable GradNorm for multi-task loss balancing.
|
|
426
|
+
ignore_label: Label value to ignore when computing loss. Use this to skip gradients for unknown labels.
|
|
422
427
|
"""
|
|
428
|
+
self.ignore_label = ignore_label
|
|
423
429
|
default_losses = {
|
|
424
430
|
"pointwise": "bce",
|
|
425
431
|
"pairwise": "bpr",
|
|
@@ -540,6 +546,7 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
540
546
|
raise ValueError(
|
|
541
547
|
"[BaseModel-compute_loss Error] Ground truth labels (y_true) are required."
|
|
542
548
|
)
|
|
549
|
+
|
|
543
550
|
# single-task
|
|
544
551
|
if self.nums_task == 1:
|
|
545
552
|
if y_pred.dim() == 1:
|
|
@@ -547,13 +554,24 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
547
554
|
if y_true.dim() == 1:
|
|
548
555
|
y_true = y_true.view(-1, 1)
|
|
549
556
|
if y_pred.shape != y_true.shape:
|
|
550
|
-
raise ValueError(f"Shape mismatch: {y_pred.shape} vs {y_true.shape}")
|
|
551
|
-
loss_fn = self.loss_fn[0] if getattr(self, "loss_fn", None) else None
|
|
552
|
-
if loss_fn is None:
|
|
553
557
|
raise ValueError(
|
|
554
|
-
"[BaseModel-compute_loss Error]
|
|
558
|
+
f"[BaseModel-compute_loss Error] Shape mismatch: {y_pred.shape} vs {y_true.shape}"
|
|
555
559
|
)
|
|
560
|
+
|
|
561
|
+
loss_fn = self.loss_fn[0]
|
|
562
|
+
|
|
563
|
+
if self.ignore_label is not None:
|
|
564
|
+
valid_mask = y_true != self.ignore_label
|
|
565
|
+
if valid_mask.dim() > 1:
|
|
566
|
+
valid_mask = valid_mask.all(dim=1)
|
|
567
|
+
if not torch.any(valid_mask): # if no valid labels, return zero loss
|
|
568
|
+
return y_pred.sum() * 0.0
|
|
569
|
+
|
|
570
|
+
y_pred = y_pred[valid_mask]
|
|
571
|
+
y_true = y_true[valid_mask]
|
|
572
|
+
|
|
556
573
|
mode = self.training_modes[0]
|
|
574
|
+
|
|
557
575
|
task_dim = (
|
|
558
576
|
self.task_dims[0] if hasattr(self, "task_dims") else y_pred.shape[1] # type: ignore
|
|
559
577
|
)
|
|
@@ -584,7 +602,25 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
584
602
|
for i, (start, end) in enumerate(slices): # type: ignore
|
|
585
603
|
y_pred_i = y_pred[:, start:end]
|
|
586
604
|
y_true_i = y_true[:, start:end]
|
|
605
|
+
total_count = y_true_i.shape[0]
|
|
606
|
+
# valid_count = None
|
|
607
|
+
|
|
608
|
+
# mask ignored labels
|
|
609
|
+
if self.ignore_label is not None:
|
|
610
|
+
valid_mask = y_true_i != self.ignore_label
|
|
611
|
+
if valid_mask.dim() > 1:
|
|
612
|
+
valid_mask = valid_mask.all(dim=1)
|
|
613
|
+
if not torch.any(valid_mask):
|
|
614
|
+
task_losses.append(y_pred_i.sum() * 0.0)
|
|
615
|
+
continue
|
|
616
|
+
# valid_count = valid_mask.sum().to(dtype=y_true_i.dtype)
|
|
617
|
+
y_pred_i = y_pred_i[valid_mask]
|
|
618
|
+
y_true_i = y_true_i[valid_mask]
|
|
619
|
+
# else:
|
|
620
|
+
# valid_count = y_true_i.new_tensor(float(total_count))
|
|
621
|
+
|
|
587
622
|
mode = self.training_modes[i]
|
|
623
|
+
|
|
588
624
|
if mode in {"pairwise", "listwise"}:
|
|
589
625
|
task_loss = compute_ranking_loss(
|
|
590
626
|
training_mode=mode,
|
|
@@ -594,7 +630,11 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
|
|
|
594
630
|
)
|
|
595
631
|
else:
|
|
596
632
|
task_loss = self.loss_fn[i](y_pred_i, y_true_i)
|
|
633
|
+
# task_loss = normalize_task_loss(
|
|
634
|
+
# task_loss, valid_count, total_count
|
|
635
|
+
# ) # normalize by valid samples to avoid loss scale issues
|
|
597
636
|
task_losses.append(task_loss)
|
|
637
|
+
|
|
598
638
|
if self.grad_norm is not None:
|
|
599
639
|
if self.grad_norm_shared_params is None:
|
|
600
640
|
self.grad_norm_shared_params = get_grad_norm_shared_params(
|
|
@@ -2164,7 +2204,7 @@ class BaseMatchModel(BaseModel):
|
|
|
2164
2204
|
scheduler_params: Parameters for the scheduler. e.g., {'step_size': 10, 'gamma': 0.1}.
|
|
2165
2205
|
loss: Loss function(s) to use (name, instance, or list). e.g., 'bce'.
|
|
2166
2206
|
loss_params: Parameters for the loss function(s). e.g., {'reduction': 'mean'}.
|
|
2167
|
-
loss_weights: Weights for the loss function(s). e.g., 1.0 or [0.7, 0.3].
|
|
2207
|
+
loss_weights: Weights for the loss function(s). e.g., 1.0 or [0.7, 0.3].
|
|
2168
2208
|
"""
|
|
2169
2209
|
if self.training_mode not in self.support_training_modes:
|
|
2170
2210
|
raise ValueError(
|
|
@@ -6,7 +6,6 @@ from nextrec.loss.listwise import (
|
|
|
6
6
|
SampledSoftmaxLoss,
|
|
7
7
|
)
|
|
8
8
|
from nextrec.loss.grad_norm import GradNormLossWeighting
|
|
9
|
-
from nextrec.loss.loss_utils import VALID_TASK_TYPES, get_loss_fn, get_loss_kwargs
|
|
10
9
|
from nextrec.loss.pairwise import BPRLoss, HingeLoss, TripletLoss
|
|
11
10
|
from nextrec.loss.pointwise import (
|
|
12
11
|
ClassBalancedFocalLoss,
|
|
@@ -34,7 +33,4 @@ __all__ = [
|
|
|
34
33
|
# Multi-task weighting
|
|
35
34
|
"GradNormLossWeighting",
|
|
36
35
|
# Utilities
|
|
37
|
-
"get_loss_fn",
|
|
38
|
-
"get_loss_kwargs",
|
|
39
|
-
"VALID_TASK_TYPES",
|
|
40
36
|
]
|
|
@@ -20,9 +20,9 @@ import torch.nn.functional as F
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def get_grad_norm_shared_params(
|
|
23
|
-
model
|
|
24
|
-
shared_modules
|
|
25
|
-
)
|
|
23
|
+
model,
|
|
24
|
+
shared_modules=None,
|
|
25
|
+
):
|
|
26
26
|
if not shared_modules:
|
|
27
27
|
return [p for p in model.parameters() if p.requires_grad]
|
|
28
28
|
shared_params = []
|
|
@@ -6,7 +6,7 @@ Last update: 19/12/2025
|
|
|
6
6
|
Author: Yang Zhou, zyaztec@gmail.com
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from . import console, data, embedding, torch_utils
|
|
9
|
+
from . import console, data, embedding, loss, torch_utils
|
|
10
10
|
from .config import (
|
|
11
11
|
build_feature_objects,
|
|
12
12
|
build_model_instance,
|
|
@@ -38,6 +38,7 @@ from .data import (
|
|
|
38
38
|
from .embedding import get_auto_embedding_dim
|
|
39
39
|
from .feature import to_list
|
|
40
40
|
from .model import compute_pair_scores, get_mlp_output_dim, merge_features
|
|
41
|
+
from .loss import normalize_task_loss
|
|
41
42
|
from .torch_utils import (
|
|
42
43
|
add_distributed_sampler,
|
|
43
44
|
get_device,
|
|
@@ -81,6 +82,8 @@ __all__ = [
|
|
|
81
82
|
"merge_features",
|
|
82
83
|
"get_mlp_output_dim",
|
|
83
84
|
"compute_pair_scores",
|
|
85
|
+
# Loss utilities
|
|
86
|
+
"normalize_task_loss",
|
|
84
87
|
# Feature utilities
|
|
85
88
|
"to_list",
|
|
86
89
|
# Config utilities
|
|
@@ -101,6 +104,7 @@ __all__ = [
|
|
|
101
104
|
"console",
|
|
102
105
|
"data",
|
|
103
106
|
"embedding",
|
|
107
|
+
"loss",
|
|
104
108
|
"torch_utils",
|
|
105
109
|
# Type aliases
|
|
106
110
|
"OptimizerName",
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Loss utilities for NextRec.
|
|
3
3
|
|
|
4
|
-
Date: create on
|
|
5
|
-
Checkpoint: edit on 19/12/2025
|
|
4
|
+
Date: create on 28/12/2025
|
|
6
5
|
Author: Yang Zhou, zyaztec@gmail.com
|
|
7
6
|
"""
|
|
8
7
|
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import torch
|
|
9
11
|
import torch.nn as nn
|
|
10
12
|
|
|
11
13
|
from nextrec.loss.listwise import (
|
|
@@ -19,11 +21,19 @@ from nextrec.loss.pairwise import BPRLoss, HingeLoss, TripletLoss
|
|
|
19
21
|
from nextrec.loss.pointwise import ClassBalancedFocalLoss, FocalLoss, WeightedBCELoss
|
|
20
22
|
from nextrec.utils.types import LossName
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
|
|
25
|
+
def normalize_task_loss(
|
|
26
|
+
task_loss,
|
|
27
|
+
valid_count,
|
|
28
|
+
total_count,
|
|
29
|
+
eps=1e-8,
|
|
30
|
+
) -> torch.Tensor:
|
|
31
|
+
if not torch.is_tensor(valid_count):
|
|
32
|
+
valid_count = torch.tensor(float(valid_count), device=task_loss.device)
|
|
33
|
+
if not torch.is_tensor(total_count):
|
|
34
|
+
total_count = torch.tensor(float(total_count), device=task_loss.device)
|
|
35
|
+
scale = valid_count.to(task_loss.dtype) / (total_count.to(task_loss.dtype) + eps)
|
|
36
|
+
return task_loss * scale
|
|
27
37
|
|
|
28
38
|
|
|
29
39
|
def build_cb_focal(kw):
|
|
@@ -34,26 +34,30 @@ LossName = Literal[
|
|
|
34
34
|
]
|
|
35
35
|
|
|
36
36
|
ActivationName = Literal[
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
37
|
+
"dice",
|
|
38
|
+
"relu",
|
|
39
|
+
"relu6",
|
|
40
|
+
"elu",
|
|
41
|
+
"selu",
|
|
42
|
+
"leaky_relu",
|
|
43
|
+
"prelu",
|
|
44
|
+
"gelu",
|
|
45
|
+
"sigmoid",
|
|
46
|
+
"tanh",
|
|
47
|
+
"softplus",
|
|
48
|
+
"softsign",
|
|
49
|
+
"hardswish",
|
|
50
|
+
"mish",
|
|
51
|
+
"silu",
|
|
52
|
+
"swish",
|
|
53
|
+
"hardsigmoid",
|
|
54
|
+
"tanhshrink",
|
|
55
|
+
"softshrink",
|
|
56
|
+
"none",
|
|
57
|
+
"linear",
|
|
58
|
+
"identity",
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
TrainingModeName = Literal["pointwise", "pairwise", "listwise"]
|
|
62
|
+
|
|
63
|
+
TaskTypeName = Literal["binary", "regression"]
|
|
@@ -12,8 +12,8 @@ from nextrec.loss import (
|
|
|
12
12
|
SampledSoftmaxLoss,
|
|
13
13
|
TripletLoss,
|
|
14
14
|
WeightedBCELoss,
|
|
15
|
-
get_loss_fn,
|
|
16
15
|
)
|
|
16
|
+
from nextrec.utils.loss import get_loss_fn
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def test_focal_loss_binary_prefers_confident_logits():
|
|
@@ -126,8 +126,61 @@ class _DummyBinaryModel(BaseModel): # type: ignore[misc]
|
|
|
126
126
|
self.dummy = nn.Parameter(torch.zeros(1))
|
|
127
127
|
|
|
128
128
|
|
|
129
|
+
class _DummyMultiTaskModel(BaseModel): # type: ignore[misc]
|
|
130
|
+
@property
|
|
131
|
+
def model_name(self) -> str:
|
|
132
|
+
return "DummyMultiTask"
|
|
133
|
+
|
|
134
|
+
@property
|
|
135
|
+
def default_task(self) -> list[str]:
|
|
136
|
+
return ["binary", "binary"]
|
|
137
|
+
|
|
138
|
+
def forward(self, X_input):
|
|
139
|
+
return torch.zeros(1, 2)
|
|
140
|
+
|
|
141
|
+
def __init__(self):
|
|
142
|
+
super().__init__(
|
|
143
|
+
dense_features=[],
|
|
144
|
+
sparse_features=[],
|
|
145
|
+
sequence_features=[],
|
|
146
|
+
target=["y1", "y2"],
|
|
147
|
+
task=["binary", "binary"],
|
|
148
|
+
)
|
|
149
|
+
self.dummy = nn.Parameter(torch.zeros(1))
|
|
150
|
+
|
|
151
|
+
|
|
129
152
|
def test_compile_acceptsloss_params():
|
|
130
153
|
model = _DummyBinaryModel()
|
|
131
154
|
model.compile(loss="focal", loss_params={"gamma": 1.5})
|
|
132
155
|
assert isinstance(model.loss_fn[0], FocalLoss)
|
|
133
156
|
assert model.loss_fn[0].gamma == 1.5
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def test_multitask_loss_ignores_negative_labels():
|
|
160
|
+
model = _DummyMultiTaskModel()
|
|
161
|
+
model.compile(loss="bce")
|
|
162
|
+
|
|
163
|
+
y_pred = torch.tensor([[0.9, 0.1], [0.2, 0.8], [0.7, 0.4]])
|
|
164
|
+
y_true = torch.tensor([[1.0, -1.0], [0.0, 1.0], [-1.0, -1.0]])
|
|
165
|
+
|
|
166
|
+
loss = model.compute_loss(y_pred, y_true)
|
|
167
|
+
|
|
168
|
+
task1_mask = y_true[:, 0] != -1
|
|
169
|
+
task2_mask = y_true[:, 1] != -1
|
|
170
|
+
task1_loss = model.loss_fn[0](y_pred[task1_mask, 0:1], y_true[task1_mask, 0:1])
|
|
171
|
+
task2_loss = model.loss_fn[1](y_pred[task2_mask, 1:2], y_true[task2_mask, 1:2])
|
|
172
|
+
expected = task1_loss + task2_loss
|
|
173
|
+
assert torch.allclose(loss, expected)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def test_multitask_loss_skips_fully_missing_task():
|
|
177
|
+
model = _DummyMultiTaskModel()
|
|
178
|
+
model.compile(loss="bce")
|
|
179
|
+
|
|
180
|
+
y_pred = torch.tensor([[0.6, 0.3], [0.2, 0.9]])
|
|
181
|
+
y_true = torch.tensor([[1.0, -1.0], [0.0, -1.0]])
|
|
182
|
+
|
|
183
|
+
loss = model.compute_loss(y_pred, y_true)
|
|
184
|
+
|
|
185
|
+
task1_loss = model.loss_fn[0](y_pred[:, 0:1], y_true[:, 0:1])
|
|
186
|
+
assert torch.allclose(loss, task1_loss)
|
|
@@ -1369,6 +1369,7 @@ class TestAFM:
|
|
|
1369
1369
|
self, sample_sparse_features, sample_sequence_features, device
|
|
1370
1370
|
):
|
|
1371
1371
|
model = AFM(
|
|
1372
|
+
dense_features=[],
|
|
1372
1373
|
sparse_features=sample_sparse_features,
|
|
1373
1374
|
sequence_features=sample_sequence_features,
|
|
1374
1375
|
attention_dim=16,
|
|
@@ -1386,6 +1387,7 @@ class TestAFM:
|
|
|
1386
1387
|
batch_size,
|
|
1387
1388
|
):
|
|
1388
1389
|
model = AFM(
|
|
1390
|
+
dense_features=[],
|
|
1389
1391
|
sparse_features=sample_sparse_features,
|
|
1390
1392
|
sequence_features=sample_sequence_features,
|
|
1391
1393
|
attention_dim=8,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.4.21"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nextrec-0.4.21 → nextrec-0.4.22}/docs/zh//345/277/253/351/200/237/344/270/212/346/211/213.md"
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nextrec-0.4.21 → nextrec-0.4.22}/tutorials/notebooks/en/Build semantic ID with RQ-VAE.ipynb
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|