# torchkeras
**Repository Path**: ligan15/torchkeras
## Basic Information
- **Project Name**: torchkeras
- **Description**: Pytorch❤️ Keras 😋😋
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 6
- **Created**: 2024-06-07
- **Last Updated**: 2024-06-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 炼丹师,这是你的梦中情炉吗?🌹🌹
[English](README_en.md) | 简体中文
torchkeras 是一个通用的pytorch模型训练模版工具,按照如下目标进行设计和实现:
* **好看** (代码优雅,日志美丽,自带可视化)
* **好用** (使用方便,支持 进度条、评估指标、early-stopping等常用功能,支持tensorboard,wandb回调函数等扩展功能)
* **好改** (修改简单,核心代码模块化,仅约200行,并提供丰富的修改使用案例)
```python
```
## 1,炼丹之痛 😭😭
无论是学术研究还是工业落地,pytorch几乎都是目前炼丹的首选框架。
pytorch的胜出不仅在于其简洁一致的api设计,更在于其生态中丰富和强大的模型库。
但是我们会发现不同的pytorch模型库提供的训练和验证代码非常不一样。
torchvision官方提供的范例代码主要是一个关联了非常多依赖函数的train_one_epoch和evaluate函数,针对检测和分割各有一套。
yolo系列的主要是支持ddp模式的各种风格迥异的Trainer,每个不同的yolo版本都会改动很多导致不同yolo版本之间都难以通用。
抱抱脸的transformers库在借鉴了pytorch_lightning的基础上也搞了一个自己的Trainer,但与pytorch_lightning并不兼容。
非常有名的facebook的目标检测库detectron2, 也是搞了一个它自己的Trainer,配合一个全局的cfg参数设置对象来训练模型。
还有我用的比较多的语义分割的segmentation_models.pytorch这个库,设计了一个TrainEpoch和一个ValidEpoch来做训练和验证。
在学习和使用这些不同的pytorch模型库时,尝试阅读理解和改动这些训练和验证相关的代码让我受到了一万点伤害。
有些设计非常糟糕,嵌套了十几层,有些实现非常dirty,各种带下划线的私有变量满天飞。
让你每次想要改动一下加入一些自己想要的功能时就感到望而却步。
我不就想finetune一下模型嘛,何必拿这么多垃圾代码搞我?
```python
```
## 2,梦中情炉 🤗🤗
这一切的苦不由得让我怀念起tensorflow中keras的美好了。
还记得keras那compile, fit, evalute三连击吗?一切都像行云流水般自然,真正的for humans。
而且你看任何用keras实现的模型库,训练和验证都几乎可以用这一套相同的接口,没有那么多莫名奇妙的野生Trainer。
我能否基于pytorch打造一个接口和keras一样简洁易用,功能强大,但是实现代码非常简短易懂,便于修改的模型训练工具呢?
从2020年7月左右发布1.0版本到最近发布的3.86版本,我陆陆续续在工作中一边使用一边打磨一个工具,总共提交修改了70多次。
现在我感觉我细心雕琢的这个作品终于长成了我心目中接近完美的样子。
**她有一个美丽的名字:torchkeras.**
**是的,她兼具torch的灵动,也有keras的优雅~**
**并且她的美丽,无与伦比~**
**她,就是我的梦中情炉~ 🤗🤗**

```python
```
## 3,使用方法 🍊🍊
安装torchkeras
```
pip install torchkeras
```
通过使用torchkeras,你不需要写自己的pytorch模型训练循环。你只要做这样两步就可以了。
(1) 创建你的模型结构net,然后把它和损失函数传入torchkeras.KerasModel构建一个model。
(2) 使用model的fit方法在你的训练数据和验证数据上进行训练,训练数据和验证数据需要封装成两个DataLoader.
核心使用代码就像下面这样:
```python
import torch
import torchkeras
import torchmetrics
model = torchkeras.KerasModel(net,
loss_fn = nn.BCEWithLogitsLoss(),
optimizer= torch.optim.Adam(net.parameters(),lr = 1e-4),
metrics_dict = {"acc":torchmetrics.Accuracy(task='binary')}
)
dfhistory=model.fit(train_data=dl_train,
val_data=dl_val,
epochs=20,
patience=3,
ckpt_path='checkpoint',
monitor="val_acc",
mode="max",
plot=True
)
```
在jupyter notebook中执行训练代码,你将看到类似下面的动态可视化图像和训练日志进度条。

除此之外,torchkeras还提供了一个VLog类,方便你在任意的训练逻辑中使用动态可视化图像和日志进度条。
```python
import time
import math,random
from torchkeras import VLog
epochs = 10
batchs = 30
#0, 指定监控北极星指标,以及指标优化方向
vlog = VLog(epochs, monitor_metric='val_loss', monitor_mode='min')
#1, log_start 初始化动态图表
vlog.log_start()
for epoch in range(epochs):
#train
for step in range(batchs):
#2, log_step 更新step级别日志信息,打日志,并用小进度条显示进度
vlog.log_step({'train_loss':100-2.5*epoch+math.sin(2*step/batchs)})
time.sleep(0.05)
#eval
for step in range(20):
#3, log_step 更新step级别日志信息,指定training=False说明在验证模式,只打日志不更新小进度条
vlog.log_step({'val_loss':100-2*epoch+math.sin(2*step/batchs)},training=False)
time.sleep(0.05)
#4, log_epoch 更新epoch级别日志信息,每个epoch刷新一次动态图表和大进度条进度
vlog.log_epoch({'val_loss':100 - 2*epoch+2*random.random()-1,
'train_loss':100-2.5*epoch+2*random.random()-1})
# 5, log_end 调整坐标轴范围,输出最终指标可视化图表
vlog.log_end()
```
## 4,主要特性 🍉🍉
torchkeras 支持以下这些功能特性,稳定支持这些功能的起始版本以及这些功能借鉴或者依赖的库的来源见下表。
|功能| 稳定支持起始版本 | 依赖或借鉴库 |
|:----|:-------------------:|:--------------|
|✅ 训练进度条 | 3.0.0 | 依赖tqdm,借鉴keras|
|✅ 训练评估指标 | 3.0.0 | 借鉴pytorch_lightning |
|✅ notebook中训练自带可视化 | 3.8.0 |借鉴fastai |
|✅ early stopping | 3.0.0 | 借鉴keras |
|✅ gpu training | 3.0.0 |依赖accelerate|
|✅ multi-gpus training(ddp) | 3.6.0 | 依赖accelerate|
|✅ fp16/bf16 training| 3.6.0 | 依赖accelerate|
|✅ tensorboard callback | 3.7.0 |依赖tensorboard |
|✅ wandb callback | 3.7.0 |依赖wandb |
|✅ VLog | 3.9.5 | 依赖matplotlib|
```python
```
## 5,基本范例 🌰🌰
以下范例是torchkeras的基础范例,演示了torchkeras的主要功能。
包括基础训练,使用wandb可视化,使用wandb调参,使用tensorboard可视化,使用多GPU的ddp模式训练,通用的VLog动态日志可视化等。
|example| notebook | kaggle链接|
|:----|:-------------------------|:-----------:|
|①基础范例 🔥🔥| [**basic example**](./01,kerasmodel_example.ipynb) |