雷蛇与 Lambda 联手推出用于深度学习的 Linux 笔记本电脑
雷蛇与一家专注于深度学习的硬件公司合作，以时尚的外形、昂贵的价格提供了最新和最伟大的产品。 雷蛇 Razer 以其游戏外设和硬件而闻名。另一方面，Lambda 提供配备了他们的软件栈的工作站、服务器和 GPU 集群，以尽可能方便地促进深度学习。他们合作推出了一款外观时尚的现代笔记本电脑（由 Ubuntu 20.04 驱动），专为随时随地的深度学习而设计。它不同于 其他 Linux 笔记本电脑。顺便说一句，深度学习是一种机器学习，你通过实例教给计算机学会类似人类处理信息的方式。你可以查看 维基百科 以了解更多细节。Tensorbook：深度学习笔记本电脑Tensorbook 是一款由 Linux 驱动的笔记本电脑，具有最先进的规格，可以帮助你在任何地方高效地进行深度学习训练/开发。而且，Lambda 的软件栈支持各种工具，只需一个命令就能方便地更新 PyTorch、Tensorflow、CUDA 等。当然，这个名字并不令人意外，因为 张量 Tensor 核心有助于加快机器学习训练/过程。雷蛇没有在这台笔记本电脑上添加任何他们惯用的标志性图案，比如绿色的点缀/颜色、标志或 RGB 元素。好吧，毕竟这是为深度学习而定制的。所以，它不太浮华是公平的。你只能在盖子上找到 Lambda 主要标志，在屏幕的底边框上找到 Razer x Lambda 的文字。而且，紫色的风格贯穿始终，Lambda 在这里主导了其品牌宣传。这款笔记本电脑的规格涉及：GPU：GeForce RTX 3080 Max-Q 16 GB VRAMCPU：Intel i7-11800H内存：64 GB 3200 MHz DDR4存储：2 TB NVMe PCIe 4.0显示：165 Hz 1440p 15.6 英寸除了可靠的核心配置外，连接选项包括：3 个 USB 3.2 Gen 2 Type-A 端口1 x HDMI 2.11 个 UHS-III SD 卡阅读器3.5 毫米耳机/麦克风插孔2 个雷电 4 端口Wi-Fi 6E蓝牙 5.2毋庸置疑，这款笔记本电脑是一个时尚的“动力工厂”，将这些组件容纳于其中。无论你是专业人士还是初学者，RTX 3080 GPU 应该有足够的能力来帮助你完成深度学习任务。当然，它不是为游戏而设计的，但以你所拥有的配置以及高刷新率的屏幕，你可以在需要的时候在上面舒适地玩游戏。其机器学习训练基准声称，它远远领先于 M1 Max 芯片。因此，你在训练模型方面不会有任何问题。定价和可用性这是一款高端产品，所以价格标签也一样高端，起价为 3499 美元。你可以为企业环境定制它，以便安装上 Windows 10 和 Ubuntu。如果你支付额外的费用，还可以获得延长保修和高级支持。你可以在 Lambda 的官方网站上定制并进行购买。Tensorbookvia: https://news.itsfoss.com/tensorbook-razer-lambda/作者：Ankush Das 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
了解如何使用 Kubermatic Kubernetes 平台来部署、扩展与管理图像识别预测的深度学习模型。随着企业增加了对人工智能（AI）、机器学习（ML）与深度学习（DL）的使用，出现了一个关键问题：如何将机器学习的开发进行规模化与产业化？这些讨论经常聚焦于机器学习模型本身；然而，模型仅仅只是完整解决方案的其中一环。为了达到生产环境的应用和规模，模型的开发过程必须还包括一个可以说明开发前后关键活动以及可公用部署的可重复过程。本文演示了如何使用 Kubermatic Kubernetes 平台 对图像识别预测的深度学习模型进行部署、扩展与管理。Kubermatic Kubernetes 平台是一个生产级的开源 Kubernetes 集群管理工具，提供灵活性和自动化，与机器学习/深度学习工作流程整合，具有完整的集群生命周期管理。开始这个例子部署了一个用于图像识别的深度学习模型。它使用了 CIFAR-10 数据集，包含了 60,000 张分属 10 个类别的 32x32 彩色图，同时使用了 Apache MXNet 的 Gluon 与 NVIDIA GPU 进行加速计算。如果你希望使用 CIFAR-10 数据集的预训练模型，可以查阅其 入门指南。使用训练集中的样本对模型训练 200 次，只要训练误差保持缓慢减少，就可以保证模型不会过拟合。下方图展示了训练的过程：训练结束后，必须保存模型训练所得到的参数，以便稍后可以加载它们：file_name = "net.params" net.save_parameters(file_name) 一旦你的模型训练好了，就可以用 Flask 服务器来封装它。下方的程序演示了如何接收请求中的一张图片作为参数，并在响应中返回模型的预测结果：from gluoncv.model_zoo import get_model import matplotlib.pyplot as plt from mxnet import gluon, nd, image from mxnet.gluon.data.vision import transforms from gluoncv import utils from PIL import Image import io import flask app = flask.Flask(__name__) @app.route("/predict",methods=["POST"]) def predict(): if flask.request.method == "POST": if flask.request.files.get("img"): img = Image.open(io.BytesIO(flask.request.files["img"].read())) transform_fn = transforms.Compose([ transforms.Resize(32), transforms.CenterCrop(32), transforms.ToTensor(), transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])]) img = transform_fn(nd.array(img)) net = get_model('cifar_resnet20_v1', classes=10) net.load_parameters('net.params') pred = net(img.expand_dims(axis=0)) class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] ind = nd.argmax(pred, axis=1).astype('int') prediction = 'The input picture is classified as [%s], with probability %.3f.'% (class_names[ind.asscalar()], nd.softmax(pred)[0][ind].asscalar()) return prediction if __name__ == '__main__': app.run(host='0.0.0.0') 容器化模型在将模型部署到 Kubernetes 前，你需要先安装 Docker 并使用你的模型创建一个镜像。下载、安装并启动 Docker：sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo> sudo yum install docker-ce sudo systemctl start docker 创建一个你用来管理代码与依赖的文件夹：mkdir kubermatic-dl cd kubermatic-dl 创建 requirements.txt 文件管理代码运行时需要的所有依赖：flask gluoncv matplotlib mxnet requests Pillow 创建 Dockerfile，Docker 将根据这个文件创建镜像:FROM python:3.6 WORKDIR /app COPY requirements.txt /app RUN pip install -r ./requirements.txt COPY app.py /app CMD ["python", "app.py"] 这个 Dockerfile 主要可以分为三个部分。首先，Docker 会下载 Python 的基础镜像。然后，Docker 会使用 Python 的包管理工具 pip 安装 requirements.txt 记录的包。最后，Docker 会通过执行 python app.py 来运行你的脚本。构建 Docker 容器:sudo docker build -t kubermatic-dl:latest . 这条命令使用 kubermatic-dl 镜像为你当前工作目录的代码创建了一个容器。使用sudo docker run -d -p 5000:5000 kubermatic-dl 命令检查你的容器可以在你的主机上正常运行。使用sudo docker ps -a 命令查看你本地容器的运行状态:将你的模型上传到 Docker Hub在向 Kubernetes 上部署模型前，你的镜像首先需要是公开可用的。你可以通过将你的模型上传到 Docker Hub 来将它公开。（如果你没有 Docker Hub 的账号，你需要先创建一个）在终端中登录 Docker Hub 账号：sudo docker login 给你的镜像打上标签，这样你的模型上传到 Docker Hub 后也能拥有版本信息：sudo docker tag <your-image-id> <your-docker-hub-name>/<your-app-name> sudo docker push <your-docker-hub-name>/<your-app-name> 使用sudo docker images 命令检查你的镜像的 ID。部署你的模型到 Kubernetes 集群首先在 Kubermatic Kubernetes 平台创建一个项目, 然后根据 快速开始 创建一个 Kubernetes 集群。下载用于访问你的集群的 kubeconfig，将它放置在下载目录中，并记得设置合适的环境变量，使得你的环境能找到它：使用 kubectl 命令检查集群信息，例如，需要检查 kube-system 是否在你的集群正常启动了就可以使用命令 kubectl cluster-info为了在集群中运行容器，你需要创建一个部署用的配置文件（deployment.yaml），再运行 apply 命令将其应用于集群中：apiVersion: apps/v1 kind: Deployment metadata: name: kubermatic-dl-deployment spec: selector: matchLabels: app: kubermatic-dl replicas: 3 template: metadata: labels: app: kubermatic-dl spec: containers: - name: kubermatic-dl image: kubermatic00/kubermatic-dl:latest imagePullPolicy: Always ports: - containerPort: 8080 kubectl apply -f deployment.yaml` 为了将你的部署开放到公网环境，你需要一个能够给你的容器创建外部可达 IP 地址的服务：kubectl expose deployment kubermatic-dl-deployment --type=LoadBalancer --port 80 --target-port 5000` 就快大功告成了！首先检查你布署的服务的状态，然后通过 IP 请求的你图像识别 API：kubectl get service 最后根据你的外部 IP 使用以下两张图片对你的图像识别服务进行测试：总结在这篇教程中，你可以创建一个深度学习模型，并且使用 Flask 提供 REST API 服务。它介绍了如何将应用放在 Docker 容器中，如何将这个镜像上传到 Docker Hub 中，以及如何使用 Kubernetes 部署你的服务。只需几个简单的命令，你就可以使用 Kubermatic Kubernetes 平台部署该应用程序，并且开放服务给别人使用。via: https://opensource.com/article/20/9/deep-learning-model-kubernetes作者：Chaimaa Zyani 选题：lujun9972 译者：chunibyo-wly 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
人工智能结合开源硬件工具能够提升严重传染病疟疾的诊断。人工智能（AI）和开源工具、技术和框架是促进社会进步的强有力的结合。“健康就是财富”可能有点陈词滥调，但它却是非常准确的！在本篇文章，我们将测试 AI 是如何与低成本、有效、精确的开源深度学习方法结合起来一起用来检测致死的传染病疟疾。我既不是一个医生，也不是一个医疗保健研究者，我也绝不像他们那样合格，我只是对将 AI 应用到医疗保健研究感兴趣。在这片文章中我的想法是展示 AI 和开源解决方案如何帮助疟疾检测和减少人工劳动的方法。Python 和 TensorFlow: 一个构建开源深度学习方法的很棒的结合感谢 Python 的强大和像 TensorFlow 这样的深度学习框架，我们能够构建健壮的、大规模的、有效的深度学习方法。因为这些工具是自由和开源的，我们能够构建非常经济且易于被任何人采纳和使用的解决方案。让我们开始吧！项目动机疟疾是由疟原虫造成的致死的、有传染性的、蚊子传播的疾病，主要通过受感染的雌性按蚊叮咬传播。共有五种寄生虫能够引起疟疾，但是大多数病例是这两种类型造成的：恶性疟原虫和间日疟原虫。这个地图显示了疟疾在全球传播分布形势，尤其在热带地区，但疾病的性质和致命性是该项目的主要动机。如果一只受感染雌性蚊子叮咬了你，蚊子携带的寄生虫进入你的血液，并且开始破坏携带氧气的红细胞（RBC）。通常，疟疾的最初症状类似于流感病毒，在蚊子叮咬后，他们通常在几天或几周内发作。然而，这些致死的寄生虫可以在你的身体里生存长达一年并且不会造成任何症状，延迟治疗可能造成并发症甚至死亡。因此，早期的检查能够挽救生命。世界健康组织（WHO）的疟疾实情表明，世界近乎一半的人口面临疟疾的风险，有超过 2 亿的疟疾病例，每年由于疟疾造成的死亡将近 40 万。这是使疟疾检测和诊断快速、简单和有效的一个动机。检测疟疾的方法有几种方法能够用来检测和诊断疟疾。该文中的项目就是基于 Rajaraman, et al. 的论文：“预先训练的卷积神经网络作为特征提取器，用于改善薄血涂片图像中的疟疾寄生虫检测”介绍的一些方法，包含聚合酶链反应（PCR）和快速诊断测试（RDT）。这两种测试通常用于无法提供高质量显微镜服务的地方。标准的疟疾诊断通常是基于血液涂片工作流程的，根据 Carlos Ariza 的文章“Malaria Hero：一个更快诊断疟原虫的网络应用”，我从中了解到 Adrian Rosebrock 的“使用 Keras 的深度学习和医学图像分析”。我感激这些优秀的资源的作者，让我在疟原虫预防、诊断和治疗方面有了更多的想法。一个疟原虫检测的血涂片工作流程根据 WHO 方案，诊断通常包括对放大 100 倍的血涂片的集中检测。受过训练的人们手工计算在 5000 个细胞中有多少红细胞中包含疟原虫。正如上述解释中引用的 Rajaraman， et al. 的论文：厚血涂片有助于检测寄生虫的存在，而薄血涂片有助于识别引起感染的寄生虫种类（疾病控制和预防中心, 2012）。诊断准确性在很大程度上取决于诊断人的专业知识，并且可能受到观察者间差异和疾病流行/资源受限区域大规模诊断所造成的不利影响（Mitiku, Mengistu 和 Gelaw, 2003）。可替代的技术是使用聚合酶链反应（PCR）和快速诊断测试（RDT）；然而，PCR 分析受限于它的性能（Hommelsheim, et al., 2014），RDT 在疾病流行的地区成本效益低（Hawkes, Katsuva 和 Masumbuko, 2009）。因此，疟疾检测可能受益于使用机器学习的自动化。疟疾检测的深度学习人工诊断血涂片是一个繁重的手工过程，需要专业知识来分类和计数被寄生虫感染的和未感染的细胞。这个过程可能不能很好的规模化，尤其在那些专业人士不足的地区。在利用最先进的图像处理和分析技术提取人工选取特征和构建基于机器学习的分类模型方面取得了一些进展。然而，这些模型不能大规模推广，因为没有更多的数据用来训练，并且人工选取特征需要花费很长时间。深度学习模型，或者更具体地讲，卷积神经网络（CNN），已经被证明在各种计算机视觉任务中非常有效。（如果你想更多的了解关于 CNN 的背景知识，我推荐你阅读视觉识别的 CS2331n 卷积神经网络。）简单地讲，CNN 模型的关键层包含卷积和池化层，正如下图所示。一个典型的 CNN 架构卷积层从数据中学习空间层级模式，它是平移不变的，因此它们能够学习图像的不同方面。例如，第一个卷积层将学习小的和局部图案，例如边缘和角落，第二个卷积层将基于第一层的特征学习更大的图案，等等。这允许 CNN 自动化提取特征并且学习对于新数据点通用的有效的特征。池化层有助于下采样和减少尺寸。因此，CNN 有助于自动化和规模化的特征工程。同样，在模型末尾加上密集层允许我们执行像图像分类这样的任务。使用像 CNN 这样的深度学习模型自动的疟疾检测可能非常有效、便宜和具有规模性，尤其是迁移学习和预训练模型效果非常好，甚至在少量数据的约束下。Rajaraman, et al. 的论文在一个数据集上利用六个预训练模型在检测疟疾对比无感染样本获取到令人吃惊的 95.9% 的准确率。我们的重点是从头开始尝试一些简单的 CNN 模型和用一个预训练的训练模型使用迁移学习来查看我们能够从相同的数据集中得到什么。我们将使用开源工具和框架，包括 Python 和 TensorFlow，来构建我们的模型。数据集我们分析的数据来自 Lister Hill 国家生物医学交流中心（LHNCBC）的研究人员，该中心是国家医学图书馆（NLM）的一部分，他们细心收集和标记了公开可用的健康和受感染的血涂片图像的数据集。这些研究者已经开发了一个运行在 Android 智能手机的疟疾检测手机应用，连接到一个传统的光学显微镜。它们使用吉姆萨染液将 150 个受恶性疟原虫感染的和 50 个健康病人的薄血涂片染色，这些薄血涂片是在孟加拉的吉大港医学院附属医院收集和照相的。使用智能手机的内置相机获取每个显微镜视窗内的图像。这些图片由在泰国曼谷的马希多-牛津热带医学研究所的一个专家使用幻灯片阅读器标记的。让我们简要地查看一下数据集的结构。首先，我将安装一些基础的依赖（基于使用的操作系统）。我使用的是云上的带有一个 GPU 的基于 Debian 的操作系统，这样我能更快的运行我的模型。为了查看目录结构，我们必须使用 sudo apt install tree 安装 tree 及其依赖（如果我们没有安装的话）。我们有两个文件夹包含血细胞的图像，包括受感染的和健康的。我们通过输入可以获取关于图像总数更多的细节：import os import glob base_dir = os.path.join('./cell_images') infected_dir = os.path.join(base_dir,'Parasitized') healthy_dir = os.path.join(base_dir,'Uninfected') infected_files = glob.glob(infected_dir+'/*.png') healthy_files = glob.glob(healthy_dir+'/*.png') len(infected_files), len(healthy_files) # Output (13779, 13779)看起来我们有一个平衡的数据集，包含 13,779 张疟疾的和 13,779 张非疟疾的（健康的）血细胞图像。让我们根据这些构建数据帧，我们将用这些数据帧来构建我们的数据集。import numpy as np import pandas as pd np.random.seed(42) files_df = pd.DataFrame({ 'filename': infected_files + healthy_files, 'label': ['malaria'] * len(infected_files) + ['healthy'] * len(healthy_files) }).sample(frac=1, random_state=42).reset_index(drop=True) files_df.head()构建和了解图像数据集为了构建深度学习模型，我们需要训练数据，但是我们还需要使用不可见的数据测试模型的性能。相应的，我们将使用 60:10:30 的比例来划分用于训练、验证和测试的数据集。我们将在训练期间应用训练和验证数据集，并用测试数据集来检查模型的性能。from sklearn.model_selection import train_test_split from collections import Counter train_files, test_files, train_labels, test_labels = train_test_split(files_df['filename'].values, files_df['label'].values, test_size=0.3, random_state=42) train_files, val_files, train_labels, val_labels = train_test_split(train_files, train_labels, test_size=0.1, random_state=42) print(train_files.shape, val_files.shape, test_files.shape) print('Train:', Counter(train_labels), '\nVal:', Counter(val_labels), '\nTest:', Counter(test_labels)) # Output (17361,) (1929,) (8268,) Train: Counter({'healthy': 8734, 'malaria': 8627}) Val: Counter({'healthy': 970, 'malaria': 959}) Test: Counter({'malaria': 4193, 'healthy': 4075})这些图片尺寸并不相同，因为血涂片和细胞图像是基于人、测试方法、图片方向不同而不同的。让我们总结我们的训练数据集的统计信息来决定最佳的图像尺寸（牢记，我们根本不会碰测试数据集）。import cv2 from concurrent import futures import threading def get_img_shape_parallel(idx, img, total_imgs): if idx % 5000 == 0 or idx == (total_imgs - 1): print('{}: working on img num: {}'.format(threading.current_thread().name, idx)) return cv2.imread(img).shape ex = futures.ThreadPoolExecutor(max_workers=None) data_inp = [(idx, img, len(train_files)) for idx, img in enumerate(train_files)] print('Starting Img shape computation:') train_img_dims_map = ex.map(get_img_shape_parallel, [record[0] for record in data_inp], [record[1] for record in data_inp], [record[2] for record in data_inp]) train_img_dims = list(train_img_dims_map) print('Min Dimensions:', np.min(train_img_dims, axis=0)) print('Avg Dimensions:', np.mean(train_img_dims, axis=0)) print('Median Dimensions:', np.median(train_img_dims, axis=0)) print('Max Dimensions:', np.max(train_img_dims, axis=0)) # Output Starting Img shape computation: ThreadPoolExecutor-0_0: working on img num: 0 ThreadPoolExecutor-0_17: working on img num: 5000 ThreadPoolExecutor-0_15: working on img num: 10000 ThreadPoolExecutor-0_1: working on img num: 15000 ThreadPoolExecutor-0_7: working on img num: 17360 Min Dimensions: [46 46 3] Avg Dimensions: [132.77311215 132.45757733 3.] Median Dimensions: [130. 130. 3.] Max Dimensions: [385 394 3]我们应用并行处理来加速图像读取，并且基于汇总统计结果，我们将每幅图片的尺寸重新调整到 125x125 像素。让我们载入我们所有的图像并重新调整它们为这些固定尺寸。IMG_DIMS = (125, 125) def get_img_data_parallel(idx, img, total_imgs): if idx % 5000 == 0 or idx == (total_imgs - 1): print('{}: working on img num: {}'.format(threading.current_thread().name, idx)) img = cv2.imread(img) img = cv2.resize(img, dsize=IMG_DIMS, interpolation=cv2.INTER_CUBIC) img = np.array(img, dtype=np.float32) return img ex = futures.ThreadPoolExecutor(max_workers=None) train_data_inp = [(idx, img, len(train_files)) for idx, img in enumerate(train_files)] val_data_inp = [(idx, img, len(val_files)) for idx, img in enumerate(val_files)] test_data_inp = [(idx, img, len(test_files)) for idx, img in enumerate(test_files)] print('Loading Train Images:') train_data_map = ex.map(get_img_data_parallel, [record[0] for record in train_data_inp], [record[1] for record in train_data_inp], [record[2] for record in train_data_inp]) train_data = np.array(list(train_data_map)) print('\nLoading Validation Images:') val_data_map = ex.map(get_img_data_parallel, [record[0] for record in val_data_inp], [record[1] for record in val_data_inp], [record[2] for record in val_data_inp]) val_data = np.array(list(val_data_map)) print('\nLoading Test Images:') test_data_map = ex.map(get_img_data_parallel, [record[0] for record in test_data_inp], [record[1] for record in test_data_inp], [record[2] for record in test_data_inp]) test_data = np.array(list(test_data_map)) train_data.shape, val_data.shape, test_data.shape # Output Loading Train Images: ThreadPoolExecutor-1_0: working on img num: 0 ThreadPoolExecutor-1_12: working on img num: 5000 ThreadPoolExecutor-1_6: working on img num: 10000 ThreadPoolExecutor-1_10: working on img num: 15000 ThreadPoolExecutor-1_3: working on img num: 17360 Loading Validation Images: ThreadPoolExecutor-1_13: working on img num: 0 ThreadPoolExecutor-1_18: working on img num: 1928 Loading Test Images: ThreadPoolExecutor-1_5: working on img num: 0 ThreadPoolExecutor-1_19: working on img num: 5000 ThreadPoolExecutor-1_8: working on img num: 8267 ((17361, 125, 125, 3), (1929, 125, 125, 3), (8268, 125, 125, 3))我们再次应用并行处理来加速有关图像载入和重新调整大小的计算。最终，我们获得了所需尺寸的图片张量，正如前面的输出所示。我们现在查看一些血细胞图像样本，以对我们的数据有个印象。import matplotlib.pyplot as plt %matplotlib inline plt.figure(1 , figsize = (8 , 8)) n = 0 for i in range(16): n += 1 r = np.random.randint(0 , train_data.shape[0] , 1) plt.subplot(4 , 4 , n) plt.subplots_adjust(hspace = 0.5 , wspace = 0.5) plt.imshow(train_data[r[0]]/255.) plt.title('{}'.format(train_labels[r[0]])) plt.xticks([]) , plt.yticks([])基于这些样本图像，我们看到一些疟疾和健康细胞图像的细微不同。我们将使我们的深度学习模型试图在模型训练中学习这些模式。开始我们的模型训练前，我们必须建立一些基础的配置设置。BATCH_SIZE = 64 NUM_CLASSES = 2 EPOCHS = 25 INPUT_SHAPE = (125, 125, 3) train_imgs_scaled = train_data / 255. val_imgs_scaled = val_data / 255. # encode text category labels from sklearn.preprocessing import LabelEncoder le = LabelEncoder() le.fit(train_labels) train_labels_enc = le.transform(train_labels) val_labels_enc = le.transform(val_labels) print(train_labels[:6], train_labels_enc[:6]) # Output ['malaria' 'malaria' 'malaria' 'healthy' 'healthy' 'malaria'] [1 1 1 0 0 1]我们修复我们的图像尺寸、批量大小，和纪元，并编码我们的分类的类标签。TensorFlow 2.0 于 2019 年三月发布，这个练习是尝试它的完美理由。import tensorflow as tf # Load the TensorBoard notebook extension (optional) %load_ext tensorboard.notebook tf.random.set_seed(42) tf.__version__ # Output '2.0.0-alpha0'深度学习训练在模型训练阶段，我们将构建三个深度训练模型，使用我们的训练集训练，使用验证数据比较它们的性能。然后，我们保存这些模型并在之后的模型评估阶段使用它们。模型 1：从头开始的 CNN我们的第一个疟疾检测模型将从头开始构建和训练一个基础的 CNN。首先，让我们定义我们的模型架构，inp = tf.keras.layers.Input(shape=INPUT_SHAPE) conv1 = tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', padding='same')(inp) pool1 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv1) conv2 = tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same')(pool1) pool2 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv2) conv3 = tf.keras.layers.Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same')(pool2) pool3 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv3) flat = tf.keras.layers.Flatten()(pool3) hidden1 = tf.keras.layers.Dense(512, activation='relu')(flat) drop1 = tf.keras.layers.Dropout(rate=0.3)(hidden1) hidden2 = tf.keras.layers.Dense(512, activation='relu')(drop1) drop2 = tf.keras.layers.Dropout(rate=0.3)(hidden2) out = tf.keras.layers.Dense(1, activation='sigmoid')(drop2) model = tf.keras.Model(inputs=inp, outputs=out) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.summary() # Output Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 125, 125, 3)] 0 _________________________________________________________________ conv2d (Conv2D) (None, 125, 125, 32) 896 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 62, 62, 32) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 62, 62, 64) 18496 _________________________________________________________________ ... ... _________________________________________________________________ dense_1 (Dense) (None, 512) 262656 _________________________________________________________________ dropout_1 (Dropout) (None, 512) 0 _________________________________________________________________ dense_2 (Dense) (None, 1) 513 ================================================================= Total params: 15,102,529 Trainable params: 15,102,529 Non-trainable params: 0 _________________________________________________________________基于这些代码的架构，我们的 CNN 模型有三个卷积和一个池化层，其后是两个致密层，以及用于正则化的失活。让我们训练我们的模型。import datetime logdir = os.path.join('/home/dipanzan_sarkar/projects/tensorboard_logs', datetime.datetime.now().strftime("%Y%m%d-%H%M%S")) tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1) reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=2, min_lr=0.000001) callbacks = [reduce_lr, tensorboard_callback] history = model.fit(x=train_imgs_scaled, y=train_labels_enc, batch_size=BATCH_SIZE, epochs=EPOCHS, validation_data=(val_imgs_scaled, val_labels_enc), callbacks=callbacks, verbose=1) # Output Train on 17361 samples, validate on 1929 samples Epoch 1/25 17361/17361 [====] - 32s 2ms/sample - loss: 0.4373 - accuracy: 0.7814 - val_loss: 0.1834 - val_accuracy: 0.9393 Epoch 2/25 17361/17361 [====] - 30s 2ms/sample - loss: 0.1725 - accuracy: 0.9434 - val_loss: 0.1567 - val_accuracy: 0.9513 ... ... Epoch 24/25 17361/17361 [====] - 30s 2ms/sample - loss: 0.0036 - accuracy: 0.9993 - val_loss: 0.3693 - val_accuracy: 0.9565 Epoch 25/25 17361/17361 [====] - 30s 2ms/sample - loss: 0.0034 - accuracy: 0.9994 - val_loss: 0.3699 - val_accuracy: 0.9559我们获得了 95.6% 的验证精确率，这很好，尽管我们的模型看起来有些过拟合（通过查看我们的训练精确度，是 99.9%）。通过绘制训练和验证的精度和损失曲线，我们可以清楚地看到这一点。f, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4)) t = f.suptitle('Basic CNN Performance', fontsize=12) f.subplots_adjust(top=0.85, wspace=0.3) max_epoch = len(history.history['accuracy'])+1 epoch_list = list(range(1,max_epoch)) ax1.plot(epoch_list, history.history['accuracy'], label='Train Accuracy') ax1.plot(epoch_list, history.history['val_accuracy'], label='Validation Accuracy') ax1.set_xticks(np.arange(1, max_epoch, 5)) ax1.set_ylabel('Accuracy Value') ax1.set_xlabel('Epoch') ax1.set_title('Accuracy') l1 = ax1.legend(loc="best") ax2.plot(epoch_list, history.history['loss'], label='Train Loss') ax2.plot(epoch_list, history.history['val_loss'], label='Validation Loss') ax2.set_xticks(np.arange(1, max_epoch, 5)) ax2.set_ylabel('Loss Value') ax2.set_xlabel('Epoch') ax2.set_title('Loss') l2 = ax2.legend(loc="best")基础 CNN 学习曲线我们可以看在在第五个纪元，情况并没有改善很多。让我们保存这个模型用于将来的评估。model.save('basic_cnn.h5')深度迁移学习就像人类有与生俱来在不同任务间传输知识的能力一样，迁移学习允许我们利用从以前任务学到的知识用到新的相关的任务，即使在机器学习或深度学习的情况下也是如此。如果想深入探究迁移学习，你应该看我的文章“一个易于理解与现实应用一起学习深度学习中的迁移学习的指导实践”和我的书《Python 迁移学习实践》。在这篇实践中我们想要探索的想法是：在我们的问题背景下，我们能够利用一个预训练深度学习模型（在大数据集上训练的，像 ImageNet）通过应用和迁移知识来解决疟疾检测的问题吗？我们将应用两个最流行的深度迁移学习策略。预训练模型作为特征提取器微调的预训练模型我们将使用预训练的 VGG-19 深度训练模型（由剑桥大学的视觉几何组（VGG）开发）进行我们的实验。像 VGG-19 这样的预训练模型是在一个大的数据集（Imagenet）上使用了很多不同的图像分类训练的。因此，这个模型应该已经学习到了健壮的特征层级结构，相对于你的 CNN 模型学到的特征，是空间不变的、转动不变的、平移不变的。因此，这个模型，已经从百万幅图片中学习到了一个好的特征显示，对于像疟疾检测这样的计算机视觉问题，可以作为一个好的合适新图像的特征提取器。在我们的问题中发挥迁移学习的能力之前，让我们先讨论 VGG-19 模型。理解 VGG-19 模型VGG-19 模型是一个构建在 ImageNet 数据库之上的 19 层（卷积和全连接的）的深度学习网络，ImageNet 数据库为了图像识别和分类的目的而开发。该模型是由 Karen Simonyan 和 Andrew Zisserman 构建的，在他们的论文“大规模图像识别的非常深的卷积网络”中进行了描述。VGG-19 的架构模型是：你可以看到我们总共有 16 个使用 3x3 卷积过滤器的卷积层，与最大的池化层来下采样，和由 4096 个单元组成的两个全连接的隐藏层，每个隐藏层之后跟随一个由 1000 个单元组成的致密层，每个单元代表 ImageNet 数据库中的一个分类。我们不需要最后三层，因为我们将使用我们自己的全连接致密层来预测疟疾。我们更关心前五个块，因此我们可以利用 VGG 模型作为一个有效的特征提取器。我们将使用模型之一作为一个简单的特征提取器，通过冻结五个卷积块的方式来确保它们的位权在每个纪元后不会更新。对于最后一个模型，我们会对 VGG 模型进行微调，我们会解冻最后两个块（第 4 和第 5）因此当我们训练我们的模型时，它们的位权在每个时期（每批数据）被更新。模型 2：预训练的模型作为一个特征提取器为了构建这个模型，我们将利用 TensorFlow 载入 VGG-19 模型并冻结卷积块，因此我们能够将它们用作特征提取器。我们在末尾插入我们自己的致密层来执行分类任务。vgg = tf.keras.applications.vgg19.VGG19(include_top=False, weights='imagenet', input_shape=INPUT_SHAPE) vgg.trainable = False # Freeze the layers for layer in vgg.layers: layer.trainable = False base_vgg = vgg base_out = base_vgg.output pool_out = tf.keras.layers.Flatten()(base_out) hidden1 = tf.keras.layers.Dense(512, activation='relu')(pool_out) drop1 = tf.keras.layers.Dropout(rate=0.3)(hidden1) hidden2 = tf.keras.layers.Dense(512, activation='relu')(drop1) drop2 = tf.keras.layers.Dropout(rate=0.3)(hidden2) out = tf.keras.layers.Dense(1, activation='sigmoid')(drop2) model = tf.keras.Model(inputs=base_vgg.input, outputs=out) model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=1e-4), loss='binary_crossentropy', metrics=['accuracy']) model.summary() # Output Model: "model_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_2 (InputLayer) [(None, 125, 125, 3)] 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 125, 125, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 125, 125, 64) 36928 _________________________________________________________________ ... ... _________________________________________________________________ block5_pool (MaxPooling2D) (None, 3, 3, 512) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 4608) 0 _________________________________________________________________ dense_3 (Dense) (None, 512) 2359808 _________________________________________________________________ dropout_2 (Dropout) (None, 512) 0 _________________________________________________________________ dense_4 (Dense) (None, 512) 262656 _________________________________________________________________ dropout_3 (Dropout) (None, 512) 0 _________________________________________________________________ dense_5 (Dense) (None, 1) 513 ================================================================= Total params: 22,647,361 Trainable params: 2,622,977 Non-trainable params: 20,024,384 _________________________________________________________________从整个输出可以明显看出，在我们的模型中我们有了很多层，我们将只利用 VGG-19 模型的冻结层作为特征提取器。你可以使用下列代码来验证我们的模型有多少层是实际可训练的，以及我们的网络中总共存在多少层。print("Total Layers:", len(model.layers)) print("Total trainable layers:", sum([1 for l in model.layers if l.trainable])) # Output Total Layers: 28 Total trainable layers: 6我们将使用和我们之前的模型相似的配置和回调来训练我们的模型。参考我的 GitHub 仓库以获取训练模型的完整代码。我们观察下列图表，以显示模型精确度和损失曲线。冻结的预训练的 CNN 的学习曲线这表明我们的模型没有像我们的基础 CNN 模型那样过拟合，但是性能有点不如我们的基础的 CNN 模型。让我们保存这个模型，以备将来的评估。model.save('vgg_frozen.h5')模型 3：使用图像增强来微调预训练的模型在我们的最后一个模型中，我们将在预定义好的 VGG-19 模型的最后两个块中微调层的位权。我们同样引入了图像增强的概念。图像增强背后的想法和其名字一样。我们从训练数据集中载入现有图像，并且应用转换操作，例如旋转、裁剪、转换、放大缩小等等，来产生新的、改变过的版本。由于这些随机转换，我们每次获取到的图像不一样。我们将应用 tf.keras 中的一个名为 ImageDataGenerator 的优秀工具来帮助构建图像增强器。train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255, zoom_range=0.05, rotation_range=25, width_shift_range=0.05, height_shift_range=0.05, shear_range=0.05, horizontal_flip=True, fill_mode='nearest') val_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255) # build image augmentation generators train_generator = train_datagen.flow(train_data, train_labels_enc, batch_size=BATCH_SIZE, shuffle=True) val_generator = val_datagen.flow(val_data, val_labels_enc, batch_size=BATCH_SIZE, shuffle=False)我们不会对我们的验证数据集应用任何转换（除非是调整大小，因为这是必须的），因为我们将使用它评估每个纪元的模型性能。对于在传输学习环境中的图像增强的详细解释，请随时查看我上面引用的文章。让我们从一批图像增强转换中查看一些样本结果。img_id = 0 sample_generator = train_datagen.flow(train_data[img_id:img_id+1], train_labels[img_id:img_id+1], batch_size=1) sample = [next(sample_generator) for i in range(0,5)] fig, ax = plt.subplots(1,5, figsize=(16, 6)) print('Labels:', [item[1][0] for item in sample]) l = [ax[i].imshow(sample[i][0][0]) for i in range(0,5)]你可以清晰的看到与之前的输出的我们图像的轻微变化。我们现在构建我们的学习模型，确保 VGG-19 模型的最后两块是可以训练的。vgg = tf.keras.applications.vgg19.VGG19(include_top=False, weights='imagenet', input_shape=INPUT_SHAPE) # Freeze the layers vgg.trainable = True set_trainable = False for layer in vgg.layers: if layer.name in ['block5_conv1', 'block4_conv1']: set_trainable = True if set_trainable: layer.trainable = True else: layer.trainable = False base_vgg = vgg base_out = base_vgg.output pool_out = tf.keras.layers.Flatten()(base_out) hidden1 = tf.keras.layers.Dense(512, activation='relu')(pool_out) drop1 = tf.keras.layers.Dropout(rate=0.3)(hidden1) hidden2 = tf.keras.layers.Dense(512, activation='relu')(drop1) drop2 = tf.keras.layers.Dropout(rate=0.3)(hidden2) out = tf.keras.layers.Dense(1, activation='sigmoid')(drop2) model = tf.keras.Model(inputs=base_vgg.input, outputs=out) model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=1e-5), loss='binary_crossentropy', metrics=['accuracy']) print("Total Layers:", len(model.layers)) print("Total trainable layers:", sum([1 for l in model.layers if l.trainable])) # Output Total Layers: 28 Total trainable layers: 16在我们的模型中我们降低了学习率，因为我们不想在微调的时候对预训练的层做大的位权更新。模型的训练过程可能有轻微的不同，因为我们使用了数据生成器，因此我们将应用 fit_generator(...) 函数。tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1) reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=2, min_lr=0.000001) callbacks = [reduce_lr, tensorboard_callback] train_steps_per_epoch = train_generator.n // train_generator.batch_size val_steps_per_epoch = val_generator.n // val_generator.batch_size history = model.fit_generator(train_generator, steps_per_epoch=train_steps_per_epoch, epochs=EPOCHS, validation_data=val_generator, validation_steps=val_steps_per_epoch, verbose=1) # Output Epoch 1/25 271/271 [====] - 133s 489ms/step - loss: 0.2267 - accuracy: 0.9117 - val_loss: 0.1414 - val_accuracy: 0.9531 Epoch 2/25 271/271 [====] - 129s 475ms/step - loss: 0.1399 - accuracy: 0.9552 - val_loss: 0.1292 - val_accuracy: 0.9589 ... ... Epoch 24/25 271/271 [====] - 128s 473ms/step - loss: 0.0815 - accuracy: 0.9727 - val_loss: 0.1466 - val_accuracy: 0.9682 Epoch 25/25 271/271 [====] - 128s 473ms/step - loss: 0.0792 - accuracy: 0.9729 - val_loss: 0.1127 - val_accuracy: 0.9641这看起来是我们的最好的模型。它给了我们近乎 96.5% 的验证精确率，基于训练精度，它看起来不像我们的第一个模型那样过拟合。这可以通过下列的学习曲线验证。微调过的预训练 CNN 的学习曲线让我们保存这个模型，因此我们能够在测试集上使用。model.save('vgg_finetuned.h5')这就完成了我们的模型训练阶段。现在我们准备好了在测试集上测试我们模型的性能。深度学习模型性能评估我们将通过在我们的测试集上做预测来评估我们在训练阶段构建的三个模型，因为仅仅验证是不够的！我们同样构建了一个检测工具模块叫做 model_evaluation_utils，我们可以使用相关分类指标用来评估使用我们深度学习模型的性能。第一步是扩展我们的数据集。test_imgs_scaled = test_data / 255. test_imgs_scaled.shape, test_labels.shape # Output ((8268, 125, 125, 3), (8268,))下一步包括载入我们保存的深度学习模型，在测试集上预测。# Load Saved Deep Learning Models basic_cnn = tf.keras.models.load_model('./basic_cnn.h5') vgg_frz = tf.keras.models.load_model('./vgg_frozen.h5') vgg_ft = tf.keras.models.load_model('./vgg_finetuned.h5') # Make Predictions on Test Data basic_cnn_preds = basic_cnn.predict(test_imgs_scaled, batch_size=512) vgg_frz_preds = vgg_frz.predict(test_imgs_scaled, batch_size=512) vgg_ft_preds = vgg_ft.predict(test_imgs_scaled, batch_size=512) basic_cnn_pred_labels = le.inverse_transform([1 if pred > 0.5 else 0 for pred in basic_cnn_preds.ravel()]) vgg_frz_pred_labels = le.inverse_transform([1 if pred > 0.5 else 0 for pred in vgg_frz_preds.ravel()]) vgg_ft_pred_labels = le.inverse_transform([1 if pred > 0.5 else 0 for pred in vgg_ft_preds.ravel()])下一步是应用我们的 model_evaluation_utils 模块根据相应分类指标来检查每个模块的性能。import model_evaluation_utils as meu import pandas as pd basic_cnn_metrics = meu.get_metrics(true_labels=test_labels, predicted_labels=basic_cnn_pred_labels) vgg_frz_metrics = meu.get_metrics(true_labels=test_labels, predicted_labels=vgg_frz_pred_labels) vgg_ft_metrics = meu.get_metrics(true_labels=test_labels, predicted_labels=vgg_ft_pred_labels) pd.DataFrame([basic_cnn_metrics, vgg_frz_metrics, vgg_ft_metrics], index=['Basic CNN', 'VGG-19 Frozen', 'VGG-19 Fine-tuned'])看起来我们的第三个模型在我们的测试集上执行的最好，给出了一个模型精确性为 96% 的 F1 得分，这非常好，与我们之前提到的研究论文和文章中的更复杂的模型相当。总结疟疾检测不是一个简单的过程，全球的合格人员的不足在病例诊断和治疗当中是一个严重的问题。我们研究了一个关于疟疾的有趣的真实世界的医学影像案例。利用 AI 的、易于构建的、开源的技术在检测疟疾方面可以为我们提供最先进的精确性，因此使 AI 具有社会效益。我鼓励你查看这篇文章中提到的文章和研究论文，没有它们，我就不能形成概念并写出来。如果你对运行和采纳这些技术感兴趣，本篇文章所有的代码都可以在我的 GitHub 仓库获得。记得从官方网站下载数据。让我们希望在健康医疗方面更多的采纳开源的 AI 能力，使它在世界范围内变得更便宜、更易用。via: https://opensource.com/article/19/4/detecting-malaria-deep-learning作者：Dipanjan (DJ) Sarkar 选题：lujun9972 译者：warmfrog 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
深度学习战争：Facebook 支持的 PyTorch 与 Google 的 TensorFlow
有一个令人震惊的事实，即人工智能和机器学习的工具和技术在近期迅速兴起。深度学习，或者说“注射了激素的机器学习”，数据科学家和机器学习专家在这个领域有数不胜数等可用的库和框架。很多这样的框架都是基于 Python 的，因为 Python 是一个更通用，相对简单的语言。Theano、Keras、 TensorFlow 是几个基于 Python 构建的流行的深度学习库，目的是使机器学习专家更轻松。Google 的 TensorFlow 是一个被广泛使用的机器学习和深度学习框架。 TensorFlow 开源于 2015 年，得到了机器学习专家社区的广泛支持，TensorFlow 已经迅速成长为许多机构根据其机器学习和深度学习等需求而选择的框架。 另一方面，PyTorch 是由 Facebook 最近开发的用于训练神经网络的 Python 包，改编自基于 Lua 的深度学习库 Torch。 PyTorch 是少数可用的深度学习框架之一，它使用 基于磁带的自动梯度系统 tape-based autograd system ，以快速和灵活的方式构建动态神经网络。在这篇文章中，我们将 PyTorch 与 TensorFlow 进行不同方面的比较。让我们开始吧！什么编程语言支持 PyTorch 和 TensorFlow？虽然主要是用 C++ 和 CUDA 编写的，但 TensorFlow 包含一个位于核心引擎上的 Python API，使得更便于被 Python 支持者 Pythonistas 使用。 除了 Python，它还包括 C++、Haskell、Java、Go 和 Rust 等其他 API，这意味着开发人员可以用他们的首选语言进行编码。虽然 PyTorch 是一个 Python 软件包，但你也可以提供使用基本的 C/C++ 语言的 API 进行编码。 如果你习惯使用 Lua 编程语言，你也可以使用 Torch API 在 PyTorch 中编写神经网络模型。PyTorch 和 TensorFlow 有多么易于使用？如果将 TensorFlow 作为一个独立的框架使用，它可能会有点复杂，并且会给深度学习模型的训练带来一些困难。 为了减少这种复杂性，可以使用位于 TensorFlow 复杂引擎之上的 Keras 封装，以简化深度学习模型的开发和训练。 TensorFlow 也支持 PyTorch 目前没有的分布式培训。 由于包含 Python API，TensorFlow 也可以在生产环境中使用，即可用于培训练和部署企业级深度学习模型。PyTorch 由于 Torch 的复杂用 Python 重写。 这使得 PyTorch 对于开发人员更为原生。 它有一个易于使用的框架，提供最大化的灵活和速度。 它还允许在训练过程中快速更改代码而不妨碍其性能。 如果你已经有了一些深度学习的经验，并且以前使用过 Torch，那么基于它的速度、效率和易用性，你会更喜欢 PyTorch。 PyTorch 包含定制的 GPU 分配器，这使得深度学习模型具有更高的内存效率。 由此，训练大型深度学习模型变得更容易。 因此，Pytorch 在 Facebook、Twitter、Salesforce 等大型组织广受欢迎。用 PyTorch 和 TensorFlow 训练深度学习模型PyTorch 和 TensorFlow 都可以用来建立和训练神经网络模型。TensorFlow 工作于 SCG（静态计算图）上，包括在模型开始执行之前定义静态图。 但是，一旦开始执行，在模型内的调整更改的唯一方法是使用 tf.session 和 tf.placeholder 张量。PyTorch 非常适合训练 RNN（递归神经网络），因为它们在 PyTorch 中比在 TensorFlow 中运行得更快。 它适用于 DCG（动态计算图），可以随时在模型中定义和更改。 在 DCG 中，每个模块可以单独调试，这使得神经网络的训练更简单。TensorFlow 最近提出了 TensorFlow Fold，这是一个旨在创建 TensorFlow 模型的库，用于处理结构化数据。 像 PyTorch 一样，它实现了 DCG，在 CPU 上提供高达 10 倍的计算速度，在 GPU 上提供超过 100 倍的计算速度！ 在 Dynamic Batching 的帮助下，你现在可以执行尺寸和结构都不相同的深度学习模型。GPU 和 CPU 优化的比较TensorFlow 的编译时间比 PyTorch 短，为构建真实世界的应用程序提供了灵活性。 它可以从 CPU、GPU、TPU、移动设备到 Raspberry Pi（物联网设备）等各种处理器上运行。另一方面，PyTorch 包括 张量 tensor 计算，可以使用 GPU 将深度神经网络模型加速到 50 倍或更多。 这些张量可以停留在 CPU 或 GPU 上。 CPU 和 GPU 都是独立的库， 无论神经网络大小如何，PyTorch 都可以高效地利用。社区支持TensorFlow 是当今最流行的深度学习框架之一，由此也给它带来了庞大的社区支持。 它有很好的文档和一套详细的在线教程。 TensorFlow 还包括许多预先训练过的模型，这些模型托管和提供于 GitHub。 这些模型提供给热衷于使用 TensorFlow 开发者和研究人员一些现成的材料来节省他们的时间和精力。另一方面，PyTorch 的社区相对较小，因为它最近才发展起来。 与 TensorFlow 相比，文档并不是很好，代码也不是很容易获得。 然而，PyTorch 确实允许个人与他人分享他们的预训练模型。PyTorch 和 TensorFlow —— 力量悬殊的故事就目前而言，由于各种原因，TensorFlow 显然比 PyTorch 更受青睐。TensorFlow 很大，经验丰富，最适合实际应用。 是大多数机器学习和深度学习专家明显的选择，因为它提供了大量的功能，最重要的是它在市场上的成熟应用。 它具有更好的社区支持以及多语言 API 可用。 它有一个很好的文档库，由于从准备到使用的代码使之易于生产。 因此，它更适合想要开始深度学习的人，或者希望开发深度学习模型的组织。虽然 PyTorch 相对较新，社区较小，但它速度快，效率高。 总之，它给你所有的优势在于 Python 的有用性和易用性。 由于其效率和速度，对于基于研究的小型项目来说，这是一个很好的选择。 如前所述，Facebook、Twitter 等公司正在使用 PyTorch 来训练深度学习模型。 但是，使用它尚未成为主流。 PyTorch 的潜力是显而易见的，但它还没有准备好去挑战这个 TensorFlow 野兽。 然而，考虑到它的增长，PyTorch 进一步优化并提供更多功能的日子并不遥远，直到与 TensorFlow可以 比较。作者： Savia Lobo，非常喜欢数据科学。 喜欢更新世界各地的科技事件。 喜欢歌唱和创作歌曲。 相信才智上的艺术。via: https://datahub.packtpub.com/deep-learning/dl-wars-pytorch-vs-tensorflow/作者：Savia Lobo 译者：Wuod3n 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
AWS 最近成为了加入深度学习社区的 开放神经网络交换 Open Neural Network Exchange （ONNX）协作的技术公司，最近在 无障碍和可互操作 frictionless and interoperable 的环境中推出了高级人工智能。由 Facebook 和微软领头了该协作。作为该合作的一部分，AWS 开源其深度学习框架 Python 软件包 ONNX-MXNet，该框架提供了跨多种语言的编程接口（API），包括 Python、Scala 和开源统计软件 R。AWS 深度学习工程经理 Hagay Lupesko 和软件开发人员 Roshani Nagmote 上周在一篇帖子中写道，ONNX 格式将帮助开发人员构建和训练其它框架的模型，包括 PyTorch、Microsoft Cognitive Toolkit 或 Caffe2。它可以让开发人员将这些模型导入 MXNet，并运行它们进行推理。对开发者的帮助今年夏天，Facebook 和微软推出了 ONNX，以支持共享模式的互操作性，来促进 AI 的发展。微软提交了其 Cognitive Toolkit、Caffe2 和 PyTorch 来支持 ONNX。微软表示：Cognitive Toolkit 和其他框架使开发人员更容易构建和运行计算图以表达神经网络。ONNX 代码和文档的初始版本已经放到了 Github。AWS 和微软上个月宣布了在 Apache MXNet 上的一个新 Gluon 接口计划，该计划允许开发人员构建和训练深度学习模型。Tractica 的研究总监 Aditya Kaul 观察到：“Gluon 是他们试图与 Google 的 Tensorflow 竞争的合作伙伴关系的延伸”。他告诉 LinuxInsider，“谷歌在这点上的疏忽是非常明显的，但也说明了他们在市场上的主导地位。”Kaul 说：“甚至 Tensorflow 也是开源的，所以开源在这里并不是什么大事，但这归结到底是其他生态系统联手与谷歌竞争。”根据 AWS 的说法，本月早些时候，Apache MXNet 社区推出了 MXNet 的 0.12 版本，它扩展了 Gluon 的功能，以便进行新的尖端研究。它的新功能之一是变分 dropout，它允许开发人员使用 dropout 技术来缓解递归神经网络中的过拟合。AWS 指出：卷积 RNN、LSTM 网络和门控循环单元（GRU）允许使用基于时间的序列和空间维度对数据集进行建模。框架中立方式Tirias Research 的首席分析师 Paul Teich 说：“这看起来像是一个提供推理的好方法，而不管是什么框架生成的模型。”他告诉 LinuxInsider：“这基本上是一种框架中立的推理方式。”Teich 指出，像 AWS、微软等云提供商在客户的压力下可以在一个网络上进行训练，同时提供另一个网络，以推进人工智能。他说：“我认为这是这些供应商检查互操作性的一种基本方式。”Tractica 的 Kaul 指出：“框架互操作性是一件好事，这会帮助开发人员确保他们建立在 MXNet 或 Caffe 或 CNTK 上的模型可以互操作。”至于这种互操作性如何适用于现实世界，Teich 指出，诸如自然语言翻译或语音识别等技术将要求将 Alexa 的语音识别技术打包并交付给另一个开发人员的嵌入式环境。感谢开源ThinkStrategies 的总经理 Jeff Kaplan 表示：“尽管存在竞争差异，但这些公司都认识到他们在开源运动所带来的软件开发进步方面所取得的巨大成功。”他告诉 LinuxInsider：“开放式神经网络交换（ONNX）致力于在人工智能方面产生类似的优势和创新。”越来越多的大型科技公司已经宣布使用开源技术来加快 AI 协作开发的计划，以便创建更加统一的开发和研究平台。AT＆T 几周前宣布了与 TechMahindra 和 Linux 基金会合作推出 Acumos 项目的计划。该平台旨在开拓电信、媒体和技术方面的合作。via: https://www.linuxinsider.com/story/AWS-to-Help-Build-ONNX-Open-Source-AI-Platform-84971.html作者：David Jones 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
你可能在各种应用中听说过 机器学习 machine learning （ML），比如垃圾邮件过滤、光学字符识别（OCR）和计算机视觉。开启机器学习之旅是一个涉及多方面的漫长旅途。对于新手，有很多的书籍，有学术论文，有指导练习，有独立项目。在这些众多的选择里面，很容易迷失你最初想学习的目标。所以在今天的文章中，我会列出 7 个步骤（和 50 多个资源）帮助你开启这个令人兴奋的计算机科学领域的大门，并逐渐成为一个机器学习高手。请注意，这个资源列表并不详尽，只是为了让你入门。 除此之外，还有更多的资源。1、 学习必要的背景知识你可能还记得 DataCamp 网站上的学习数据科学这篇文章里面的信息图：数学和统计学是开始机器学习（ML）的关键。 基础可能看起来很容易，因为它只有三个主题。 但不要忘记这些实际上是三个广泛的话题。在这里需要记住两件非常重要的事情：首先，你一定会需要一些进一步的指导，以了解开始机器学习需要覆盖哪些知识点。其次，这些是你进一步学习的基础。 不要害怕花时间，有了这些知识你才能构建一切。第一点很简单：学习线性代数和统计学是个好主意。这两门知识是必须要理解的。但是在你学习的同时，也应该尝试学习诸如最优化和高等微积分等主题。当你越来越深入 ML 的时候，它们就能派上用场。如果是从零开始的，这里有一些入门指南可供参考：Khan 学院 对于初学者是非常好的资源，可以考虑学习他们的线性代数和微积分课程。在 麻省理工学院 OpenCourseWare 网站上学习线性代数 课程。Coursera course 网站上对描述统计学、概率论和推论统计学的介绍内容。统计学是学习 ML 的关键之一如果你更多喜欢阅读书籍，请参考以下内容： 线性代数及其应用 Linear Algebra and Its Applications 应用线性代数 Applied Linear Algebra 线性代数解决的 3000 个问题 3,000 Solved Problems in Linear Algebra 麻省理工学院在线教材然而，在大多数情况下，你已经对统计学和数学有了一个初步的了解。很有可能你已经浏览过上面列举的的那些资源。在这种情况下，诚实地回顾和评价你的知识是一个好主意，是否有一些领域是需要复习的，或者现在掌握的比较好的？如果你一切都准备好了，那么现在是时候使用 R 或者 Python 应用这些知识了。作为一个通用的指导方针，选择一门语言开始是个好主意。另外，你仍然可以将另一门语言加入到你的技能池里。为什么这些编程知识是必需的？嗯，你会看到上面列出的课程（或你在学校或大学学习的课程）将为你提供关于数学和统计学主题的更理论性的介绍（而不是应用性的）。 然而，ML 非常便于应用，你需要能够应用你所学到的所有主题。 所以最好再次复习一遍之前的材料，但是这次需要付诸应用。如果你想掌握 R 和 Python 的基础，可以看以下课程：DataCamp 上关于 Python 或者 R 的介绍性课程： Python 语言数据科学介绍 或者 R 语言编程介绍。Edx 上关于 Python 或者 R 的介绍性课程： Python 语言数据科学介绍 和 R 语言数据科学介绍。还有很多其他免费的课程。查看 Coursera 或者 Codeacademy 了解更多。当你打牢基础知识后，请查看 DataCamp 上的博客 Python 统计学：40+ 数据科学资源。 这篇文章提供了统计学方面的 40 多个资源，这些资源都是你开始数据科学（以及 ML）需要学习的。还要确保你查看了关于向量和数组的 这篇 SciPy 教程文章，以及使用 Python 进行科学计算的研讨会。要使用 Python 和微积分进行实践，你可以了解下 SymPy 软件包。2、 不要害怕在 ML 的“理论”上浪费时间很多人并不会花很多精力去浏览理论材料，因为理论是枯燥的、无聊的。但从长远来看，在理论知识上投入时间是至关重要的、非常值得的。 你将会更好地了解机器学习的新进展，也能和背景知识结合起来。 这将有助于你保持学习积极性。此外，理论并不会多无聊。 正如你在介绍中所看到的，你可以借助非常多的资料深入学习。书籍是吸收理论知识的最佳途径之一。 它们可以让你停下来想一会儿。 当然，看书是一件非常平静的事情，可能不符合你的学习风格。 不过，请尝试阅读下列书籍，看看它是否适合你： 机器学习教程 Machine Learning textbook ， Tom Mitchell 著，书可能比较旧，但是却很经典。这本书很好的解释介绍了机器学习中最重要的课题，步骤详尽，逐层深入。 机器学习: 使数据有意义的算法艺术和科学 Machine Learning: The Art and Science of Algorithms that Make Sense of Data （你可以在这里看到这本书的幻灯片版本）：这本书对初学者来说非常棒。 里面讨论了许多实践中的应用程序，其中有一些是在 Tom Mitchell 的书中缺少的。 机器学习之向往 Machine Learning Yearning ：这本书由 吴恩达 Andrew Ng 编写的，仍未完本，但对于那些正在学习 ML 的学生来说，这一定是很好的参考资料。 算法与数据结构 Algorithms and Data Structures 由 Jurg Nievergelt 和 Klaus Hinrichs 著。也可以参阅 Matthew North 的 面向大众的数据挖掘 Data Mining for the Masses 。 你会发现这本书引导你完成一些最困难的主题。 机器学习介绍 Introduction to Machine Learning 由 Alex Smola 和 S.V.N. Vishwanathan 著。花些时间看书并研究其中涵盖的资料视频和慕课对于喜欢边听边看来学习的人来说非常棒。 慕课和视频非常的多，多到可能你都很难找到适合你的。 下面列出了最知名的几个：这个著名的机器学习慕课，是 吴恩达 Andrew Ng 讲的，介绍了机器学习及其理论。 别担心，这个慕课讲的非常好，一步一步深入，所以对初学者来说非常适用。麻省理工学院 Open Courseware 的 6034 课程的节目清单，已经有点前沿了。 在你开始本系列之前，你需要做一些 ML 理论方面的准备工作，但是你不会后悔的。在这一点上，重要的是要将各种独立的技术融会贯通，形成整体的结构图。 首先了解关键的概念： 监督学习 supervised learning 和 无监督学习 unsupervised learning 的区别、分类和回归等。 手动（书面）练习可以派上用场，能帮你了解算法是如何工作的以及如何应用这些算法。 在大学课程里你经常会找到一些书面练习，可以看看波特兰州立大学的 ML 课程。3、 开始动手通过看书和看视频了解理论和算法都非常好，但是需要超越这一阶段，就要开始做一些练习。你要学着去实现这些算法，应用学到的理论。首先，有很多介绍 Python 和 R 方面的机器学习的基础知识。当然最好的方法就是使用交互式教程：Python 机器学习：Scikit-Learn 教程，在这篇教程里面，你可以学到使用 Scikit-Learn 构建模型的 KMeans 和支持向量机（SVM）相关的知名算法。给初学者的 R 语言机器学习教程 用 R 中的类和 caret 包介绍机器学习。Keras 教程：Python 深度学习[25 涵盖了如何一步一步的为分类和回归任务构建多层感知器（MLP）。还请查看以下静态的（非互动的）教程，这些需要你在 IDE 中操作：循序渐进：Python 机器学习： 一步一步地学习 Scikit-Learn。循序渐进：使用 Keras 开发你的第一个神经网络： 按这个教程一步一步地使用 Keras 开发你的第一个神经网络。你可以考虑看更多的教程，但是机器学习精要这篇教程是非常好的。除了教程之外，还有一些课程。参加课程可以帮助你系统性地应用学到的概念。 经验丰富的导师很有帮助。 以下是 Python 和机器学习的一些互动课程：用 scikit-learn 做监督学习： 学习如何构建预测模型，调整参数，并预测在未知数据上执行的效果。你将使用 Scikit-Learn 操作真实世界的数据集。用 Python 做无监督学习： 展示给你如何从未标记的数据集进行聚类、转换、可视化和提取关键信息。 在课程结束时，还会构建一个推荐系统。Python 深度学习： 你将获得如何使用 Keras 2.0 进行深度学习的实践知识，Keras 2.0 是前沿的 Python 深度学习库 Keras 的最新版本。在 Python 中应用机器学习： 将学习者引入到机器学习实践中，更多地关注技术和方法，而不是这些方法背后的统计学知识。理论学习之后，花点时间来应用你所学到的知识。对于那些正在学习 R 语言机器学习的人，还有这些互动课程：机器学习介绍 可以让你宏观了解机器学习学科最常见的技术和应用，还可以更多地了解不同机器学习模型的评估和训练。这门课程剩下的部分重点介绍三个最基本的机器学习任务： 分类、回归和聚类。R 语言无监督学习 ，用 R 语言从 ML 角度提供聚类和降维的基本介绍。 可以让你尽快获得数据的关键信息。实操机器学习涵盖了构建和应用预测功能的基本组成部分，其重点是实际应用。最后，还有很多书籍以偏向实践的方式介绍了 ML 主题。 如果你想借助书籍内容和 IDE 来学习，请查看这些书籍： Python 机器学习 Python Machine Learning Book ，Sebastian Raschka 著。 人工神经网络与深度学习导论：Python 应用实用指南 Introduction to Artificial Neural Networks and Deep Learning: A Practical Guide with Applications in Python ，Sebastian Raschka 著。 R 语言机器学习 Machine Learning with R ，Brett Lantz 著。4、 练习实践比使用 Python 进行练习和修改材料更重要。 这一步对我来说可能是最难的。 在做了一些练习后看看其他人是如何实现 ML 算法的。 然后，开始你自己的项目，阐述你对 ML 算法和理论的理解。最直接的方法之一就是将练习的规模做得更大些。 要做一个更大的练习，就需要你做更多的数据清理和功能工程。从 Kaggle 开始。 如果你需要额外的帮助来征服所谓的“数据恐惧”，请查看 Kaggle 的 Python 机器学习教程 和 Kaggle 的 R 语言机器学习教程。 这些将带给您快速的提升。此后，你也可以自己开始挑战。 查看这些网站，您可以在其中找到大量的 ML 数据集：UCI 机器学习仓库，用于机器学习的公开数据集 和 data.world。熟能生巧。5、 项目虽然做一些小的练习也不错，但是在最后，您需要做一个项目，可以在其中展示您对使用到的 ML 算法的理解。最好的练习是实现你自己的 ML 算法。 您可以在以下页面中阅读更多关于为什么您应该做这样的练习，以及您可以从中学到什么内容：为什么有许多先进的 API，比如 tensorflow，还需要自己手动实现机器学习的算法？为什么要从头开始实现机器学习算法？使用 Python 从头开始实现一个分类器，我能从中学到什么？接下来，您可以查看以下文章和仓库。 可以从中获得一些灵感，并且了解他们是如何实现 ML 算法的。如何实现机器学习算法从头开始学习机器学习从头开始学习机器学习算法开始时项目可能会很难，但是可以极大增加你的理解。6、 不要停止对 ML 的学习永远不能停止，即使你在这个领域工作了十年，总是有新的东西要学习，许多人都将会证实这一点。例如，ML 趋势，比如 深度学习 deep learning 现在就很受欢迎。你也可以专注于那些现在不怎么火，但是将来会火的话题上。如果你想了解更多，可以看看这个有趣的问题和答案。当你苦恼于掌握基础知识时，你最先想到的可能不是论文。 但是它们是你紧跟最新研究的一个途径。 论文并不适合刚刚开始学习的人，但是绝对适合高级人员。20 篇最新的机器学习和深度学习领域的顶级研究论文机器学习研究杂志优秀的深度学习论文机器学习的一些最好的研究论文和书籍其他技术也是需要考虑的。 但是当你刚开始学习时，不要担心这些。 例如，您可以专注于 Python 或 R 语言 （取决于你已经知道哪一个），并把它到你的技能池里。 你可以通过这篇文章来查找一些感兴趣的资源。如果您还想转向大数据，您可以考虑研究 Spark。 这里有一些有趣的资源：在 R 语言中使用 sparklyr 来了解 SparkSpark 数据科学与工程介绍 Apache SparkApache Spark 分布式机器学习用 Apache Spark 进行大数据分析初学者指南：用 Python 操作 Apache SparkPySpark RDD 速查表PySpark SQL 速查表其他编程语言，比如 Java、JavaScript、C 和 C++ 在 ML 中越来越重要。 从长远来看，您可以考虑将其中一种语言添加到学习列表中。 你可以使用这些博客文章来指导你选择：机器学习和数据科学最流行的编程语言机器学习和数据科学最流行的语言是...学无止境。7、 利用一切可以利用的资源机器学习是一个充满难度的话题，有时候可能会让你失去动力。 或者也许你觉得你需要点改变。 在这种情况下，请记住，有很多资源可以让你打消掉这种想法。 查看以下资源：播客是可以让你继续你的 ML 旅程，紧跟这个领域最新的发展的伟大资源：谈论机器数据怀疑论者线性化本周的机器学习及 AI机器学习 101当然，还有更多的播客。文档和软件包源代码是深入了解 ML 算法的实现的两种方法。 查看这些仓库：Scikit-Learn：知名的 Python ML 软件包Keras： Python 深度学习软件包caret： 非常受欢迎的用于分类和回归训练 R 软件包可视化是深入 ML 理论的最新也是最流行的方式之一。 它们对初学者来说非常棒，但对于更高级的学习者来说也是非常有趣的。 你肯定会被下面这些可视化资源所吸引，它们能让你更加了解 ML 的工作原理：机器学习的可视化介绍Distill 使 ML 研究清晰，动态和生动。如果你想玩下神经网络架构，可以看下 Tensorflow - 神经网络游乐场。更多的看这里：机器学习算法最佳的可视化方法是什么？学习中的一些变化更加能激励你。现在你可以开始了现在一切都取决于你自己了。学习机器学习是一个持续的过程，所以开始的越早就会越好。 运用你手边的一切工具开始吧。 祝你好运，并确保让我们知道你的进步。这篇文章是我基于 Quora 问题（小白该如何开始机器学习）给出的答案。作者简介：Karlijn Willems，数据科学记者via: https://medium.freecodecamp.org/how-machines-learn-a-practical-guide-203aae23cafb作者：Karlijn Willems 译者：Flowsnow 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出