作者 |Chris Padwick
编译 |Flin
起源 |medium
农业对你明天的生存有什么影响?如果你住在城市里,你可能会感觉你与生产你食物的农场和田地脱节了。农业是咱们生存的一个外围局部,咱们却经常认为这是天经地义的。
明天的农民面临着一个微小的挑战 —— 用更少的土地养活日益增长的寰球人口。预计到 2050 年,世界人口将增长到近 100 亿,使寰球食粮需要减少 50%。
随着食粮需要的增长,土地、水和其余资源将面临更大的压力。农业中固有的可变性,如气象条件的变动,以及杂草和害虫等威逼,也会对农民生产食粮的能力产生影响。在应用更少资源的同时生产更多食粮的惟一办法是通过智能机器,该机器能够帮忙工作艰难的农民,提供更高的一致性,准确性和效率。
农业机器人
在蓝河科技,咱们正在制作下一代智能机器。农民应用咱们的工具来管制杂草和降低成本,以促成农业可继续倒退。
咱们的除草机器人集成了摄像头、计算机视觉、机器学习和机器人技术,制作了一款智能喷雾器,能够在田间行驶(应用 AutoTrac 将驾驶员的负载降至最低),并疾速锁定目标并喷洒杂草,使作物完整无缺。
- AutoTrac:https://www.deere.com/en/tech…
这台机器须要实时决定什么是庄稼什么是杂草。当机器在野外行驶时,高分辨率相机以高帧速率采集图像。
咱们开发了一个卷积神经网络(CNN),应用 Pytorch 剖析每一帧,并生成一张像素准确的农作物和杂草所在的地图。一旦所有的动物都被辨认进去,每个杂草和作物都被映射到田间地位,机器人只喷洒杂草。
整个过程在几毫秒内实现,因为效率很高,农民就能够笼罩尽可能多的土地。
这是一个很棒的 See&Spray 视频,具体介绍了该过程。
- https://youtu.be/XH-EFtTa6IU
为了反对机器学习(ML)和机器人技术,咱们基于 NVIDIA Jetson AGX Xavier Edge AI 平台构建了一个令人印象粗浅的计算单元。
因为咱们所有的推断都是实时进行的,上传到云端须要的工夫太长,所以咱们将服务器场带到现场。
专门用于视觉推理和喷雾机器人的机器人的总计算能力与 IBM 的超级计算机 Blue Gene(2007)相当。这使它成为寰球挪动机械中具备最高计算能力的机器!
杂草检测模型的建设
我的钻研人员和工程师团队负责训练辨认作物和杂草的神经网络模型。这是一个具备挑战性的问题,因为许多杂草看起来就像庄稼。业余的农学家和杂草科学家训练咱们的标签工作人员正确地标记图像——你能发现上面哪些是杂草吗?
在下图中,棉花动物为绿色,杂草为红色。
机器学习栈
在机器学习方面,咱们有一个简单的堆栈。咱们用 Pytorch 训练咱们所有的模特。咱们在 Pytorch 上建设了一组外部库,容许咱们进行可反复的机器学习试验。我的团队职责分为三类:
- 建设生产模型以部署到机器人上
- 以一直进步模型性能为指标,进行机器学习试验和钻研
- 与机器学习、A/ B 测试、流程改良、软件工程相干的数据分析 / 数据迷信
咱们抉择 Pytorch 是因为它非常灵活且易于调试。新的团队成员能够很快跟上进度,而且文档十分详尽。
在应用 PyTorch 之前,咱们的团队宽泛应用 Caffe 和 Tensorflow。2019 年,咱们决定改用 Pytorch,过渡顺利。同时也为工作流的钻研提供了反对。
例如,咱们应用 Torchvision 库进行图像变换和张量变换。它蕴含了一些根本的性能,并且与像 imgauge 这样的简单的加强包进行了很好的集成。torchvision 中的变换对象与 imgauge 的集成就是小菜一碟。
上面是一个应用 Fashion MNIST 数据集(https://github.com/zalandores…)的代码示例。
名为 CustomAugmentor 的类将初始化构造函数中的 iaa.Sequential 对象,而后在__call__办法中调用 invoke_image()。而后,在 ToTensor() 之前,将 CustomAugmentor() 增加到对 transforms.Compose() 的调用中。
当初,当加载批次进行训练和验证时,train 和 val 数据加载器将利用 CustomAugmentor() 中定义的加强。
from imgaug import augmenters as iaa
import numpy as np
import os
import torch
from torch.utils.data import DataLoader, random_split
from torchvision.datasets import FashionMNIST
from torchvision import datasets, transforms
DATA_DIR = './fashionMNIST/'
class CustomAugmentor:
def __init__(self):
self.aug = iaa.Sequential([iaa.flip.Fliplr(p=0.5),
iaa.GaussianBlur(sigma=(0.0, 0.1)),
iaa.Multiply((0.9, 1.1)),
iaa.Dropout((0, 0.05)),
iaa.AdditiveGaussianNoise(scale=(0, 0.05*255))
])
def __call__(self, img):
img = np.array(img)
# 在此处返回一个正本以解决谬误:ValueError: 至多一个步幅
#在给定的 numpy 数组中为负,张量为负跨度
#以后不反对。return self.aug.augment_image(img).copy()
# 转换图像
transform=transforms.Compose([CustomAugmentor(), transforms.ToTensor()])
fmnist_train = FashionMNIST(DATA_DIR, train=True, download=True, transform=transform)
fmnist_test = FashionMNIST(DATA_DIR, train=False, download=True, transform=transforms.ToTensor())
fmnist_train, fmnist_val = random_split(fmnist_train, [55000, 5000])
train_dl = DataLoader(fmnist_train, batch_size=64)
val_dl = DataLoader(fmnist_val, batch_size=64)
test_dl = DataLoader(fmnist_test, batch_size=64)
此外,PyTorch 已成为计算机视觉生态系统中最喜爱的工具(请参阅 https://paperswithcode.com/,PyTorch 是常见的提交)。这样一来,咱们就能够轻松地尝试诸如 Debiased Contrastive Learning 之类的新技术进行半监督式训练。
在模型训练方面,咱们有两个失常的工作流程:生产和钻研。
对于钻研应用程序,咱们的团队在外部本地计算群集上运行 PyTorch。在本地群集上执行的作业由 Slurm 治理,Slurm 是基于 HPC 批处理作业的调度程序。它是收费的,易于设置和保护的,并且提供了咱们小组运行数千个机器学习作业所需的所有性能。
对于基于生产的工作流程,咱们在 AWS 托管的 Kubernetes(K8s)集群之上利用 Argo 工作流程。咱们的 PyTorch 训练代码是应用 Docker 部署到云中的。
在农业机器人上部署模型
对于生产部署,咱们的首要任务之一是在边缘计算设施上进行高速推理。如果机器人须要开得慢一点来期待推断,它在田间的效率就不可能那么高了。
为此,咱们应用 TensorRT 将网络转换为 NVIDIA Jetson AGX Xavier 优化模型。TensorRT 不承受 JIT 模型作为输出,因而咱们应用 ONNX 从 JIT 转换为 ONNX 格局,而后应用 TensorRT 转换为间接部署到设施上的 TensorRT 引擎文件。
随着工具栈的倒退,咱们冀望这个过程也会失去改良。咱们的模型应用 Jenkins 构建过程部署到 Artifactory,并通过从 Artifactory 中提取将它们部署到现场的近程机器上。
为了监控和评估咱们的机器学习运行,咱们发现 http://wandb.com/ 平台是最好的解决方案。他们的 API 使得将 W &B 日志集成到现有的代码库中变得更快。咱们应用 W &B 监控正在进行的训练,包含训练的实时曲线和验证损失。
SGD vs Adam Project
作为应用 Pytorch 和 W &B 的一个例子,我将运行一个试验,并比拟在 Pytorch 中应用不同求解器的后果。Pytorch 中有许多不同的求解器——很显著的问题是你应该抉择哪一种?
Adam 是一个很受欢迎的解决方案。它通常在不须要设置任何参数的状况下给出良好的后果,并且是咱们通常会抉择的模型。该求解器位于 https://pytorch.org/docs/stab… 下
对于机器学习钻研人员来说,另一个风行的求解器抉择是随机梯度降落(SGD)。此求解器在 Pytorch 中可用 https://pytorch.org/docs/stab… 取得
如果你是不晓得两者之间的差别,或者如果你须要温习,我倡议你把这两个的区别写下来。动量是机器学习中的一个重要概念,它能够防止陷入优化空间中的部分最小值,从而找到更好的解决方案。应用 SGD 和动量的问题是:我能找到击败 Adam 的 SGD 的动量设置吗?
试验安装如下。我对每次运行应用雷同的训练数据,并在同一个测试集中评估后果。我要比拟一下 F1 score 在不同的运行中的得分。我用 SGD 作为求解器设置了许多次运行,并从 0–0.99 扫描动量值(当应用动量时,大于 1.0 的任何值都会导致求解器发散)。
我设置了运行 10 次,动量值从 0 到 0.9,增量为 0.1。接下来,我又运行了 10 次,这次动量值在 0.90 到 0.99 之间,增量为 0.01。在看了这些后果之后,我还进行了一组动量值为 0.999 和 0.9999 的试验。每次运行都应用不同的随机种子,并在 W &B 中被赋予“SGD 扫描”标签。后果如图 1 所示。
从图 1 十分分明,动量值越大,f1 分数越高。最佳值 0.9447 在动量值 0.999 时呈现,在动量值 0.9999 时降落到 0.9394。数值如下表所示。
表 1:每次运行在上表中显示为一行。最初一栏是运行的动量设置。显示了第 2 类(庄稼)的 F1 得分,准确性和召回率。
这些后果与 Adam 相比如何?为了测试这一点,我仅用默认参数来应用 torch.optim.Adam。我用 W &B 中的“Adam runs”标签来标识这些运行记录。我还标记了每一组 SGD 运行以进行比拟。
因为每次运行应用不同的随机种子,求解器每次初始化都会不同,并在最初一个 epoch 应用不同的权重。这会在每次运行的测试集中给出略微不同的后果。为了比拟它们,我须要测量 Adam 和 SGD 运行值的散布。应用 W&B 中按标签分组的箱形图能够轻松做到这一点。
后果在图 2 中以图表模式显示,在表 2 中以表格模式显示。残缺的报告也能够在线取得。
- https://app.wandb.ai/bluerive…
你能够看到,仅通过 SGD 调整动量值就无奈击败 Adam。动量设置为 0.999 能够失去十分类似的后果,但 Adam 运行的方差更小,平均值也更高。因而,Adam 仿佛是解决咱们的动物宰割问题的一个好抉择!
Pytorch 可视化
通过集成 Pytorch,W&B 能够在每一层获取梯度,让咱们在训练期间查看网络。
W&B 试验跟踪还能够使 Pytorch 模型在训练期间更容易可视化,因而你能够在地方仪表板上实时查看损失曲线。咱们在团队会议中应用这些可视化成果来探讨最新后果并共享更新。
当图像通过 Pytorch 模型时,咱们将预测记录到 Weights & Biases 中,以可视化模型训练的后果。在这里咱们能够看到预测、正确标注和标签。这样能够轻松地确定模型性能未达到咱们冀望的状况。
在这里,咱们能够疾速浏览正确标注,预测以及两者之间的差别。咱们将农作物标记为绿色,将杂草标记为红色。如你所见,该模型在辨认图像中的农作物和杂草方面做得相当正当。
以下是如何在 W &B 中应用数据帧的简短代码示例:
# Per-sample dataframe with images.
data = []
# Loop through the mini-batches. Each batch is a dictionary.
For batch in batches:
image = batch[“image”].astype(np.uint8)
label = batch[“label”]
pred = batch[“prediction”]
zeros = np.zeros_like(image)
diff = np.zeros_like(pred)
diff[np.where(pred != label)] = 255.0
datapoint = {}
datapoint['image'] = wandb.Image(image)
# colorize_segmentation is a method which alpha-blends the class colors into an image.
datapoint['pred'] = wandb.Image(colorize_segmentation(zeros, pred, alpha=1.0))
datapoint['label'] = wandb.Image(colorize_segmentation(zeros, label, alpha=1.0))
datapoint['diff'] = wandb.Image(diff)
data.append(datapoint)
# Convert the list of datapoints to a pandas dataframe and log it to W&B.
log_df = pd.DataFrame(data)
wandb.run.summary['my_awesome_dataframe’'] = log_df
可复制模型
再现性和可追溯性是任何 ML 零碎的要害个性,而且很难失去正确的后果。当比拟不同的网络体系结构和超参数时,输出数据必须雷同能力使运行具备可比性。
通常 ML 团队中的个体实践者都会保留 YAML 或 JSON 配置文件——要找到团队成员的运行记录并认真查看他们的配置文件以找出应用了什么训练集和超参数,这是一件十分苦楚的事件。咱们都做过,咱们都厌恶。
W&B 刚刚公布的一个新个性解决了这个问题。工件(Artifact)容许咱们跟踪训练和评估运行的输出和输入。这对咱们的可重复性和可追溯性有很大帮忙。我能够晓得应用了哪些数据集来训练模型,生成了哪些模型(来自屡次运行)以及模型评估的后果。
典型的用例如下。数据暂存过程将下载最新和最大的数据,并将其暂存到磁盘上进行训练和测试(每个数据集都是独自的)。这些数据集被指定为工件(Artifact)。
训练运行将训练集工件(Artifact)作为输出,并将经过训练的模型输入为输入工件(Artifact)。评估过程将测试集工件(Artifact)与训练的模型工件(Artifact)一起作为输出,并输入可能蕴含一组度量或图像的评估。
有向无环图(DAG)是在 W &B 中造成和可视化的。这是很有帮忙的,因为跟踪将机器学习模型公布到生产中所波及的工件(Artifact)十分重要。这样的 DAG 很容易造成:
Artifacts 个性的一大长处是能够抉择上载所有工件(Artifact)(数据集、模型、评估),也能够抉择只上载对工件(Artifact)的援用。这是一个很好的个性,因为挪动大量数据既耗时又慢。对于数据集工件(Artifact),咱们只需在 W &B 中存储对这些工件(Artifact)的援用,这就容许咱们放弃对数据的管制(并防止长时间的传输),并且在机器学习中依然能够取得可追溯性和再现性。
# 初始化 wandb.
wandb_run = wandb.init(job_type="train", reinit=True, project=”blog-post”,
tags=[“SGD Sweep”], tensorboard=False)
# 指定用于训练运行的工件(Artifact)。在这里咱们指定一个训练数据集和测试数据集。artifact_list = [{“name”:“blueriver/blog-post/train-dataset:latest”,“type”:“dataset”},
{“name”:“blueriver/blog-post/test-dataset:latest”,“type”:“dataset”}]
# 遍历列表,并通知 wandb 应用工件(Artifact)。for elem in artifact_list:
artifact = wandb_run.use_artifact(elem[“name”], elem[“type”])
领导 ML 团队
回顾我领导机器学习工程师团队的这些年,我看到了一些常见的挑战:
效率 :当咱们开发新模型时,咱们须要疾速试验并分享后果。Pytorch 使咱们很容易疾速增加新个性,W&B 为咱们提供了调试和改良模型所需的可见性。
灵活性 :与咱们的客户单干,每天都会带来新的挑战。咱们的团队须要可能满足咱们一直变动的需要的工具,这就是为什么咱们抉择 Pytorch 作为其蓬勃发展的生态系统,抉择 W &B 作为轻量级的模块化集成。
性能 :归根结底,咱们须要为咱们的农业机器人建设最准确和最快的模型。Pytorch 使咱们可能疾速迭代,而后将模型产品化并部署到现场。咱们在 W &B 的开发过程中具备齐全的可视性和透明度,使咱们很容易确定性能最好的模型。
原文链接:https://medium.com/pytorch/ai…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/