# 6. 如何开展和记录实验
> 导读: 当我们开始训练多个具有不同超参数的模型,我们就需要对实验开始进行管理。**我们将其分为三个部分:实验追踪、超参数搜索和配置设置**。我们将使用 Weights & Biases 来演示实验记录和追踪;然后,我们将利用 Weights & Biases Sweeps 对训练超参数进行超参数搜索;最后,我们将使用 Hydra 来优雅地配置我们日益复杂的深度学习应用。
>
> 本次课程目的在于能够让你了解并实践如何将实验管理工具整合到你的模型训练工作流程中。
## 本教程目标
1. 通过Weights & Biases管理实验记录
2. 使用 Sweeps 执行超参数搜索。
3. 使用 Hydra 管理复杂的配置。
## 本教程内容
### 0. 安装
```python
conda create --name l8 python=3.9
conda install -n l8 ipykernel --update-deps --force-reinstall
conda install -n l8 pytorch torchvision torchaudio -c pytorch-nightly
conda install -n l8 -c conda-forge wandb
conda install -c conda-forge hydra-core
```
或者用`pip install` 库
### 1. 实验记录
大家是不是都曾遇到过这样的情况:如果没有良好的实验记录工具,我们最终也许会得到一个性能非常好的模型,但我们不记得其超参数选择,或者启动 100 个实验却无法轻松跟踪哪个模型表现最好,而实验跟踪工具能帮助我们解决这些问题。
**Logging**
通常来说我们在训练的过程中,通常会打印我们正在使用的超参数,以及模型训练时的损失+准确性。
```python
import random
def run_training_run_txt_log(epochs, lr):
print(f"Training for {epochs} epochs with learning rate {lr}")
offset = random.random() / 5
for epoch in range(2, epochs):
# 模拟训练过程
acc = 1 - 2 ** -epoch - random.random() / epoch - offset
loss = 2 ** -epoch + random.random() / epoch + offset
print(f"epoch={epoch}, acc={acc}, loss={loss}")
# 进行一次学习率为0.1的训练运行
run_training_run_txt_log(epochs=10, lr=0.01)
```
下面展示我们如何用Weights & Biases管理实验记录
#### Weights and Biases
Weights & Biases 是:
> “开发者构建更好模型、更快开发的机器学习平台。使用 W&B 的轻量级、可互操作的工具,可以快速追踪实验、版本化和迭代数据集、评估模型性能、复现模型、可视化结果并发现回归问题,并与同事分享发现。
>
> 你使用哪种实验追踪工具不是一个标准答案:有人喜欢 Weights and Biases,简称 wandb:你可以按其最初的意图读作 w-and-b,或者读作 wan-db(因为它像数据库一样保存东西)。替代选择包括 Tensorboard、Neptune 和 Tensorboard。”
让我们开始使用wandb吧!
系统可能会提示您创建账户,然后添加您的token。
```python
# Log in to your W&B account
import wandb
wandb.login()
```
我们现在将在上面提供的函数进行修改,展示如何使用wandb。
```python
import random
def run_training_run(epochs, lr):
print(f"Training for {epochs} epochs with learning rate {lr}")
wandb.init(
# Set the project where this run will be logged
project="example",
# Track hyperparameters and run metadata
config={
"learning_rate": lr,
"epochs": epochs,
})
offset = random.random() / 5
print(f"lr: {lr}")
for epoch in range(2, epochs):
# simulating a training run
acc = 1 - 2 ** -epoch - random.random() / epoch - offset
loss = 2 ** -epoch + random.random() / epoch + offset
print(f"epoch={epoch}, acc={acc}, loss={loss}")
wandb.log({"acc": acc, "loss": loss})
wandb.finish()
run_training_run(epochs=10, lr=0.01)
```
我们在这里使用 3 个函数:wandb.init、wandb.log 和 wandb.finish——它们各自的作用是什么?
- 我们在脚本开头调用一次 wandb.init() 来初始化新项目。这会在 W&B 中创建新的运行并启动后台进程来同步数据。
- 我们调用 wandb.log(dict) 将指标、媒体或自定义对象的字典记录到步骤中。我们可以看到我们的模型和数据如何随着时间的推移而演变。
- 我们调用wandb.finish来使运行完成,并完成所有数据的上传。
让我们看看在 wandb 网站上看到了什么,应该看到我们的准确性和损失曲线。
![](img/1-1.png)
在我们的信息选项卡中,我们还应该能够看到配置和摘要,告诉我们 acc 和 loss 的最终值。
![](img/1-2.png)
我们已经获得了两个不错的功能:
1. 能够看到循环每一步的准确性和损失如何变化。
2. 能够看到与运行相关的配置(超参数)。
3. 能够看到我们的运行最终获得的准确率acc和loss损失。
#### 多次实验
我们现在要增加一些复杂性。当我们通常训练模型时,我们会尝试不同的超参数。我们将调整的最重要的超参数之一是学习率,另一个可能是训练的轮数(epochs)。那么我们如何记录多个运行呢?
```python
def run_multiple_training_runs(epochs, lrs):
for epoch in epochs:
for lr in lrs:
run_training_run(epoch, lr)
# Try different values for the learning rate
epochs = [100, 120, 140]
lrs = [0.1, 0.01, 0.001, 0.0001]
run_multiple_training_runs(epochs, lrs)
```
正如你所看到的,这使用了我们上面已经写好的函数,以不同的学习率和epoch多次调用它。让我们看看我们得到了什么。
我们可以访问 wandb 的网站并进入表格选项卡。
![](img/1-3.png)
在左边我们可以看到每一次的实验,点击进去,可以看到每一组的实验参数配置,比如我们选择第一组,happy-water-13,可以看到下面这个界面:
![](img/1-4.png)
#### 模型保存和加载
我们经过不懈的努力终于获得了我们期望的结果!现在我们决定要使用其中一个训练好的模型。我们可以在 W&B 上查找该运行的配置,然后重新训练模型并保存它!但是,如果我们在运行时就保存了与其关联的模型,那该多好,这样我们就可以直接加载它,对吗?
那么,我们应该如何实现这一点呢?我们可以使用 Weights & Biases 的 Artifacts 功能来跟踪数据集、模型、依赖项和结果,贯穿于整个机器学习流程的每一步。Artifacts 可以轻松获得文件更改的完整且可审核的历史记录。根据[文档](https://docs.wandb.ai/guides/artifacts):
Artifacts 可以被视为一个版本化的目录。Artifacts 要么是运行的输入,要么是运行的输出。常见的 artifacts 包括整个训练集和模型。可以将数据集直接存储到 artifacts 中,或者使用 artifact 引用指向其他系统中的数据,如 Amazon、或你自己的系统。
使用 4 行简单的代码来记录 wandb Artifacts非常容易:
```python
wandb.init()
artifact = wandb.Artifact(<enter_filename>, type='model')
artifact.add_file(<file_path>)
wandb.run.log_artifact(artifact)
```
如果我们有一行用于保存 PyTorch 模型的代码:
```python
model_path = f"model_{epoch}.pt"
torch.save(model.state_dict(), model_path)
```
我们可以修改它以将artifacts上传到 wandb 上。
```python
# Log the model to wandb
model_path = f"model_{epoch}.pt"
torch.save(model.state_dict(), model_path)
artifact = wandb.Artifact(model_path, type='model')
artifact.add_file(model_path)
wandb.run.log_artifact(artifact)
```
现在我们可以看到我们的模型checkpoint保存在 W&B 中:
![](img/1-5.png)
我们还可以看到相关的元数据:
![](img/1-6.png)
**练习**
> 撰写代码,以便您可以在训练时保存前 3 个最佳模型。提示:参见[这里](How to save all your trained model weights locally after every epoch.ipynb)。
如果我们有保存的模型,我们
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
《动手做科研》面向科研初学者,一步一步地展示如何入门人工智能科研_hands-on-research-tutorial.zip (113个子文件)
.gitignore 3KB
lecture4.ipynb 125KB
How to save all your trained model weights locally after every epoch.ipynb 18KB
camp.jpg 47KB
README.md 25KB
README.md 18KB
README.md 16KB
README.md 16KB
README.md 15KB
README.md 14KB
README.md 9KB
README.md 8KB
HowToRunCDLab.md 6KB
README.md 6KB
README.md 5KB
README.md 3KB
1.prepare_python.md 2KB
README.md 2KB
6_2.pdf 6.5MB
UNet.pdf 1.55MB
6_1.pdf 1.47MB
1-2.png 10.21MB
1-4.png 8.92MB
1-6.png 8.81MB
1-5.png 8.79MB
1-3.png 8.79MB
1-6.png 8.36MB
1-1.png 5.63MB
2-3.png 870KB
wechat.png 670KB
2-6.png 653KB
2-7.png 609KB
1_text_generatation.png 562KB
1-2.png 495KB
0-12.png 453KB
2_debug_search.png 417KB
3_git_1.png 391KB
2_code_generatation.png 336KB
1-3.png 317KB
1-11.png 299KB
1-2.png 296KB
2-1.png 268KB
0-8.png 263KB
1-14.png 259KB
1-10.png 258KB
1-7.png 228KB
0-2.png 192KB
0-9.png 192KB
0-1.png 191KB
1-3.png 191KB
0-10.png 181KB
1-4.png 177KB
0-11.png 166KB
0-7.png 164KB
1-12.png 161KB
0-6.png 152KB
3_git_2.png 150KB
2_debug_2.png 149KB
1_vscode_run.png 139KB
1-1.png 138KB
2-4.png 137KB
1-2.png 135KB
1-1.png 134KB
1-1.png 133KB
1-9.png 132KB
1-3.png 131KB
1-4.png 131KB
1-4.png 120KB
1-6.png 118KB
2-2.png 117KB
2_debug_6.png 116KB
2_debug_15.png 115KB
1-8.png 115KB
0-13.png 110KB
0_prepare_env.png 110KB
1-13.png 103KB
2_code_generatation_1.png 94KB
0-4.png 93KB
2_debug_8.png 91KB
2-5.png 89KB
2_debug_17.png 87KB
1_vscode_2.png 86KB
4_codespace_1.png 86KB
1-7.png 82KB
1-1.png 82KB
0-3.png 78KB
2_debug_12.png 76KB
cnn.png 76KB
1_vscode_3保存地址.png 75KB
0-5.png 75KB
2_debug_5.png 73KB
1-5.png 70KB
3_git_3.png 65KB
2_debug_11.png 64KB
2_debug_16.png 64KB
camp.png 62KB
1-2.png 61KB
2_debug_4.png 59KB
1_vscode.png 58KB
2_debug_13.png 57KB
共 113 条
- 1
- 2
资源评论
普通网友
- 粉丝: 1127
- 资源: 5293
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于 nodejs+SQL server 实现的学生-教师评价系统课程设计
- PLC项目程序 2号卸笼.gxw
- BZ-00-03 C008053 SAP2000 刚性连接转换
- java图书管理微信小程序源码数据库 MySQL源码类型 WebForm
- Qt QChart绘制跟随鼠标的十字线
- Baidunetdisk_AndroidPhone_1023843j-1.apk
- PLC 程序 2号卸垛AD778899.gxw
- C#ASP.NET大学在线考试系统源码数据库 SQL2008源码类型 WebForm
- PLC 程序 2号送盖机123DF456.gxw
- ta-lib-0.5.1-cp311-cp311-win-amd64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功