{"id":21361986,"url":"https://github.com/hitlic/deepepochs","last_synced_at":"2025-09-25T04:32:22.312Z","repository":{"id":201134853,"uuid":"707043080","full_name":"hitlic/deepepochs","owner":"hitlic","description":"Pytorch模型训练工具","archived":false,"fork":false,"pushed_at":"2024-07-14T01:32:00.000Z","size":636,"stargazers_count":35,"open_issues_count":0,"forks_count":1,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-01-08T22:23:21.765Z","etag":null,"topics":["deep-learning","pytorch","training","training-tools"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hitlic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-19T05:41:48.000Z","updated_at":"2024-07-14T01:32:02.000Z","dependencies_parsed_at":"2024-07-11T09:21:31.084Z","dependency_job_id":null,"html_url":"https://github.com/hitlic/deepepochs","commit_stats":null,"previous_names":["hitlic/loops"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hitlic%2Fdeepepochs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hitlic%2Fdeepepochs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hitlic%2Fdeepepochs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hitlic%2Fdeepepochs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hitlic","download_url":"https://codeload.github.com/hitlic/deepepochs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234152721,"owners_count":18787675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deep-learning","pytorch","training","training-tools"],"created_at":"2024-11-22T06:12:59.934Z","updated_at":"2025-09-25T04:32:22.305Z","avatar_url":"https://github.com/hitlic.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DeepEpochs\n\nPytorch深度学习模型训练工具。\n\n### 安装\n\n```bash\npip install deepepochs\n```\n\n### 使用\n\n#### 数据要求\n\n- 训练集、验证集和测试集是`torch.utils.data.Dataloader`对象\n- `Dataloaer`所构造的每个mini-batch数据（`collate_fn`返回值）是一个`tuple`或`list`，其中最后一个是标签\n  - 如果训练中不需要标签，则需将最后一项置为`None`\n\n#### 指标计算\n\n- 每个指标是一个函数\n  - 有两个参数，分别为模型预测和数据标签\n  - 返回值为当前mini-batch上计算的指标值或字典\n  - 支持基于`torchmetrics.functional`定义指标\n\n#### 实例\n\n```python\nimport torch\nfrom torch import nn\nfrom torch.nn import functional as F\nfrom torchvision.datasets import MNIST\nfrom torchvision import transforms\nfrom torch.utils.data import DataLoader, random_split\nfrom deepepochs import Trainer\n\n# 1. --- datasets\ndata_dir = './datasets'\ntransform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])\nmnist_full = MNIST(data_dir, train=True, transform=transform, download=True)\ntrain_ds, val_ds = random_split(mnist_full, [55000, 5000])\ntest_ds = MNIST(data_dir, train=False, transform=transform, download=True)\ntrain_dl = DataLoader(train_ds, batch_size=32)\nval_dl = DataLoader(val_ds, batch_size=32)\ntest_dl = DataLoader(test_ds, batch_size=32)\n\n# 2. --- model\nchannels, width, height = (1, 28, 28)\nmodel = nn.Sequential(\n    nn.Flatten(),\n    nn.Linear(channels * width * height, 64), nn.ReLU(), nn.Dropout(0.1),\n    nn.Linear(64, 64), nn.ReLU(), nn.Dropout(0.1),\n    nn.Linear(64, 10)\n)\n\n# 3. --- optimizer\nopt = torch.optim.Adam(model.parameters(), lr=2e-4)\n\n# 4. --- train\ntrainer = Trainer(model, F.cross_entropy, opt, epochs=2)  # 训练器\ntrainer.fit(train_dl, val_dl)                             # 训练、验证\ntrainer.test(test_dl)                                     # 测试\n```\n\n### 更多实例\n\n|序号|功能说明|代码|\n| ---- | ---- | ---- |\n|1|基本使用|[examples/1-basic.py](examples/1-basic.py)|\n|2|Trainer、fit方法、test方法的常用参数|[examples/2-basic-params.py](examples/2-basic-params.py)|\n|3|模型性能评价指标的使用|[examples/3-metrics.py](examples/3-metrics.py)|\n|4|Checkpoint与EarlyStop|[examples/4-checkpoint-earlystop.py](examples/4-checkpoint-earlystop.py)|\n|5|寻找适当的学习率|[examples/5-lr-find.py](examples/5-lr-find.py)|\n|6|利用Tensorboad记录训练过程|[examples/6-logger.py](examples/6-logger.py)|\n|7|利用Tensorboard记录与可视化超参数|[examples/7-log-hyperparameters.py](examples/7-log-hyperparameters.py)|\n|8|分析、解释或可视化模型的预测效果|[examples/8-interprete.py](examples/8-interprete.py)|\n|9|学习率调度|[examples/9-lr-schedule.py](examples/9-lr-schedule.py)|\n|10|使用多个优化器|[examples/10-multi-optimizers.py](examples/10-multi-optimizers.py)|\n|11|在训练、验证、测试中使用多个Dataloader|[examples/11-multi-dataloaders.py](examples/11-multi-dataloaders.py)|\n|12|基于图神经网络的节点分类|[examples/12-node-classification.py](examples/12-node-classification.py)|\n|13|模型前向输出和梯度的可视化|[examples/13-weight-grad-visualize.py](examples/13-weight-grad-visualize.py)|\n|14|自定义Callback|[examples/14-costomize-callback.py](examples/14-costomize-callback.py)|\n|15|通过`TrainerBase`定制`train_step`和`evaluate_step`|[examples/15-customize-steps-1.py](examples/15-customize-steps-1.py)|\n|16|通过`EpochTask`定制`train_step`和`eval_step`和`test_step`|[examples/16-customize-steps-2.py](examples/16-customize-steps-2.py)|\n|17|通过`EpochTask`定制`step`|[examples/17-costomize-steps-3.py](examples/17-costomize-steps-3.py)|\n|18|内置Patch的使用1|[examples/18-use_patches-1.py](examples/18-use_patches-1.py)|\n|19|内置Patch的使用2|[examples/19-use_patches-2.py](examples/19-use_patches-2.py)|\n|20|自定义Patch|[examples/20-customize-patch.py](examples/20-customize-patch.py)|\n|21|分布式训练、混合精度训练|[examples/21-accelerate.py](examples/21-accelerate.py)|\n|22|定制`train_step`实现累积梯度训练|[examples/22-grad_accumulate-1.py](examples/22-grad_accumulate-1.py)|\n|23|定制`train_step`，利用Accelerate实现累积梯度训练|[examples/23-grad_accumulate-2.py](examples/23-grad_accumulate-2.py)|\n|24|输入、输出为字典的模型| [examples/24-dict_inputs_outputs.py](examples/24-dict_inputs_outputs.py) |\n\n\n### 定制\n\n- 方法1（__示例14__）\n    - 第1步：继承`deepepochs.Callback`类，定制满足需要的`Callback`\n    - 第2步：使用`deepepochs.Trainer`训练模型，将定制的`Callback`对象作为`Trainer`的`callbacks`参数\n- 方法2（__示例15__）\n    - 第1步：继承`deepepochs.TrainerBase`类定制满足需要的`Trainer`，实现`step`、`train_step`、`val_step`、`test_step`或`evaluate_step`方法，它们的定义方法完全相同\n      - 参数\n          - `batch_x`：     一个mini-batch的模型输入数据\n          - `batch_y`：     一个mini-batch的标签\n          - `**step_args`：可变参数字典，即`EpochTask`的`step_args`参数\n      - 返回值为`None`或字典\n          - key：指标名称\n          - value：`deepepochs.PatchBase`子类对象，可用的Patch有（__示例18__）\n              - `ValuePatch`：    根据每个mini-batch指标均值（提前计算好）和batch_size，累积计算Epoch指标均值\n              - `TensorPatch`：   保存每个mini-batch的(preds, targets)，Epoch指标利用所有mini-batch的(preds, targets)数据重新计算\n              - `MeanPatch`：     保存每个batch指标均值，Epoch指标值利用每个mini-batch的均值计算\n                  - 一般`MeanPatch`与`TensorPatch`结果相同，但占用存储空间更小、运算速度更快\n                  - 不可用于计算'precision', 'recall', 'f1', 'fbeta'等指标\n              - `ConfusionPatch`：用于计算基于混淆矩阵的指标，包括'accuracy', 'precision', 'recall', 'f1', 'fbeta'等\n          - 也可以继承`PatchBase`定义新的Patch，需要实现如下方法 __（示例19）__\n              - `PatchBase.add`\n                - 用于将两个Patch对象相加得到更大的Patch对象\n              - `PatchBase.forward`\n                - 用于计算指标，返回指标值或字典\n    - 第2步：调用定制`Trainer`训练模型。\n- 方法（__示例16、17__）\n    - 第1步：继承`deepepochs.EpochTask`类，在其中定义`step`、`train_step`、`val_step`、`test_step`或`evaluate_step`方法\n      - 它们的定义方式与`Trainer`中的`*step`方法相同\n      - `step`方法优先级最高，即可用于训练也可用于验证和测试（定义了`step`方法，其他方法就会失效）\n      - `val_step`、`test_step`优先级高于`evaluate_step`方法\n      - `EpochTask`中的`*step`方法优先级高于`Trainer`中的`*step`方法\n      - `EpochTask`的`__ini__`方法的`**step_args`会被注入`*step`方法的`step_args` 参数\n    - 第2步：使用新的`EpochTask`任务训练\n      - 将`EpochTask`对象作为`Trainer.fit`中`train_tasks`和`val_tasks`的参数值，或者`Trainer.test`方法中`tasks`的参数值\n\n### 数据流图\n\n\u003cimg src=\"imgs/data_flow.png\" width=\"80%\" alt=\"https://github.com/hitlic/deepepochs/blob/main/imgs/data_flow.png\"/\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhitlic%2Fdeepepochs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhitlic%2Fdeepepochs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhitlic%2Fdeepepochs/lists"}