TowardsDataScience 博客中文翻译 2019(一百六十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

利用深度学习对血细胞进行检测和分类(第 2 部分—训练和评估)

原文:https://towardsdatascience.com/detection-and-classification-of-blood-cells-with-deep-learning-part-2-training-and-evaluation-53381dbbc565?source=collection_archive---------18-----------------------

使用 Tensorflow 对象检测 API 处理 BCCD 数据集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练

我们现在终于为训练做好了准备。

# directory = ...YOUR_DIRECTORY/models/research/object_detection 
# type the following into Anaconda Promptpython train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config

大约 30 秒到 1 分钟后,训练过程应该开始。如果代码运行顺利,您应该会看到全局步数以及显示的每一步的损失。为了更好地监控训练,我们推出了 Tensorboard。

# directory = ...YOUR_DIRECTORY/models/research/object_detection 
# type the following into Anaconda Prompttensorboard --logdir=training

http://localhost:6006/ 复制到浏览器中,打开 Tensorboard。我对我的模型进行了大约 30 分钟的训练,但你的训练时间可能会根据你的系统配置而有所不同。

导出推理图

一旦你对训练损失感到满意,你可以在训练窗口中按 Ctrl + C 来中断训练。我们现在将导出推理图,以便可视化结果并对模型进行评估。

# directory = ...YOUR_DIRECTORY/models/research/object_detection 
# type the following into Anaconda Promptpython export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-**YOUR_CHECKPOINT_NUMBER(e.g.2859)** --output_directory inference_graph

应该在…YOUR _ DIRECTORY/models/research/object _ detection/inference _ graph 下创建推理图文件夹。

可视化结果

用 Jupyter 笔记本打开 models/research/object _ detection/文件夹中的object _ detection _ tutorial . ipynb笔记本。为了适应我们的情况,我对笔记本做了一些修改。请随意将编辑过的代码复制到相应的部分。我没有对下面没有讨论的部分做任何修改。

# Importsimport numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfilefrom distutils.version import StrictVersion
from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from matplotlib import patches
from PIL import Image# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")
from object_detection.utils import ops as utils_opsif StrictVersion(tf.__version__) < StrictVersion('1.12.0'):
  raise ImportError('Please upgrade your TensorFlow installation to v1.12.*.')

注释掉“变量”和“下载模型”部分。

#Load a (frozen) Tensorflow model into memoryPATH_TO_FROZEN_GRAPH = r"...**YOUR_DIRECTORY**\models\research\object_detection\inference_graph\frozen_inference_graph.pb"
detection_graph = tf.Graph()
with detection_graph.as_default():
    od_graph_def = tf.GraphDef()
    with tf.gfile.GFile(PATH_TO_FROZEN_GRAPH, 'rb') as fid:
        serialized_graph = fid.read()
        od_graph_def.ParseFromString(serialized_graph)
        tf.import_graph_def(od_graph_def, name='')

为了显示预测,我们需要对测试图像目录进行更改。我在 images 文件夹中创建了一个名为“test_samples”的单独文件夹,并选择了前 3 个图像(BloodImage_00333 到 00335)来运行测试。

# DetectionPATH_TO_TEST_IMAGES_DIR = r"...**YOUR_DIRECTORY**\models\research\object_detection\images\test_samples"
FILE_NAME = 'BloodImage_00{}.jpg'
FILE_NUMBER = range(333,336)
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, FILE_NAME.format(i)) for i in FILE_NUMBER]

我计划在地面实况旁边显示预测,因此我们需要参考“test_labels.csv”。

import pandas as pd
train = pd.read_csv(r"...**YOUR_DIRECTORY**\models\research\object_detection\images\test_labels.csv")
train.head()

下面的代码将在左边显示真实的图像,在右边显示预测。

for image_path in TEST_IMAGE_PATHS:
    image = Image.open(image_path)
  # the array based representation of the image will be used later in order to prepare the
  # result image with boxes and labels on it.
    image_np = load_image_into_numpy_array(image)
  # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
    image_np_expanded = np.expand_dims(image_np, axis=0)
  # Actual detection.
    output_dict = run_inference_for_single_image(image_np_expanded, detection_graph)
  # Visualization of the results of a detection.
    vis_util.visualize_boxes_and_labels_on_image_array(
        image_np,
        output_dict['detection_boxes'],
        output_dict['detection_classes'],
        output_dict['detection_scores'],
        category_index,
        instance_masks=output_dict.get('detection_masks'),
        use_normalized_coordinates=True,
        line_thickness=5)
    figure, (ax2, ax1) = plt.subplots(1, 2, figsize=(20,18))
# plots prediction
    ax1.set_title("Predictions (" + image_path[-20:] + ")", size=25)
    ax1.imshow(image_np)

# plots ground truth
    original = image
    ax2.set_title("Ground Truth (" + image_path[-20:] + ")", size=25)
    ax2.imshow(original)
    for _,row in train[train.filename == image_path[-20:]].iterrows():
        xmin = row.xmin
        xmax = row.xmax
        ymin = row.ymin
        ymax = row.ymaxwidth = xmax - xmin
        height = ymax - ymin# assign different color to different classes of objects
        if row["class"] == 'RBC':
            edgecolor = 'lawngreen'
            ax2.annotate('RBC', xy=(xmax-40,ymin+20), size=25)
        elif row["class"] == 'WBC':
            edgecolor = 'cyan'
            ax2.annotate('WBC', xy=(xmax-40,ymin+20), size=25)
        elif row["class"] == 'Platelets':
            edgecolor = 'aquamarine'
            ax2.annotate('Platelets', xy=(xmax-40,ymin+20), size=25)# add bounding boxes to the image
        rect = patches.Rectangle((xmin,ymin), width, height, edgecolor = edgecolor, facecolor = 'none', lw=6)
        ax2.add_patch(rect)

    plt.tight_layout()
    plt.show()

如果一切运行正常,您应该看到以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

仅通过视觉检查,该模型仅用 30 分钟的训练时间就表现良好。边界框很紧,它检测到了大部分血细胞。值得注意的是,该模型能够检测大(白细胞)和小(血小板)细胞。在某些情况下,它甚至检测出了未被标记的红细胞。这预示着该模型的可推广性。

评估

由于对预测的肉眼观察似乎令人满意,我们现在将使用 COCO 指标进行正式评估。

首先,我们必须 git clone COCO Python API。

# directory = ...YOUR_DIRECTORY/models/research
# type the following into Anaconda Promptgit clone https://github.com/cocodataset/cocoapi.git

这将下载“coco”文件夹,你应该在你的 _DIRECTORY/models/research 中看到它。

# directory = ...YOUR_DIRECTORY/models/research
# type the following into Anaconda Promptcd coco/PythonAPI

这将把目录更改为 YOUR _ DIRECTORY/models/research/coco/python API。在这个阶段,官方指令要求在 Anaconda 提示符下键入“make”。然而,我无法让它工作,在 github 和 stackoverflow 中搜索给了我解决方法。

首先,你需要按照这里“Jason246”的回答安装 Microsoft Visual C++构建工具:https://stack overflow . com/questions/48541801/Microsoft-Visual-C-14-0-is-required-get-it-with-Microsoft-Visual-C-Build-t

接下来,使用代码编辑器在您的 _ DIRECTORY/models/research/coco/python API 下打开“setup.py”文件,并进行以下更改。

# change thisext_modules = [
    Extension(
        'pycocotools._mask',
        sources=['../common/maskApi.c', 'pycocotools/_mask.pyx'],
        include_dirs = [np.get_include(), '../common'],
        **extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99']**,
    )
]# to thisext_modules = [
    Extension(
        'pycocotools._mask',
        sources=['../common/maskApi.c', 'pycocotools/_mask.pyx'],
        include_dirs = [np.get_include(), '../common'],
        **extra_compile_args={'gcc': ['/Qstd=c99']}**,
    )
]

接下来,运行“setup.py”文件。

# directory = ...YOUR_DIRECTORY/models/research/coco/PythonAPI
# type the following into Anaconda Promptpython3 setup.py build_ext --inplace

之后,将您的 _DIRECTORY/models/research/coco/PythonAPI 中的 pycocotools 文件夹复制到您的 _ DIRECTORY/models/research 中。

现在,转到您的 _ DIRECTORY/models/research/object_detection/legacy,将“eval.py”文件复制到“object _ detection”文件夹。我们终于可以运行评估脚本了。

# directory = ...YOUR_DIRECTORY/models/research/object_detection
# type the following into Anaconda Promptpython eval.py --logtostderr --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config --checkpoint_dir=training/ --eval_dir=eval/

这将把评估结果保存到 eval/目录中。就像训练一样,我们可以用 Tensorboard 来可视化评价。

# directory = ...YOUR_DIRECTORY/models/research/object_detection 
# type the following into Anaconda Prompttensorboard --logdir=eval

“eval.py”还将基于 COCO 指标生成一份报告。我的模型的结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

精度(阳性预测值)是真阳性与真阳性+假阳性的比例。回忆(敏感度)是真阳性与真阳性+假阴性的比例。

在宽松交集超过并集(IOU)为 0.5 的情况下, 96.7% 的模型的阳性预测是真阳性。当我们以 0.05 的步长对 IOU 0.5 至 0.95 的 APs 取平均值时,该百分比降低为 64.5% 。值得注意的是,该模型在较小的物体上表现不佳,对于小型和中型物体,AP 分别为 23.4%52.5%

从召回率来看,该模型平均检测到 71.9%的真阳性,对于小物体的性能较差。

总结

总之,我们使用 Tensorflow 目标检测 API 建立了一个模型,以在 BCCD 数据集中定位和分类 3 种类型的血细胞。未来的工作包括增加训练时间,提高小对象的性能,以及将模型扩展到其他数据集。

感谢阅读。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Sergei Akulich on Unsplash

使用 Pose2Seg 和 PyTorch 的免检测人体实例分割

原文:https://towardsdatascience.com/detection-free-human-instance-segmentation-using-pose2seg-and-pytorch-72f48dc4d23e?source=collection_archive---------10-----------------------

考虑到人类的独特性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Jezael Melgoza on Unsplash

近年来,由于现实生活应用的高需求,计算机视觉领域中与“人”相关的研究变得越来越活跃,其中之一就是实例分割。

图像实例分割的标准方法是首先执行对象检测,然后从检测包围盒中分割对象。最近,像 Mask R-CNN 这样的深度学习方法联合执行它们。然而,随着与人类相关的任务变得越来越普遍,如人类识别、跟踪等。有人可能想知道为什么“人类”这一类别的独特性没有被考虑进去。

“人类”类别的独特性可以由姿势骨架很好地定义。此外,与使用包围盒相比,人类姿态骨架可以用于更好地区分具有严重遮挡的情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Heavily occluded people are better separated using human pose than using bounding-box.

在这篇文章中,我将回顾“pose 2 seg:无检测人体实例分割”,它提出了一种新的基于姿势的人体实例分割框架,该框架基于人体姿势来分离实例。

在这篇文章中,我将介绍两件事:第一,实例分割任务的概述。二、“Pose2Seg”概述。

代码提示:
我们在这里分享代码。包括数据集和训练模型。跟着走!

1.什么是实例分段?

实例分割是一项任务,我们希望在像素级别识别每个对象。这意味着标签是类感知和实例感知的。例如,图 2(d)显示了绵羊 1、绵羊 2 等的单独标记。

实例分段被认为是常见用例中最具挑战性的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2. Common computer vision use cases

  • **分类:**此图中有一个人。图 2(a)
  • **目标检测:**在该图像中的这些位置有 5 只羊。图 2(b)
  • **语义分割:**有羊、人、狗像素。图 2©
  • 实例分割:在这些位置有 5 只不同的羊、1 个人和 1 只狗。图 2(d)

2.Pose2Seg:无检测人体实例分割

2.1 直觉

Pose2Seg 背后的主要思想是,虽然通用对象实例分割方法工作良好,但大多数都基于强大的对象检测基线。即首先生成大量的建议区域,然后使用非最大抑制(NMS)来移除冗余区域,如图 3 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3. (Left) Before non-max suppression, (Right) After Before non-max suppression

但是,当同一类别的两个对象有很大的重叠时,NMS 会将其中一个对象视为多余的建议区域,并将其删除。这意味着几乎所有的对象检测方法都不能处理大重叠的情况。

但是,当处理大多数“人类”类别时,它可以由姿势骨架很好地定义。如图 1 所示,人体姿态骨架更适合于区分两个纠缠在一起的人,因为它们可以提供比边界框更清晰的个人信息,如不同身体部位的位置和可见性。

自底向上方法的主要思想是首先检测所有人的每个身体部位的关键点,然后将这些部位分组或连接以形成人体姿态的几个实例,这使得可以分离具有大重叠的两个缠绕的人体实例

2.2 网络结构

总体网络结构如下图 4 所示。网络的输入是存在的所有人体实例的 RGB 图像和人体姿态。首先,使用主干网络提取图像的特征。然后,名为仿射对齐的模块用于根据人体姿态将感兴趣区域对齐到统一的大小(为了一致性)。此外,为每个人体实例生成骨架特征。

现在,RoI 和骨架特征被融合并被传递到称为 S egModule 的分割模块,以产生每个 RoI 的实例分割。最后,对估计矩阵进行仿射对齐操作,对每个实例进行反向对齐,得到最终的分割结果。

网络子模块将在下面的小节中详细描述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4. Overview of our network structure. (a) Affine-Align operation. (b) Skeleton features. © Structure of SegModule

2.3 仿射对齐操作

仿射对齐操作主要受快速 R-CNN 中呈现的 RoI 汇集和掩模 R-CNN 中的 RoI 对齐的启发。但是,虽然这些根据它们的包围盒来对齐人类,但是仿射对齐用于基于人类姿态来对齐。

为此,最频繁的人体姿态被离线存储,稍后在训练/推断时与每个输入姿态进行比较(参见下面的图 5)。这个想法是为每个估计的姿势选择最佳模板。这是通过估计输入姿态和模板之间的仿射变换矩阵 H 并选择产生最佳分数的一个来实现的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里 P_u 表示姿势模板,而 P 表示单人姿势估计。矩阵 H*是为最适合的每姿态模板选择的仿射变换。最后,将产生最佳分数的变换 H* 应用于图像或特征,并将其变换到期望的分辨率。关于仿射对齐操作还有更多细节,请参考论文了解更多细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5. Affine-Align operation

2.4 骨骼特征

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6. Skeleton feature module

图 6 显示了 s keleton 的特征。对于该任务,采用零件亲缘关系字段(PAF)。PAF 的输出是每个骨架的 2 通道矢量场图。PAF 用于表示人类姿势的骨架结构以及身体部位的部位置信度图,以强调身体部位关键点周围的那些区域的重要性。

2.5 秒模块

SegModule 是一个简单的编码器-解码器架构。一个主要的考虑是它的感受野。由于骨架特征是在对齐后引入的,因此 SegModule 需要有足够的感受野,以便不仅完全理解这些人工特征,而且学习它们与基础网络提取的图像特征之间的联系。因此,它是基于对准的 ROI 的分辨率来设计的。

网络从一个 7 × 7、步长为 2 的卷积层开始,其后是几个标准残差单元,以便为感兴趣区域提供足够大的感受野。然后,双线性上采样层用于恢复分辨率,另一个残差单元与 1 × 1 卷积层一起用于预测最终结果。这样一个具有 10 个剩余单元的结构可以实现大约 50 个像素的感受野,对应于 64 × 64 的对准尺寸。单元越少,网络的学习能力越差,单元越多,学习能力的提高越小。

3.实验和结果

Pose2Seg 在两个数据集上进行了评估:(1) OCHuman,这是本文提出的最大的验证数据集,主要针对严重遮挡的人;以及(2) COCOPersons(可可的人称类别),包含日常生活中最常见的场景。

该算法主要与常用的基于检测的实例分割框架 Mask-RCNN 进行比较。

在使用 OCHuman 数据集对遮挡数据的测试中,如表 1 所示,Pose2Seg 框架实现了比 Mask R-CNN 高近 50%的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Table 1. Performance on occlusion. All methods are trained on COCOPersons train split, and tested on OCHuman

在一般情况下的测试中,在 COCOPerson 验证集 Pose2Seg 上的实例分割任务获得了 0.582 AP(平均精度),而 Mask R-CNN 获得了 0.532。见表 2。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Table 2. Performance on general cases.

要从基于边框的框架中更好地理解 Pose2Seg 的优势,请参见下面的图 7。看看“开箱即用”的器官在 Mask R-CNN 中是如何不分段的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7. Pose2Seg method’s results vs. Mask R-CNN on occlusion cases. Bounding-boxes are generated using predicted masks for better visualization and comparison.

4.结论

如果你对源代码感兴趣,可以在我的 Pose2Seg GitHub 库中找到。

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。

在那之前,下一篇文章再见!😄

基于深度学习的混凝土结构表面裂缝检测

原文:https://towardsdatascience.com/detection-of-surface-cracks-in-concrete-structures-using-deep-learning-f8f85cd8ac8b?source=collection_archive---------6-----------------------

用数据做酷事!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Crack in Concrete Building

介绍

表面裂缝的检测是混凝土结构健康监测中的一项重要任务。如果裂缝发展并继续扩展,它们会减少有效的承载表面积,并且随着时间的推移会导致结构的失效。裂纹检测的手动过程费时费力,并且受到检查员主观判断的影响。在高层建筑和桥梁的情况下,人工检查也很难进行。在这篇博客中,我们使用深度学习来建立一个简单但非常准确的裂缝检测模型。此外,我们在真实世界数据上测试该模型,并且看到该模型在检测混凝土和非混凝土结构示例道路中的表面裂缝方面是准确的。代码在我的 Github 的链接上是开源的。

原文全文刊登在我的网站 这里

数据集

对于这个博客,我们使用公开可用的混凝土裂缝图像数据集。Ozgenel 和 Gonenc 在论文中公开了该数据集。

数据集由 20,000 幅有裂缝的混凝土结构图像和 20,000 幅无裂缝的图像组成。该数据集由 458 幅高分辨率图像(4032x3024 像素)生成。数据集中的每个图像都是 227 x 227 像素的 RGB 图像。一些有裂缝和无裂缝的样本图像如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sample images with cracks

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sample images without cracks

可以看到,数据集有各种各样的图像——不同颜色的石板,不同强度和形状的裂缝。

模型构建

针对这个问题,我们用 Pytorch 搭建一个卷积神经网络(CNN)。由于我们的图像数量有限,我们将使用预训练的网络作为起点,并使用图像增强来进一步提高准确性。图像增强允许我们进行变换,如垂直和水平翻转、旋转和亮度变化,从而显著增加样本并帮助模型泛化。

对于以下步骤,请跟随我在 Github 上的代码。

将输入数据混洗并分割成训练和赋值

下载的数据将有两个文件夹,一个用于正极,一个用于负极。我们需要把这个分成 train 和 val。下面的代码片段将为 train 和 val 创建新的文件夹,并将 85%的数据随机放入 train,将 rest 放入 val。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Split into train and val

应用变换

Pytorch 使应用数据转换变得容易,这可以增加训练数据并帮助模型一般化。我选择的变换是随机旋转、随机水平和垂直翻转以及随机颜色抖动。此外,每个通道除以 255,然后归一化。这有助于神经网络训练。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Transforms

预训练模型

我们使用在 ImageNet 上预先训练的 Resnet 50 模型来启动该模型。要了解更多关于 ResNet 模型的信息,请阅读我的博客。如下所示,ResNet50 模型由 5 个阶段组成,每个阶段都有一个卷积和单位块。每个卷积块有 3 个卷积层,每个单位块也有 3 个卷积层。ResNet-50 拥有超过 2300 万个可训练参数。我们将冻结所有这些权重和 2 个更完全连接的层,第一层在输出中有 128 个神经元,第二层在输出中有 2 个神经元,这是最终的预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ResNet50 Model

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ResNet model layers

如模型摘要所示,该模型具有 2300 万个不可训练参数和 262K 个可训练参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Model Parameters

我们使用 Adam 作为优化器,对模型进行 6 个时期的训练。

真实图像上的模型训练和预测

我们使用迁移学习,然后在训练数据集上训练模型,同时在验证集上测量损失和准确性。正如下面的损失和准确性数字所示,模型训练非常快。在第一个历元之后,训练准确率为 87%,验证准确率为 97%!。这就是迁移学习的力量。我们的最终模型的验证准确率为 98.4%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Model Training Stats

在真实世界图像上测试模型

现在最有趣的部分来了。是的,该模型对验证数据起作用,但我们想确保它也对来自互联网的看不见的数据起作用。为了测试这一点,我们随机拍摄了开裂的混凝土结构和路面裂缝的图像。这些图像比我们的训练图像大得多。请记住,该模型是在 227,227 像素的作物上训练的。我们现在将输入图像分成小块,并对其进行预测。如果模型预测有裂缝,我们就把补丁涂成红色(有裂缝),否则就把补丁涂成绿色。下面的代码片段可以做到这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Prediction on crops

该模型在以前从未见过的图像上表现得非常好。如下图所示,该模型能够通过处理图像上的数百个补丁来检测混凝土中非常长的裂缝。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Crack Detection on Concrete. Left-Original Image. Right-Red regions are predictions with crack and green regions are predictions of no crack

此外,我还在路面裂缝上测试了该模型。这个模型不是在路面上训练出来的,但它在挑选路面裂缝方面也做得很好!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Crack Detection on Roads. Left-Original Image. Right-Red regions are predictions with crack and green regions are predictions of no crack

更多真实世界的图像和模型预测在这个项目的 github link 上分享。

结论

这篇博客展示了使用深度学习和开源数据来构建现实世界的应用程序是多么容易。整个工作花了半天时间,并输出了一个实用的解决方案。我希望您亲自尝试这些代码,并在更多真实世界的图像上进行测试。

我对计算机视觉和深度学习充满热情。我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。请到 http://deeplearninganalytics.org/.来看看我们吧

你也可以在 https://medium.com/@priya.dwivedi看到我的其他作品

如果你有一个我们可以合作的项目,请通过我的网站或 info@deeplearninganalytics.org 联系我

参考

  • 2018—zgenel,f .,nenç Sorguç,a .“预训练卷积神经网络对建筑物裂缝检测的性能比较”,ISARC 2018,柏林。
  • 关于裂纹检测重要性的好论文—https://www.hindawi.com/journals/ace/2018/3924120/
  • 关于 Pytorch 中图像分类的好博客。博客中使用的几个代码片段来自这里。
  • 另一个关于 Pytorch 中图像分类的好博客。博客中使用的几个代码片段来自这里。

使用 Mann-Whitney U 检验确定两个分布是否显著不同

原文:https://towardsdatascience.com/determine-if-two-distributions-are-significantly-different-using-the-mann-whitney-u-test-1f79aa249ffb?source=collection_archive---------14-----------------------

使用 Python 的速成课程

如果您在日常工作中使用统计学,很可能在某个时候会遇到分布比较问题。比较分布以确定它们是否不同可以带来许多有价值的见解;特别是,如果与数据集相关联的不同属性导致不同的(统计上显著的)结果。

为了更好的说明这个问题,我们来做一个例子。我们将从通过 UCI 机器学习知识库获得的’成人’数据集中提取数据。这个存储库包含来自 1994 年美国人口普查的数据样本,包括个人工资(> $50K,<= 50K)、年龄、教育、婚姻状况、种族和性别等信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Snapshot of the UCI data set, uploaded directly into a pandas dataframe.

现在我们有了一些数据,让我们把它形象化。首先,我们使用 matplotlib hist()函数查看美国人口的年龄分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据上面的直方图,大部分样本集中在 30 至 40 岁之间,在 35 岁左右达到高峰,之后开始下降。

但是,当我们根据收入水平对数据进行分组时,年龄分布是如何变化的呢?让我们再次可视化分布,这一次将数据分成> 50K 美元和<=$50K categories:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Age Distribution, subset by salary level (<=$50K, >$50K)

As you can see in the visual above, the distribution changes when we subset the data by salary level. For the population making less than $50K a year, the distribution peaks around 25 years of age. For the population making greater than $50K a year, the peak occurs around 45 years of age. This intuitively makes sense, as people earlier on in their career make less money than those later on, who are more established.

Now that we’ve graphed the different age distributions based on salary, is there a way to statistically prove that the two differ? Yes — using the Mann-Whitney U Test.

So, what does the Mann-Whitney U Test do exactly?

The Mann-Whitney U Test is a null hypothesis test, used to detect differences between two independent data sets. The test is specifically for non-parametric distributions, which do not assume a specific distribution for a set of data. Because of this, the Mann-Whitney U Test can be applied to any distribution, whether it is Gaussian or not.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example of a non-parametric distribution, which doesn’t follow a standard Gaussian distribution (see line as example). Image courtesy of https://www.statistixl.com/features/nonparametric-tests/ .

Specifically, the null hypothesis of the Mann-Whitney U Test states that the distributions of two data sets are identical. If the null hypothesis is correct, there is a 50 percent chance that an arbitrarily selected value in one distribution is greater than another arbitrarily selected value in the second distribution ( 2

与 Mann-Whitney U 检验相关的检验统计量定义为 U,其中 U 是 U1 和 U2 两个值中较小的一个,通过以下方程组( 3 )定义:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 R1 指的是第一组的等级总和,而 R2 指的是第二组的等级总和。n1 和 n2 分别指第一组和第二组的样本总体。

有关如何计算 U 的分步说明,请查看以下链接,该链接涵盖非参数测试,可通过波士顿大学公共卫生学院获得:http://SPH web . bumc . bu . edu/otlt/mph-modules/bs/bs 704 _ nonparametric/bs 704 _ nonparametric 4 . html

对数据应用曼-惠特尼 U 检验

对分布应用 Mann-Whitney U 检验很简单,只需使用 scipy.stats 包中的 mannwhitneyu()函数。我们应用代码,比较两种分布,如下所示:

我们收到以下测试输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个输出,即 U 统计量,在上一节中被定义为 Mann-Whitney U 检验的检验统计量 U。使用双尾测试表解释 U 统计量,该表包含 U 的临界值。为了拒绝α=0.05 的零假设,从测试中获得的 U 必须低于测试表中的 U 临界值。

当两个样本量都很大时,u 往往很大。这就解释了为什么本例中的 u 统计量(61203011.5)如此之大。

第二个 Python 输出是与测试相关联的 p 值。p 值越低,反对零假设的证据越强。根据一般经验,当 p 值低于 0.05 时,可以拒绝零假设。这个具体例子的 p 值非常低,以至于记录为 0,因此我们可以明确拒绝零假设。这一结果从统计学意义上证实了年收入超过 5 万美元的人的年龄分布不同于年收入低于 5 万美元的人的年龄分布。

我的曼-惠特尼 U 检验教程到此结束。本教程的完整 Python 代码可以在下面的 Github repo 中找到:【https://github.com/kperry2215/mann_whitney_comparison

另外,看看我的一些其他数据科学教程:

[## 使用 Python - Tech Rando 中的 AutoML 自动调整和选择 ML 模型

在同一数据集上测试不同的 ML 方法以评估模型性能可能是一项单调乏味的任务。此外…

techrando.com](https://techrando.com/2019/10/21/automate-your-ml-model-tuning-and-selection-a-review-of-different-python-automl-packages/) [## 时间序列中离群点检测的无监督机器学习方法

在这篇文章中,我将介绍一些我最喜欢的检测时间序列数据中异常值的方法。有许多不同的…

techrando.com](https://techrando.com/2019/08/23/unsupervised-machine-learning-approaches-for-outlier-detection-in-time-series/) [## 使用 Python - Tech Rando 进行变化点检测简介

我的很多工作都大量涉及时间序列分析。我使用的一个很棒但不太为人所知的算法是…

techrando.com](https://techrando.com/2019/08/14/a-brief-introduction-to-change-point-detection-using-python/)

来源

  1. https://www.statistixl.com/features/nonparametric-tests/
  2. https://www . graph pad . com/guides/prism/7/statistics/how _ the _ Mann-Whitney _ test _ works . htm?toc=0 &打印窗口
  3. http://SPH web . bumc . bu . edu/otlt/mph-modules/bs/bs 704 _ nonparametric/bs 704 _ nonparametric 4 . html

原载于 2019 年 11 月 21 日 https://techrando.com**的

使用 Reddit 情绪分析确定总统支持率

原文:https://towardsdatascience.com/determining-presidential-approval-rating-using-reddit-sentiment-analysis-7912fdb5fcc7?source=collection_archive---------12-----------------------

NLP 调查 Reddit 的聚合情绪如何预测美国总统的支持率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在过去的一个学期里,我和其他 5 名杜克大学的本科生一起从各种子数据中提取信息,以预测和确定总统的支持率。在 Reddit 上,有人赞美总统,有人厌恶总统。我们的团队量化了这种情绪,计算了平均值,得出了一些有趣的结果。我们的分析只关注总统的支持率,但我们的方法很容易推广到计算任何人、政策或产品的支持率。值得注意的是,我们在这个项目中关注巴拉克·奥巴马总统,因为在他担任总统期间有最多的可用数据。

团队

如前所述,这个问题是由 6 名杜克大学本科生解决的——电气和计算机工程专业的大二学生米兰·巴特、经济学和计算机科学专业的大四学生安德鲁·库夫、计算机科学专业的大三学生 凯瑟琳·达纳 、计算机科学专业的大三学生 梅兰妮·法费尔 、经济学和计算机科学专业的大四学生亚当·斯诺登、生物学和计算机科学专业的大三学生我自己

动机和问题定义

Reddit 已经被广泛用于分享观点和想法。讨论一个主题有特定的论坛;这些被称为子编辑。我们看了 3 个子主题:r/政治r/民主党r/共和党 。正如你可能猜到的,第一个致力于围绕所有政治的讨论。共和党/民主党共和党/共和党都是民主党和共和党成员讨论政策、议题和候选人的论坛。

每个子编辑都有数百万条评论和数千条帖子。我们使用包含这些帖子的数据集进行分析。我们也非常依赖情感分析。情感分析是利用自然语言处理系统地量化书面语言表达的态度。比如那句“最悲惨的事就是在车流中等待。”是否定句。然而,这句话“这是美妙的击败高峰时间的交通和快速回家。”是肯定句。

我们可以对关于总统的帖子进行情感分析,看看用户是否对总统赞不绝口,如果是的话,有多赞。我们在子网站上的帖子的总体情绪和总统的支持率之间建立了联系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据源

我们的主要数据源是 2011 年至 2016 年 Reddit 评论 的一个 **大型 JSON 对象,其中包括所有公开评论的评论、评分和子编辑。**这是一个压缩了 250GB 的海量数据集。我们使用了拉斯姆森报告中的总统支持率数据集,这些数据是由国家调查生成的。

使用 Google BigQuery,我们从提到的三个子条目中提取了所有包含单词“Obama”的评论。我们用一个详尽的正则表达式清除了每个注释,替换了所有非字母数字值。我们按月份和年份汇总了评论。我们的基本对象有 3 个值:发表评论的日期、子编辑和评论本身。

BigQuery 上的查询结果是一个 CSV 文件。我们使用 Python 来访问和分析 CSV 文件中的信息。我们根据评论发表的月份和年份对它们进行了分类。

情感分析

对于我们的情感分析,我们非常依赖于 TextBlob ,这是一个用于处理和分析文本的 Python 库。我们主要使用他们的情感分析方法,该方法返回[-1,1]范围内的一个数字,其中-1 完全是负数,1 完全是正数。有两种主要的情感分析方法——语义方法机器学习方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

语义方法获取句子中各个单词的情感总和(或平均值)。输入句子中的单词被词条化,这意味着它们由一个共同的词根分组。这是因为生气、愤怒、愤然、都指代同一个负面想法。然后将每个单词的情感相加,为句子生成一个值。我们也可以在使用而非反转情绪。“不开心”这个短语可以类似于“心烦”来量化。此外,如果使用像非常*、非常难以置信这样的修饰语,我们可以更重视的情感。*

第二种方法是有监督的 机器学习方法。在机器学习中,监督算法被赋予两个参数:(1)输入和(2)预期输出。该算法然后推断出将输入映射到输出的函数。然后,该函数可用于新的输入,以产生输出。这种方法是典型的分类问题。有兴趣了解更多的,看这里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析方法

在我们的方法中,我们对给定月份和年份的所有类别的情绪进行了平均。在 4 年的时间里,这产生了 48 个数据点。然后,我们将这些数据点标准化为实际支持率的范围。我们最小的数据点成了 4 年来最低的支持率。我们最大的变成了最大的。所有其他值以类似方式映射。这可能扭曲了我们的基本数据,但它让我们更清楚地看到趋势和轨迹。

结果

*第一个结果来自 r/politics 。我们发现相关系数为 0.495,这表明这两条线是正相关的。然而,我们发现最有趣的趋势。**我们发现,在实际支持率适度上升和下降的同时,我们计算出的支持率也呈双曲线上升和下降。*鉴于 Reddit 的性质,这一结果是直观的。发帖的人往往观点比较夸张。这导致了更多的两极分化的帖子,更大的情绪值,和更多的双曲线趋势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上图中,我们看了一下的支持率。对于共和党人共和党人*,我们决定分析支持率的趋势。这是通过计算我们计算值的斜率(一阶导数)来实现的。我们又一次看到了更加夸张和放大的变化。出于与上述类似的原因,这是有意义的。下图显示了*共和党/民主党的结果。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,这是而不是共和党/共和党的情况。我们再次关注了支持率的趋势,我们看到了更多停滞不前的结果。实际上,支持率的趋势并没有什么有意义的变化。**我们的团队查看了共和党人/共和党人情绪分析的原始值,发现帖子的聚合几乎总是负面的。我们假设这是党派政治的副产品,在党派政治中,每个政党都强烈批评对方的任何行动或政策。在 subreddits 上尤其如此,因为用户可能更倾向于党派。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结束语

从网络资源中提取情感已经成为一个有趣的问题,尤其是在政治领域。对于那些感兴趣的人来说,这里是一篇有趣的文章,它使用 Twitter 的情绪分析来观察 2016 年的选举。这种方法代表了一种相对较新的方式来预测公众对从政策到人民的任何事情的反应。对于那些对复制结果或使用我们的代码感兴趣的人,请看这里的。

感谢阅读!

有问题吗?评论?给我发电子邮件到andrew.oliver.medium@gmail.com

开发人员构建持久产品的技巧

原文:https://towardsdatascience.com/developer-tips-for-building-products-that-last-e2fab8047ad4?source=collection_archive---------17-----------------------

你会感谢未来的自己

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Naveen Raj Dhanapal on Unsplash

当你想到伟大的设计时,你会想到什么?是手艺吗?设计本身的某种优雅?你欣赏设计师还是制作者?

不管你的答案是什么,有一件事是肯定的:你需要接触这个设计来欣赏它。

我们今天欣赏的大部分伟大作品都是为了维护而设计的。例如,想想建于中世纪的欧洲大教堂。几百年后它们并没有崩溃。相反,他们仍然巍然屹立,欢迎游客。

但是,如果他们的建筑师只专注于开发新的想法,很有可能,我们今天就无法访问他们。他们早就被遗忘,埋在尘土里了。

这和软件架构有什么关系?挺多的,真的!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Danny van Dijk on Unsplash

你为了什么而优化?

让我们停下来回答一下本节标题中的问题:开发软件时,你优化的目的是什么?是开发成本吗?基础设施成本?还是维护费用?

根据我的经验,许多公司倾向于选择前两个选项。维护很少得到优先考虑。这种做法有什么问题?好吧,即使你设法在预算内按时交付产品,很可能在它的生命周期内,它会产生巨大的成本。

规格变更;合规问题出现;当然,还有一些错误——一些在你的应用程序中,一些在你使用的第三方组件中。停机和崩溃也会让你的生活更加艰难。听起来很激烈?嗯,你可以为所有这些灾难做好准备!这篇文章会给你一些提示。

没人喜欢维护

库尔特·冯内古特写道,“人类性格中的另一个缺陷是,每个人都想建造,却没有人想维护。”在软件开发中尤其如此。让软件工作——即准备架构和实现——被视为一项光荣的工作。然而之后的一切——QA、部署、维护、错误修复等等。—不分享荣耀。有时这些任务甚至被认为是“肮脏的”

但是我们越不注重维护,生产系统的改变就越困难,代价也就越大。这些变化几乎肯定是必要的。世界上没有比临时解决方案更长久的了。

我参与了维护一项服务的斗争,这项服务本应上线不超过两个月。距离最初的部署已经一年多了,我们缺少文档、工作部署脚本和一些试用期已过的外部服务。没有人关心他们,因为他们知道这个项目几周后就会失败。但事实并非如此。

浪费的极端案例?不得不对你的团队创建的项目进行逆向工程,因为没有人记得它应该如何工作。请不要让这种事发生。实际上可能是你在做维护工作。让未来的自己更轻松。怎么会?一会儿我给你看。

一些奇怪的技巧使维护变得更容易

不幸的是,没有一个完美的技巧可以让维护变得更容易。你能做的最好的事情就是遵循一些能降低未来成本的最佳实践。

也许软件工程师最头疼的事情是调试。为了找到为什么事情没有像预期的那样工作,你可能需要测试多个假设,并仔细观察算法的流程。

当您有一个调试器连接到您的开发环境,并且您自己控制环境时,这很容易。但是在一个每分钟服务成千上万个客户机的生产系统中,仅仅为了观察而停止执行是不可取的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Martin Stoppler on Unsplash

可观察性

确保事情按计划运行的一个流行方法是可观察性。如果你没有听说过这个术语,你可能想读一读 IOD 专家约翰·法赫尔的《那么到底什么是可观测性》。简而言之,它融合了监控、日志记录、跟踪、分析和警报功能。

然而,拥有每一个都是不够的;他们一起工作是很重要的。这样,在任何时间点,你都可以检查事情是否按计划进行,或者是否有火开始了,你还有时间去扑灭。

可观察性有什么了不起的?如果你有,你是第一个知道潜在问题的人,而不是客户。通常,您可以在问题变得具有破坏性之前解决它们。或者在别人注意到之前。

回到我们的大教堂类比:你可以在付费游客注意到之前修好漏水的屋顶。

自动化部署

一旦你弄清楚需要做什么,你也必须发货。手动部署过程存在风险,并且容易出错。您的发布过程的自动化程度越高,就越容易将必要的变更推进到生产系统中,或者在事情出错的情况下回滚它们。这就是持续集成/持续部署(CI/CD)发挥作用的地方。一个好的部署管道将在每次更新时节省您的时间,一个非常好的部署管道将在不导致停机的情况下做到这一点。

在我们的大教堂,这意味着在游客参观时修理漏水的屋顶——不要被打扰!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Lanju Fotografie on Unsplash

混沌工程

这比前面的技巧更进一步。可观察性侧重于早期发现,CI/CD 侧重于不间断部署,而混沌工程侧重于问题预防。

与我们之前的对策不同,在建筑领域没有简单的类比来解释这一点。相反,它有点像分割的军事基地。一个片段中的爆炸只会损害该特定片段的内容。它不会影响任何其他部分。人们可以在没有被击中的部分继续他们的任务。

更妙的是,混沌工程公开寻求危险并玩弄它们。你可能听说过网飞的猿军。网飞认为,当其基础设施不断受到各种攻击时,每次事件发生时,设计都会变得更加强大。

混沌工程不仅需要各种级别的冗余,还需要巧妙的测试来确保每天都在实践对可能出现的最坏情况的反应。结果呢?由于网飞经常进行这种自我毁灭,到目前为止没有外部威胁能够伤害它。

尝试适合你的方法

在本文中,我已经向您展示了为什么从第一天开始就关注维护非常重要。我还提出了一些解决方案,可以帮助你实现这个目标。但是正如我所提到的,没有一个简单的技巧每次都能奏效。

每个服务都是不同的,有不同的需求和用例。有些可以处理停机,而对其他人来说,这意味着数千美元的收入损失。当与客户讨论工作范围(外部或内部)时,确保计划适当的维护策略。毕竟,如果您的应用程序每个月要处理 100 个请求,开发一个适当的自我修复集群可能有点太多了。

当然,除非你是为了好玩(也是为了学习)。

原载于 2019 年 3 月 7 日【https://www.iamondemand.com

开发者:放弃你的完美主义

原文:https://towardsdatascience.com/developers-drop-your-perfectionism-f5792c29cf5e?source=collection_archive---------20-----------------------

完成比完美更好

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Ethan Hu on Unsplash

人们可以在 IT 业人士和音乐家或其他艺术家之间找到一些相似之处。保罗·格拉厄姆在他的名著 黑客&画家中提到了其中一些。例如,两个群体都从(看似)无中创造出一些东西;我们在创作中留下自己个性的痕迹;而我们往往追求完美主义。

做美术的和做代码的区别主要在于我们开发的产品和我们创造的受众。一部音乐作品或一幅画最有价值的是它的美学价值。然而,IT 专业人士通常在商业环境中工作,在那里,为了让你的艺术达到“完美”而尽可能长时间地工作是一种奢侈。我们经常有严格的期限和预算要遵守。此外,我们在团队中工作。为了方便协作,我们需要走一些捷径。

然而,我认识的许多工程师都成了完美主义的牺牲品。我们希望我们创造的美丽产品和我们在开发过程中做出的明智选择能被人们记住。但是完美主义经常导致拖延,更糟糕的是,瘫痪。为了在市场中生存,我们需要意识到我们的完美主义倾向,并考虑采取不同方法的好处。

一路黑客

你知道什么是黑客吧?不,不是那个戴着酷酷的墨镜,看着随机字符在他的显示器上弹出,最后组合成一个密码,允许访问成千上万个银行账户的人。这就是好莱坞。真正的黑客文化围绕着寻找向客户提供有意义的体验的最简单可行的方法。它包含了各种各样的想法,比如自己动手的方法、懒惰或者创新思维。

这种极简主义可以以各种方式表现出来:最小的代码库,最低的预算,或者最快的上市时间。最小代码库的最好例子是 T2 Perl golf T3。高尔夫球手们相互竞争,以便给出最短的 Perl 脚本来产生期望的结果。最低预算通常意味着以非传统的方式重新利用现有的产品和解决方案。你的汽车音响坏了?你可以尝试修理它,更换它,或者简单地在咖啡杯里安装一个备用的蓝牙扬声器。最后,最快的上市时间意味着利用足够的“胶水”重新利用现有资源,以创造对潜在客户有吸引力的附加值。(拿一个干包来说,把内表面弄得凹凸不平,并在上面加一个透视窗。你得到了什么?当然是一台便携式洗衣机!)

巨大的影响带来巨大的进步

黑客的方法通常是完美主义的反面。黑客的目标是只投入向公众展示结果所需的工作。最终产品看起来漂亮吗?很少。会一直有效吗?不。但是它不需要看起来很漂亮,也不需要每次都有效。第一次迭代只是为了检查市场的反应。它也被称为最小可行产品(简称 MVP)。你知道卡尔·本茨的专利汽车吗?它可能看起来不像那个时代的一些马车那么复杂,但它确实做到了!对这个想法的进一步改进导致了今天汽车的豪华和舒适。

你可以在其他行业观察到类似的模式。它不仅仅局限于开发原型。想象一下构建一个 web 应用程序。你可以做出市场上最漂亮的 web 应用程序,但这需要一些时间。与此同时,你可能会错过最后期限,然后你的客户会拒绝付款。情况不太妙,对吧?

相反,想象你自己快速勾画出最基本的用户交互,实现逻辑,并向你的客户展示简单但有效的 MVP。她可能不喜欢粗糙的界面,但由于产品已经达到了预期的效果,你可以提议多花一点时间和预算让它变得更漂亮(甚至可能导致你或你的公司得到更高的报酬)。)结果可能会也可能不会达到你对完美的定义,但这次有积极的结果。你得到了报酬,你按时交货,你获得了经验,这些经验可能会帮助你在下一次尝试你的巨著时发挥得更大。

不要埋没自己的理想

你可能认为阅读上面的内容,我认为收入比美学更重要。但这不是真的。和我认识的大多数人一样,我为自己的工作感到自豪。我希望我所有的作品都尽可能的漂亮。我花时间自学,努力提高自己的技能,希望这能反映在我创造的产品中。是的,和你们中的一些人一样,我仍然是完美主义和拖延症的牺牲品。

但是当你意识到自己的完美主义倾向时,你可以选择不这样做。你不必每次都选择完美主义路线。在某些情况下,极简主义方法实际上可能是更好的选择。重新思考你现在面临的问题。然后,问问你自己,一个黑客方法是否可以帮助你前进,而不会在你自己的理想上妥协太多。

如果你喜欢我创造的考虑订阅 Bit 更好。这是一个社区时事通讯,推荐书籍、文章、工具,有时还有音乐。

原载于 2018 年 4 月 19 日https://www.iamondemand.com

在 Tensorflow 2.0 中开发 DCGAN 模型

原文:https://towardsdatascience.com/developing-a-dcgan-model-in-tensorflow-2-0-396bc1a101b2?source=collection_archive---------6-----------------------

介绍

2019 年 3 月初,TensorFlow 2.0 发布,我们决定基于 Taehoon Kim 的 DCGAN 实现创建一个图像生成器。下面是如何在 TensorFlow 2.0 中开发 DCGAN 模型的教程。

“为了避免 D(鉴别器)网络的快速收敛,G(生成器)网络每更新一次 D 网络就更新两次,与原论文不同。”

—金泰勋

先决条件

  • Jupyter 笔记本
  • 张量流 2.0
  • 访问高性能 GPU

DCGAN 架构

下图显示了 DCGAN 论文中引用的生成器。本质上,该网络接收一个 100x1 噪声矢量,标记为 100z ,并将其映射到 64x64x3 的 G(Z)输出。

100 x 1→1024 x 4 x 4→512 x 8 x 8→256 x 16 x 16→128 x 32 x 32→64 x 64 x 3

第一层通过在每一步投影和整形来扩展随机噪声

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: carpedm20

大步

跨距指定了卷积沿高度和宽度的“步数”。这里有一个动画示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An example of strides

输入噪声

generator = make_generator_model()noise = tf.random.normal([1,100]) # shape is 1, 100
generated_image = generator(noise, training = False)plt.imshow(generated_image[0, :, :, 0], cmap =”gist_rainbow”)

致密层

在 Keras 中,您可以创建层来开发模型。模型通常是层的网络,其中最常见的类型是层的堆叠

将密集连接的图层添加到模型将接受 shape (,100)的输入数组。第一层之后数据的形状将为(,441024)。在这种情况下,由于自动形状推断

批处理标准化功能类似于网络每一层的预处理,您不需要指定向前移动的输入的大小。

ReLU 对于所有正值都是线性的,对于所有负值都设置为零。泄漏 ReLU 对于负值具有较小的斜率,而不是完全为零。

例如,当 x < 0

def **make_generator_model**():

 model = tf.keras.Sequential()

 model.add(layers.Dense(4*4*1024, use_bias = False, input_shape = (100,)))

 model.add(layers.BatchNormalization())

 model.add(layers.LeakyReLU())

First Layer

The generator uses a transposed convolutional layer (upsampling) to produce an image from seed (random noise).

  • 512 是输出空间的维度时,泄漏 ReLU 可以具有 y = 0.01x
  • (5,5) 指定 2D 卷积窗口的高度和宽度
  • 步幅= (2,2)
model.add(layers.Conv2DTranspose(512, (5, 5), strides = (2,2), padding = “same”, use_bias = False))

assert model.output_shape == (None, 8, 8, 512)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())

第二层

生成器使用转置卷积层(上采样)从前一层生成图像。

  • 256 是输出空间的维数
  • (5,5) 指定 2D 卷积窗口的高度和宽度
  • 步幅= (2,2)
model.add(layers.Conv2DTranspose(256, (5,5), strides = (2,2), padding = “same”, use_bias = False))assert model.output_shape == (None, 16, 16, 256)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())

第三层

生成器使用转置卷积层(上采样)从前一层生成图像。

  • 128 是输出空间的维数
  • (5,5) 指定 2D 卷积窗口的高度和宽度
  • 步幅= (2,2)
model.add(layers.Conv2DTranspose(128, (5,5), strides = (2,2), padding = “same”, use_bias = False))assert model.output_shape == (None, 32, 32, 128)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())

最后一层

生成器使用转置卷积层(上采样)从前一层生成图像。

  • 64 是输出空间的维数
  • (5,5) 指定 2D 卷积窗口的高度和宽度
  • 步幅= (2,2) 指定卷积沿高度和宽度的步幅
model.add(layers.Conv2DTranspose(3, (5,5), strides = (2,2), padding = “same”, use_bias = False, activation = “tanh”))assert model.output_shape == (None, 64, 64, 3)
 return model

价值函数

发电机的损耗量化了它欺骗鉴别器的能力。直观地说,如果生成器运行良好,鉴别器会将假图像分类为真实图像(或 1)。

这里,我们将把鉴别器对生成的图像的决定与 1 的数组进行比较。

def **generator_loss**(fake_output):
 return cross_entropy(tf.ones_like(fake_output), fake_output)

【计算机】优化程序

鉴别器和生成器优化器是不同的,因为我们将分别训练两个网络。Adam 优化算法是随机梯度下降的扩展。

随机梯度下降为所有权重更新保持单一学习率(称为 alpha ),而学习率在训练期间不变。
为每个网络权重(参数)保持一个学习速率,并随着学习的展开而调整。

generator_optimizer = tf.keras.optimizers.Adam(1e-4)
discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)

结果— MNIST

首先,我们在 MNIST 数据集(28 x 28 灰度图像)上使用 3 个反卷积层来训练我们的 DCGAN 模型,这产生了更清晰的渲染,如下所示:

结果— CelebA

使用在 CelebA 数据集(25,600 / 202,599 张图像)的子集上训练的具有 4 个 DC 层的 DCGAN 模型,我们能够生成运行 100 个时期的类似人脸的图像。

工具/资源

纸张空间

  • TensorFlow 1.5 — GPU — Py3 — P5000
  • TensorFlow 2.0 — GPU — Py3 — P5000
  • tensor flow 2.0—GPU—Py3—Tesla V100

MNIST 数据集

  • 60,000 张图片
  • 128 x 128

CelebA 数据集

  • 202,599 张图片
  • 从 218 x 178 转换为 64 x 64

挑战

  • 了解使用 Tensorflow 创建的 GAN 模型
  • 利用 Tensorflow 2.0 开发 DCGAN 模型
  • 将数据集图像从 218 x 178 调整/裁剪为 64 x 64
  • 训练新模型时 Jupyter 笔记本出现内存泄漏
  • 与 TensorFlow 1.3 和 2.0 不兼容
  • 12 小时后纸张空间自动关闭

未来的工作

  • 将模型迁移到可以使用 CelebA 数据集完整计算 100 个历元的环境中
  • 调整模型架构以生成更好的图像
  • 开发一种解决方案来更有效地调整图像大小

[## skywall34/BabyGan

带 DCGAN 的图像发生器。在 GitHub 上创建一个帐户,为 skywall34/BabyGan 开发做贡献。

github.com](https://github.com/skywall34/BabyGan)

参考

没有互联网的伟大人们,我们不可能完成这个项目。请为您的下一个数据科学项目查阅以下资源:

从头开始开发音乐推荐系统

原文:https://towardsdatascience.com/developing-a-music-recommendation-system-from-scratch-91d92b47a47f?source=collection_archive---------23-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概观

新学期已经开始了,我的新课程也开始了。我特别兴奋,因为这学期我可以从头到尾开发自己的项目。

你可能知道,我不久前开始了我的机器学习之旅,所以这是在该领域获得一些实际动手经验的绝佳机会。我选择从零开始开发自己的音乐推荐系统。

在这篇博文中,我将简单介绍一下我的想法,到目前为止我所做的事情以及一些目标。

在接下来的几周和几个月里,我会定期发布我正在研究的主题,也会发布一些关于如何做事的教程。

TL;大卫:如果你只是想看看回购协议,它在 GitHub 上是开源的。正在进行的工作

[## Hyferion/SpotifyRec

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/Hyferion/SpotifyRec)

这个想法

主要原理非常简单。我想开发一个机器学习模型,可以根据我之前的喜好简单的分类我是喜欢一首歌还是不喜欢一首歌。此外,我还添加了该模型可能具有的一些其他功能。

  • 后处理播放列表,这意味着删除我肯定不喜欢的歌曲。
  • 创建推荐的播放列表,类似于“Spotify Discover”
  • 探索新的流派和国家。这意味着搜索你通常喜欢的相似音乐,但是例如来自另一个地理区域的音乐

这是怎么回事?我使用一种叫做基于内容过滤的方法。基本上,我从歌曲的基本成分和特征(速度、可跳舞性、声音)来看歌曲,并让我的机器学习模型来决定这首歌是否符合我以前喜欢的歌曲。

到目前为止我所做的

**创建了一个数据集。**我创建了一个数据集,目前包含大约 500 首歌曲,分为两类(“喜欢的”、“不喜欢的”)。我在分类应用程序的帮助下做到了这一点,你可以在这里了解更多信息:

[## 机器学习:让二进制注释不那么无聊

标注数据集的新方法

towardsdatascience.com](/machine-learning-making-binary-annotations-a-little-less-boring-51537497af3b)

**编写脚本从 Spotify API 获取数据。**幸运的是,Spotify 为每首歌提供了我们需要的所有参数的 API(速度、可跳舞性等)。).我创建了不同的脚本来获取这些数据,并将其集成到我现有的数据集中。

**已清理数据集。**首先,我定义了相关参数,准备了我的数据集。在那之后,我不得不清理和准备它。这意味着打乱数据,分成测试集和训练集。此外,我不得不欠采样我的数据集,以平衡类。

**玩转不同算法。**有很多算法可供选择(如随机森林、SVC、SGD)。以及超参数调谐。

**分析比较结果。**最后,我弄明白了结果。计算不同的指标,如准确度、精确度和召回率。此外,一个混乱矩阵,看看我的猜测是正确的是非常有帮助的。

接下来会发生什么

还有很多事情要做。目前面临的主要挑战之一是获得一个包含 Spotify 上 3000 万首歌曲的可搜索数据库。这通常需要建议新的标题,但特别是发现新的流派。

当然,我也在想办法改进我现在的模式。目前,我正在探索以下选择:

  • 添加更多数据。例如,从欠采样到过采样或收集更多数据。
  • 功能工程,创造额外的功能或更好地选择功能。
  • 尝试不同的算法。尝试深度神经网络,例如 Tensorflow,看看我是否能获得更好的结果。
  • 调整超参数

结论

在这篇文章中,我想告诉你一些我正在做的项目。下一篇文章将更详细地介绍如何实现不同的步骤。

通过矩阵分解开发一个规范的推荐系统

原文:https://towardsdatascience.com/developing-a-prescriptive-recommender-system-through-matrix-factorization-8b0c69cce611?source=collection_archive---------16-----------------------

作者——拉温德拉·舒克拉(人工智能/人工授精从业者)

摘要— 矩阵分解是一种非常强大的算法,在多个行业中有许多有价值的用例。矩阵分解的一些众所周知的应用是——网飞 100 万美元的电影推荐奖和亚马逊在线应用(非常精炼的版本),用于向各种读者推荐书籍。虽然这是一种非常流行的方法,但它有一些局限性。我们在本文中的重点是了解潜在的因素,以及如何使其更具规范性。当集合中的产品已经被少数用户评价或者每个用户已经评价了少数产品时,该算法工作得很好。然而,如果我们在集合中包括没有被任何用户评级的新产品或者集合中对产品的偏好未知的新用户,那么将很难为未评级的产品和新用户创建推荐。基于关键特征将产品的潜在特征和用户偏好相关联是一个挑战。下面的文章提出了解释与产品和用户特征相关的潜在因素的挑战。一旦我们对产品和用户特性有了清晰的认识——我们就可以走向规定性的旅程。这将有助于设计具有更受欢迎功能的未来产品,或为某一特定产品找到市场。

背景— 对于基本术语和背景的理解,我一般会引用维基百科。

矩阵分解是推荐系统中使用的一类协同过滤算法。矩阵分解算法通过将用户-项目交互矩阵分解成两个低维度矩形矩阵的乘积来工作。

https://en . Wikipedia . org/wiki/Matrix _ factorization _(recommender _ systems)

我们总是需要将身边的两个实体联系起来。想想各种场景——病人对疾病,用户对产品,男人对女人,用户对电影偏好,求职者对空缺职位。我们可以将这个概念扩展到日常生活中的许多其他场景,并找到相关性。当我们试图寻找两个实体之间的相关性时,矩阵分解非常方便。

矩阵分解的使用案例-

市场战略

交叉销售和追加销售

计算产品倾向和客户倾向

推荐引擎/个性化

推出新产品

了解客户 360

求职网站的筛选和推荐

婚姻或约会网站中的过滤和推荐

上面的场景只是几个例子,这个概念是非常通用的,并且有广泛的使用范围。

创新使用 —事实上,在我们之前的一个项目中,我们使用矩阵分解来填充数据集中缺失的值。这个练习是为了计算健康分数(一个非常类似于信用分数的概念——健康分数越高表示健康状况越好)。假设我们缺少一个患者(P1)的 A1C 读数,我们可以将其他具有类似特征(年龄、性别、身体质量指数、人口统计学、血压、胆固醇、生活方式等)的患者与患者 P1 相关联,并相应地估计 P1 的 A1C 读数。

机器学习基础——矩阵和向量的使用

在我们深入研究矩阵分解和如何解释潜在因素之前,让我们先了解一些机器学习的基础知识。

机器学习是基于数学的,它涉及基于梯度下降(【https://en.wikipedia.org/wiki/Gradient_descent】)的迭代优化,以最小化预测中的误差。存储在数据库中的数据不能作为输入传递给算法,它需要用矩阵来表示。矩阵是不同向量的组合,在定义数学运算时很有用。

用户可能具有以下特征——用户 id、用户名、地址、年龄、性别、收入、教育、对产品特征的偏好、用户类型(学生、工人、IT 工人、销售人员)

类似地,我们可以根据患者的生物特征来定义他/她的基本特征。

像笔记本电脑这样的产品将具有诸如触摸屏、RAM、CPU、品牌、颜色、成本(范围)等特征。像一本书这样的产品将具有诸如作者、主题、时期写作、流派、诗歌与散文、小说与非小说、长篇与短篇、精装与软装、纸质书与电子书、技术书籍等特征

但是,我们不能像在机器学习算法中那样使用上述数据。数据需要以向量和矩阵的形式排列,以便我们在数学运算中可以将它们作为矩阵传递。

用数学术语表示实体的实例— 让我们看看如何用关键特征在 N 维中表示患者

患者可能具有以下主要特征(样本)–

患者 id —这是数据库中有用的唯一标识符。然而,机器学习和算法基于关键特征工作是不相关的。ID 只是数据库系统中的一个标识符。

姓名—类似于患者 id,在 ML 中没有意义

其他人口统计信息(种族、民族、婚姻状况、收入、教育和就业)

年龄—0 到 120 岁之间

性别——男性或女性

位置(州、国家)

生物计量读数(血压—收缩压(范围—0–200,舒张压—0–200),血糖 0–400,A1C(0–10),胆固醇(0–400),吸烟—是或否,慢性病—是或否,共病—是或否)

它可以有更多的特性,但是上面的细节对于我们的讨论来说已经足够了。

Epic 系统数据库中的患者记录-

患者的实例(记录)将存储在常规数据库中,如下所示-

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A patient record in regular database

在 N 维中将患者表示为向量(P ),以便我们将其作为 ML 算法中的输入——

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

patient record with numeric values only

我们需要将所有文本数据转换成数字,并使其有意义,以便可以在计算中使用。有一种特殊的方法来扩展分类变量(例如,性别、州、共病等)。这个过程被称为 Onehotencoder。在数据预处理中还有许多其他活动,但是我们在这里不涉及这些细节(比如在调用 ML 算法之前归一化所有的值、清除丢失的数据等)。

患者实例的上述表示被称为 P 向量。我们组合患者向量的所有实例来创建患者矩阵 p。

向量乘法是什么意思——

将一个已知矩阵(评分矩阵)分解成两个未知矩阵(用户特征和产品特征)是矩阵分解的关键。让我们来理解两个矩阵(用户矩阵和乘积矩阵)相乘的意义是什么

A = a1.i + a2.j + a3.k —三维向量 A(假设—这是用户特征向量)

B = b1.i + b2.j + b3.k —三维向量 B(假设这是产品特征向量)

A x B = a1 . B1+a2 . B2+a3 . B3—A 和 B 向量的乘积

假设 I 代表安全性,j 代表家用车辆,k 代表产品和用户向量的性能系数。对于喜欢具有良好安全特性的高性能家用车辆的用户来说,( AxB)的值会更高。对于喜欢跑车且维护成本较高的用户来说,相同车辆的 AxB 值较低。我们可以清楚地看到,较高的 AxB 值将表明用户 A 对产品 b 的亲和力更好。让我们举个例子来理解——两个向量相乘的意义是什么。

尼鲁喜欢经典的动作片,由黑泽明执导,有很好的剧本、剪辑和背景音乐。她不喜欢恐怖、喜剧、悬疑或故事情节糟糕的电影。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

User vector — Neeru — P1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Product vector Q1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Product vector — Q2

如果我们将两个向量相乘

P1(用户的 Neeru 实例)x Q1(七武士—产品实例)=(. 8x 1+. 1x 1.2+. 3x 5+. 9x 8+1x1+. 4x 0+. 4x 8+. 2x 2+. 7x 1)= 3.75

P1(用户的 Neeru 实例)x Q2(布莱尔女巫-产品的实例)=(. 8x . 2+. 1x . 8+. 3x . 3+. 9x . 4+1x 0+. 4x . 2+. 4x . 6+. 2x . 6+. 7x 0)= 1.13

这清楚地表明,比起布莱尔女巫,尼鲁更喜欢看七武士。

解读潜在因素-

矩阵分解基于下面的等式

R = P x QT

r 是不同用户对产品评级的矩阵

p 是用户矩阵

q 是乘积矩阵

QT 是矩阵 Q 的转置

我们没有产品和用户功能的细节。我们只有用户对各种产品的偏好(评分)(来自历史数据)。基本方法是—从假设产品和用户矩阵的某些系数开始,导出评级的预测值,找出预测值与实际值之间的差异作为误差,对误差求和,计算梯度以改变系数值,并再次重新计算预测值和误差。不断迭代,直到收敛到某个最小误差。所有这些都可以用 Python 中的 50 行代码来完成。

同样,上述带有量纲的方程可以写成-

R [M,N] = P[M,K] x QT[K,N]

R[i,j] —来自用户 i (Pi)的额定产品 j (Qj)的值

Q [i][1,2,3,…。k] =具有 k 个关键特征的乘积 Qi 向量
P[j][1,2,3,…。k] =由 k 个关键特征定义的用户 Pi 向量

我们假设在上面的等式中有 K 个潜在特征。

潜伏因素有哪些?

在矩阵分解中,我们的工作是将两个实体(例如产品和用户)。每个产品都有一些关键特征,每个喜欢该产品的用户都将取决于他/她对这些关键特征的偏好。

这些相关性中的许多可以通过矩阵分解来建立。当我第一次读到矩阵分解以及如何使用梯度下降来实现预测时,我很兴奋。用 python 写 50-60 行基本代码就能完成这么多事情。当我开始思考——如何让它更规范时,兴奋是短暂的。除非我们找到一种实用的方法来解释和扩展数学美,否则数学美就会消失。

我们做一个基本假设,两个实体通过 K 个潜在因素相关联。k 只是一个数字。我们不知道这些 K 因子代表什么。这就是为什么他们也被称为潜伏。这在使矩阵分解更规范方面造成了关键障碍。

我尝试了不同的组合来推导一些潜在因素的含义。其中之一是——不断增加 K 值,看看在某个数字之后,K 值的增加是否不会对用户和产品系数产生影响。用户系数和产品系数收敛,进一步增加 K 将无关紧要。它没有成功。

事实上,当我增加 K 值并尝试多次积分时,我开始得到矩阵 P 和 Q 系数的不同组合。

破译矩阵分解-

让我们用一个例子来分析一下细节。

r 矩阵—8 名用户对 4 种不同产品的评分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rating Matrix — R

让我们假设——我们有四个潜在因素。换句话说,产品有 4 个主要特征,用户会根据这些关键特征对产品产生偏好。

R [8x4] = P[8x4] X Q[4x4]

P(用户矩阵)——扩展为四个潜在特征

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Users Matrix — P

QT(乘积矩阵转置— Q) —扩展为四个潜在因子

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Product Matrix Transpose — QT

这是一个纯数学练习,其中我们知道 matrix-R 的值(并非所有评级都是已知的)。我们首先用随机值初始化用户矩阵和乘积矩阵。

用户 u4 对产品 P2 (u4P2)的评级是两个向量的乘积——用户(U4)和产品(p2)。

u4p 2 = u41 . p21+u42 . p22+u43 . p23+u44 . p24

如果我们注意到上面的等式——特定用户对任何产品的偏好与两个向量的不同维度的系数之和成正比。

让我们再来看看矩阵分解方程

R = P x Q

这里 P 和 Q 都是未知的。只有几个 R(用户评价产品)值的系数是已知的。

当 P 和 Q 都是变量时,R 有多个解对(P,Q)。

u4p 2 = u41 . p21+u42 . p22+u43 . p23+u44 . p24

原始矩阵 R —

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Original Rating Matrix — R

高亮显示的单元格是没有被用户评级的单元格。它们变成了测试细胞。

不发光的单元格是我们已经知道产品等级的地方。

我尝试了多次迭代求解 P 和 Q 矩阵的值,每次都得到不同的结果 Q。

迭代 1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Predicted rating Matrix — X after iteration-1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Users Matrix — P after iteration 1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Product Matrix Q after iteration 1

X —用户产品评级的预测值(R 是原始矩阵)

P —分解后的用户矩阵

Q —分解后的乘积矩阵

迭代 2:迭代 2 的输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matrices after iteration 2

迭代 3:迭代 3 的输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matrices after iteration 3

迭代 4:迭代 4 的输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matrices after iteration 4

简而言之,我们有 8x4 + 4x4 = 48 个变量,但不到 32 个方程。很明显,我们会有多对 P 和 Q 矩阵。

除了解释 k1,k2,k3,k4 意味着什么之外,这是为了得到 P 和 Q 的一致值而进行的斗争?除非我们在获得 P 和 Q 的收敛值时具有一致性,否则我们对未评级产品的预测将继续波动。

当前模型的问题—

去因子分析有助于我们理解——我们如何预测尚未评价/或使用某些产品的其他用户的偏好。基于预测的偏好,我们可以决定更好销售的营销策略(交叉销售和追加销售)。

1.潜在因素的数量是未知的

2.每次迭代都会给出不同的用户矩阵和产品矩阵——这意味着预测不一致

3.潜在的因素是未知的——这就产生了一个使模型具有规定性的问题。这意味着——假设我们要推出一款新产品,但我们不确定——我们应该更多地关注哪些功能以获得更好的销售。

解决方案-

当我们只有一个等式 R = P x Q 时,解决这个问题的一种方法是固定变量 Q(产品特性),这样我们就只需要处理一个变量(P —用户特性)。

凭经验思考——这是个不错的选择。如果我们在销售某些产品,我们最好知道产品的特性是什么,以及我们有多少关键特性。

让我们理解固定 K 的值和矩阵 Q 将如何帮助获得 P 的一致结果和 r 值的收敛预测。

当我们分析上述等式时

产品等级(u4p 2)= u41 . p21+u42 . p22+u43 . p23+u44 . p24

用户特征向量— u4 = u41.i + u42.j + u43.k + u44.t

产品特征向量— p2 = p21.i + p22.j + p23.k + p24.t

其中 I,j,k,t 是向量的四个不同维度。每个维度对应一个独特的特征。

当我们将 Q 值固定为–

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Product Matrix Q (fixed one)

我们开始在 P 值和等级(X)的预测值以及用户矩阵-P-中获得一致性

迭代 1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rating Matrix X and User Matrix P after iteration 1

用户矩阵§开始收敛。请查看迭代 2、3 和 4 的值。

迭代 2:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matrices after iteration 2

迭代 3:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matrices after iteration 3

迭代 4:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matrices after iteration 4

基于上述数据,我们可以确定代表用户偏好的用户特征向量。

现在关键问题仍然是——如何修正产品矩阵?

选项 1:

特征的数量——K——必须根据对产品特征的理解来估计。

产品矩阵的系数值—范围从 0 到 1 (0 表示功能对产品没有任何影响,1 表示功能对产品影响最大)。

一旦我们知道了什么特性(k1,k2,…Kn)意味着,我们可以根据它们对产品质量的贡献来分配从 0 到 1 的系数。

业务 SME 和技术团队都需要一起工作来确定初始关键特征和确定系数的权重。

选项 2:

特征的数量——K——必须根据对产品特征的理解来估计(类似于选项 1)。

现在分解矩阵 R,并在几次迭代中确定矩阵 P 和 Q。根据 Q 值的两次迭代和对产品特性的理解做出最佳猜测。

固定 Q 的值并求解矩阵 P。一旦矩阵 Q 固定,矩阵 P 的系数将收敛。

事实上,确定 K 值和乘积系数是很好的方法。这样,我们可以计算用户矩阵的等效系数。

比方说,我们决定根据 5 个关键特征对产品进行分类,并确定每个系数在整体产品偏好中的重要性,这将有助于确定用户矩阵中的相关特征,其中哪个系数对应于哪个特征也是已知的。

关键步骤总结—

1.假设 K —基于对产品特性的理解

2.从 P 和 Q 系数的随机值开始

3.迭代并确定第一组 P 和 Q 值

4.查看 Q 系数—尝试将 Q 与产品特性联系起来(产品/项目特性应该是已知的)

5.固定 Q 值和关键特征数量(K —潜在因素)

6.调整 Q 矩阵(产品特性)

7.使用 Q 的调整值来确定 P 的值

需要牢记的关键事项—

我忽略了用户对产品评分的偏见(只是为了让计算更简单)。

产品特征与个体维度相对应。尺寸相互垂直。特征向量中不应该有共线性。

当我们确定产品特征时,假设 k1、k2、k3、k4…我们可以根据系数的相对值解释不同潜在因素的初始含义(较高的主导特征将具有较高的系数)。

用户特征将对应于同一组产品特征。假设如果产品 k1 代表产品安全特征,用户 k1 将指示用户对安全的偏好。

结论—

最近我在看谷歌 CEO(桑德尔·皮帅)在谷歌 2018 I/O 上的演讲,他谈到了基于眼睛扫描图像预测心血管事件。

许多过去事件(病史、环境、习惯、药物等)的影响将会影响许多其他事件(健康状况——心血管事件)和眼睛内部。

过去发生了一系列事件。现在,他们正在影响心脏骤停的几率以及眼睛内部。

通过测量眼部扫描的变化/情况,我们可以关联心脏骤停的可能性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Understanding common factors which impact heart and Eyes conditions

类似地,我们可以找到许多其他用途——疾病相关性与不同位置的水质。

上述关系,我们也可以根据深度学习中的神经网络层进行映射。

实体 1 (E) —不同类型的扫描眼睛图像

实体 2 (H) —不同类型的心脏疾病

潜在因素——不同组的活动、既往病史、人口统计学等是特征向量。它们在深度学习模型中充当输入。我们可以收集病人的各种数据记录——眼睛扫描和心脏状况。使用矩阵分解——我们可以确定两个实体之间的相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Representation in neural network term

我最近了解到——前列腺癌在东部非常普遍。我们只需要收集不同地点与该地区流行疾病的数据,了解可能的潜在因素,并深入处方医学。这在人口健康管理(ACO)的背景下非常有用。

同样,我们可以研究水质、空气质量、工业存在、污染水平、土壤质量对不同地理区域各种疾病的影响。

受众— 实施数据科学项目需要业务团队和技术团队(数据工程和数据科学团队)的协作。数据科学组开发算法来为数据建模并评估性能,而业务组帮助理解产品功能并收集建模所需的相关数据。

在初始化用户和产品矩阵时,利用业务 SME 的经验来理解产品特性的相关性、将它们放入正确的序列、分配正确的权重将是至关重要的。因此,两个团队需要紧密合作来创建健壮的/规范的系统。

参考文献—

【https://www.youtube.com/watch?v=MSpF84kevyU

http://www . quux labs . com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/

https://en . Wikipedia . org/wiki/Matrix _ factorization _(recommender _ systems)

https://www.youtube.com/watch?v=XkY2DOUCWMU&list = plzhqobowt qd D3 mizm 2 xvfitgf 8 he _ ab&index = 5&t = 0s

http://infolab.stanford.edu/~ullman/mmds/ch9.pdf

为艺术品的视觉相似性比较开发艺术风格嵌入

原文:https://towardsdatascience.com/developing-art-style-embeddings-for-visual-similarity-comparison-of-artworks-7a9d4ade2045?source=collection_archive---------15-----------------------

这项任务是作为一个高清历史图片在线图书馆的概念验证的一部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本练习的目的是找到一个将图像转换为嵌入向量的函数,其中向量之间的欧几里德距离表示图像在视觉上的相似程度。这允许对一个图像的嵌入进行最近邻搜索,以返回视觉上相似的图像,从而实现图像推荐和聚类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这项任务因图像是插图而不是照片而变得复杂。虽然照片是主题的真实表现,因此相似的主题和构图会产生视觉上相似的图像,但插图包括风格的额外维度。

风格:“绘画、写作、作曲、建筑等的一种方式。某一特定时期、地点、人物或运动的特征

为了创建图像嵌入,使用了两种方法:

  • 卷积神经网络嵌入
  • 3D 色彩空间最近邻

卷积神经网络嵌入

用于将图像转移到嵌入的模型借鉴了来自神经类型转移电子商务图像内容相似性工作的发现。 一种艺术风格的神经算法 由Gatys et。al 和@Raghul Asokan 撰写的被用来研究神经类型转移。使用 TensorFlow 创建图像相似性函数及其在电子商务中的应用作者 Nina Pakhomova 用于开发对相似图像检索技术的理解。

风格转移和图像相似性技术都利用预先训练的卷积(CNN)图像分类模型来从图像中提取和抽象信息。这些模型已经被训练来提取用于分类目的的信息,随着网络深度的增加,中间卷积层捕获关于图像内容的越来越复杂的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

source

为此,我将使用在 image-net 数据库上训练的 VGG-19 模型,其架构如上图所示。为了利用这个网络提取艺术风格,我们必须首先做出一些主观假设,在手头任务的背景下是什么定义了风格。

  • 我们假设一种风格可以被描述为各种纹理和颜色的组合。
  • 我们还假设子特征,即整体图像中重复出现的小部分,对我们体验的风格很重要。例如,一幅建筑物和一幅风景的铅笔画可能具有相似的纹理,但是建筑物的锐角和窗户赋予了建筑图一种与风景截然不同的风格。

幸运的是,我们知道 CNN 在每个卷积层捕获并提取这些信息,每个核“搜索”纹理或子特征。当纹理或子特征存在于底层图像中时,内核在对图像该区域进行采样时输出较高的值。单个内核的激活过程如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://www.mdpi.com/1996-1073/12/15/2846/xml

当一个层的所有内核都通过输入时,深度等于内核数量 k 的 3D 矩阵被输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些内核越深入网络,提取的纹理就越复杂,最深的内核激活整个结构,如眼睛或窗户。这种行为在深层梦境的图像中得到了证明。

使用我们上面关于什么定义艺术风格的假设,并且知道每个核捕获艺术风格的不同元素,我们可以使用来自特定区域的所有核的激活的组合作为该区域的艺术风格的数学描述。为了总结所有地区的这些发现,人们可以简单地将每一次激活整合成一个嵌入向量,就像在**电子商务图像内容相似度中所做的那样。**然而,这种方法效率低,因为它需要存储每个激活,并且对图像上的空间变化敏感。这将导致下面的两幅图像被评为风格非常不同,尽管只是在空间上有所不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了克服这些问题 Gatys et。al 在他们的神经风格转印纸中使用 gram 矩阵。Gram 矩阵计算每个内核的输出之间的相关性。在其输出中显示高相关性的核组合被认为是图像风格的描述。例如,在上面的《星夜》中,两幅图像中的单个笔触和漩涡的纹理高度相关,因此图像的克矩阵是相似的。

在计算上,通过将卷积输出展平为 2D 数组来计算格拉姆矩阵,每个内核为列,每个激活为行,a。该数组与其转置的点积作为格拉姆矩阵 G 输出。此处 G(i,j)给出了内核 I 和 j 的激活之间的相关性。注意,术语“相关性”的使用相当宽松,因为这不是统计意义上的真实相关性。潜在地,术语累积共活化将更准确。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

产生的 gram 矩阵的大小是 k,它被展平成一个向量用于存储。从哪个(些)中间层提取内核输出是通过反复试验确定的,重点放在性能上,因为使用的层越深,所需的计算和计算时间就越多。

3D 色彩空间最近邻

哪些颜色是显而易见的视觉描述符,也是我们不想忽视的。虽然 gram matrices 将提取颜色信息,但我们使用了二次采样方法来明确编码当前的主色。色彩降维已经被很好地记录下来,通常为了提取图像中的主色,我会使用聚类方法,比如 K-means。然而,在这种情况下,我希望将图像的颜色表示为一个向量,其中每个元素总是对应于相同的颜色,从而允许图像之间的比较。

为了实现这一点,图像的 3D RGB 色彩空间被分成 n 个互斥的立方体,每个立方体的边长为 255/n。对每个立方体内的像素数量进行计数,并将计数存储在长度为 n 的向量中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嵌入结构

最后,将展平的 gram 矩阵与颜色嵌入连接起来,形成维数为 N = k + n 的嵌入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Model Architecture

结果

10,000 幅图像的样本集用于测试该模型。由于这种方法是无人监督的,不需要进一步的训练,这个小集合是足够的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你正在读这封信,感谢你能走这么远!随着这个项目的继续,请随时关注。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用数值和矩阵运算发展单纯形法

原文:https://towardsdatascience.com/developing-the-simplex-method-with-numpy-and-matrix-operations-16321fd82c85?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与本帖相关的代码可以在 要点中找到链接。

在这篇文章中,我试图从矩阵运算的角度来解决描述和实现单纯形法的资源匮乏的问题。特别是,单纯形法的大多数计算实现是通过直接实现单纯形 tableau 方法开发的。

因此,在这篇文章中,我试图通过开发一个利用矩阵运算而不是 tableau 方法的单纯形法程序来给出单纯形法的替代实现。为了保持这篇文章的简洁,我避开了特定矩阵运算实现的数学,但是如果读者希望了解更多关于这个特定实现的数学,他们可以参考 Stephen Nash 和 Ariela Sofer 的书 【线性和非线性编程 】,该书对单纯形法和实现它的许多方法进行了很好的介绍。Bazaraa、Jarvis 和 Sherali 的书Linear Programming and Network flow也是一个很好的深入资源,涉及到本文中提到的许多观点。我在本帖末尾给出了完整的线性编程书籍参考列表。

由已故数学科学家乔治·丹齐格发明的单纯形法是一种用于求解约束线性优化问题的算法(这类问题被称为线性规划问题)。线性规划问题经常出现在运筹学的相关问题中,比如在给定时间和资源约束的情况下寻找利润最大化的方法。

线性规划问题包括两个关键要素:一个目标函数和一个线性不等式系统。解决这种线性规划问题的基本目标是在给定解的线性约束的情况下最大化或最小化目标函数。线性不等式组创建了一个可行区域,因此最优解必须位于可行区域内。由线性不等式形成的这个可行区域是一个*凸多面体,*下面给出了这样一个区域的可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A Convex Polytope

如图所示,约束是线性的,因此凸多面体具有平坦的边,可行区域是多面体的内部和边界。

一个关键的见解是,任何约束线性优化问题的最优解总是在凸多面体的一个角上。正是有了这种认识,我们才能推动单纯形法的发展。

单纯形法从可行区域内的某个点开始,然后随着算法的每次迭代,从凸多面体的一个相邻角(代表问题的可能解决方案)映射到另一个相邻角,使得每一步都给出比前一步更好或等价的解决方案。

这很难令人满意地描述单纯形法,所以如果读者想要对该方法有更深刻的直觉,我推荐访问这篇文章,或者观看 PatrickJMT 的单纯形法视频系列的前两个简短的视频,它们很好地介绍了该方法解决的各种问题以及它是如何工作的。

在选修运筹学或最优化课程(尤其是在大学本科水平)并复习了涵盖单纯形法的网上可用资源后,几乎可以肯定的是,人们将会接触到用单纯形法求解线性规划问题的 tableau 方法。用 tableau 方法解决线性规划问题的一些例子在这里这里这里给出。

不幸的是,tableau 法通常是在涉及单纯形法的课程或课本中提到的唯一方法。因此,许多实现单纯形法的计算机程序直接实现了 tableau 法。tableau 方法是用来用笔和纸手工解决线性规划问题的。因此,它在计算上效率不高,并且在以计算形式实现单纯形法时不应该被选择。

在 Jupyter 笔记本中,我实现了单纯形法的一个版本,它使用 NumPy 中的矩阵运算代替 tableau 方法来解决线性约束优化问题。这样,我们得到了单纯形法的一个更加有效、简洁和自然的实现。

如果读者希望遵循以下程序中使用的精确数学和符号,请参考 Nash 和 Sofer 的线性和非线性规划的第 5 章。

单纯形法在今天的实践中很少使用,已经被更快的内点法所克服。然而,当单纯形法在实践中实现时,它通常是用矩阵分解来开发的,矩阵分解提供了一种甚至比本文给出的矩阵运算方法更快的单纯形法实现。对于低维线性规划问题,这里给出的矩阵运算方法是好的,然而,当开始解决具有数百或数千个变量的问题时,使用矩阵分解实现单纯形法更有意义。

我希望这篇文章能给读者一个高层次的直觉,让他们了解那些很少被提及但最终实现单纯形法的更好的方法,并且所提供的程序可以作为使用 tableau 方法的单纯形法的其他效率较低的实现的一个有用的替代。

书单

  1. 线性规划与网络流, Bazaraa
  2. 线性和非线性规划, 纳什
  3. 线性与非线性规划,伦伯格
  4. 凸优化

利用 Matlab 开发三维人耳识别系统

原文:https://towardsdatascience.com/development-of-3d-ear-recognition-system-using-matlab-c2fab95e874b?source=collection_archive---------18-----------------------

处理 3D 耳朵图像的初学者指南

人脸、虹膜和指纹已被广泛用于个人身份验证的生物特征。在计算机视觉和图像处理中使用最先进的深度学习技术,使开发的系统的准确性提高了近 100%。然而,基于这些特点的生物特征识别系统很容易被伪造,尤其是基于指纹的身份认证,并且很难获取虹膜样本。因此,研究人员正在尝试开发新的身份验证特征。最近的研究表明,人类的耳朵代表了某种独特的形状和模式,可以用来识别一个人。

  1. 据报道,一个人的双耳的结构和形状几乎相同,但与其他人严格不同,这使其成为一种适合于个人识别的特征。
  2. 与面部不同,它不受年龄影响,即耳朵的形状不会随着年龄和时间而改变。
  3. 与指纹和虹膜不同,基于耳朵的生物特征识别系统不需要用户合作来获取样本,并且可以在不受限制的环境中无需用户的确认而被捕获。

可用于开发基于耳朵的生物特征识别系统的几何形状特征如图 1 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Key components of ear (source)

图 1 显示了主要的形态学组成部分,包括外耳轮(即耳朵的外部结构)、对耳轮、耳垂、对耳屏、外耳和耳轮脚。

从 2D 图像中提取特征相对容易,因为存在对应于颜色、形状和纹理的灰度值。在三维图像中,我们只有(X,Y,Z)点和深度值,这使得很难分析关键部件的几何形状。在从 3D 人耳图像中提取特征之前,我将讨论开发人耳生物识别系统的预处理步骤。其中一个困难的部分是找到耳朵的位置,并从整个图像中裁剪出来。在本文中,我使用鼻尖的深度值从整个侧面人脸图像中裁剪出耳朵。

关于数据库

我们使用了圣母大学(UND)的数据库,这些数据库免费供公众使用。如下所述,所获得的数据库属于几个集合:

  • 集合 E : 114 个人,464 张可见光侧脸(耳)图像,拍摄于 2002 年。
  • 收藏 F : 302 个人体对象,942 张 3D (+对应 2D)侧面(耳)图像,拍摄于 2003 年和 2004 年。
  • 收集 G : 235 个人类对象,738 张 3D (+对应的 2D)侧面(耳朵)图像,拍摄于 2003 年至 2005 年。
  • 收集 J2 : 415 名人类受试者,1800 张 3D (+对应的 2D)侧面(耳)图像,拍摄于 2003 年至 2005 年之间。

然而,在我们的实验中,我们使用了集合 F 和集合 G 样本。

读取 3D 深度图像

数据库的示例图像是. abs.gz 格式。不过,UND 也提供了相应的 RGB 图像,但我只使用了 3D raw 图像进行实验。您可以读取原始图像并可视化 X、Y 和 Z 的每个平面,如这里讨论的。整个过程与三维人脸可视化的过程相同。但是,耳朵区域的裁剪与面部部分的裁剪略有不同。接下来,我将讨论如何从整个 3D 图像中裁剪耳朵区域。

耳朵检测和裁剪

在裁剪 ROI(感兴趣区域)之前,让我们先看看图像在数据库中的方向。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2: 3D visualization of database image.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: Visualization in Meshlab

图 2 和图 3 是同一主题的不同角度的视图。你可以使用 Matlab 旋转并使其方向一致。从上面的图中可以清楚地看到,数据库图像带有侧脸,只有整个脸部的耳朵部分对我们来说是重要的。因此,我们必须从整个面部只修剪耳朵。要裁剪耳朵区域,首先让我们了解每个图像中可用的深度信息。如果用于获取图像的相机被放置在面向原点的 z 轴处,并且人正看着 y 轴的递增值,则耳尖将具有最小深度值,鼻尖将具有最大深度值。如果仔细观察图 2,您会注意到深度值从 1900 增加到 2000。这意味着它的耳尖离相机很近。要了解更多关于耳尖深度的信息,请看这篇文章的图 5。唯一的区别是,我计算的是鼻尖,而我们讨论的是耳尖。从图 3 中可以看出,耳尖具有最小的 z 值,而鼻子具有最大的 y 值

参见图 2,我们可以说鼻尖在 y 方向上的值约为-55 单位。耳朵和鼻尖之间的距离大约为 25 个单位,并且对于每张图像来说几乎是固定的,除非图像没有捕捉到除此之外的角度。我们将在这篇文章的后面讨论它,现在,我凭经验发现 50 个单位高度和 25 个单位宽度的矩形形状足以覆盖整个耳朵区域,如果这个矩形形状距离鼻子点+/- 25 个单位。这里,鼻尖为负值时考虑+25,即要捕捉右耳图像(如图 2 所示),当 y 值(鼻尖)为正时考虑-25,人正看着 y 值的增加值。这是传感器对左耳成像的情况。要理解 ROI 的裁剪过程,请参见图 4。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4: Cropping ROI

然而,一些图像样本是在不同的方向收集的,如图 5 所示。对于这样的图像,我没有发现耳朵和鼻尖之间有任何关系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5: Image captured at different angle.

因此,我没有选择这些图像进行进一步的处理。(如能对这些图像的处理提供任何帮助,我们将不胜感激)。考虑图 4 所示的 ROI 裁剪方法,得到的图像如图 6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6(a)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6(b)

图 6(a)和 6(b)表示以不同角度示出的被裁剪的耳朵区域。这些图像可能有孔洞、噪声;因此,有必要对其进行仔细的预处理。在下一节中,我们将讨论去除尖峰、孔洞填充和去噪的方法。

去尖峰、填洞和去噪

去尖峰:3D 面有噪声,包含尖峰,因此需要应用平滑技术。在我们的研究中,我们将 2D 加权中值滤波技术的概念扩展到三维人脸图像。所研究的技术使用网格中值滤波的加权中值实现来执行 3D 数据集的滤波。

**补洞:**去除尖刺会导致孔洞的产生,因此有必要对这些孔洞进行补洞。为此,我们使用了 3D 插值。在所有的插值技术中,我们使用了’‘立方’。在三次插值方法中,查询点处的插值基于每个维度中相邻网格点处的值的三次插值。这种插值基于三次卷积。

**去噪:**我用 3D 高斯滤镜去噪。

用于预处理步骤的代码如下所示。

最后,预处理后的人耳图像如图 7 所示。我们发现一些孔在预处理步骤后仍然存在,这意味着进一步改进是可能的。为此,您可以使用其他方法来生成更好的特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7: Pre-processed ear image

最后,我从云点生成网格,用于从 3D 裁剪的耳朵图像中提取特征,这将在下一篇文章中讨论。完整的代码可以在我的 GitHub 库中找到。您可以下载并使用它对 3D ear 数据集进行预处理。如果你觉得这篇文章有帮助,请随意投赞成票。

我要感谢 Jayeeta Chakraborty ,他同样为开发这个项目做出了贡献。在下一篇帖子里,我将分享 3D 人耳识别的迭代最近点 (ICP)方法。[编辑:由于一些权限问题,我现在不被允许分享 ICP 的代码。]我希望这篇文章可以帮助初学者开始使用 3D 数据库。

利用 Matlab 开发三维人脸识别系统

原文:https://towardsdatascience.com/development-of-3d-face-recognition-using-matlab-a54ccc0b7cdd?source=collection_archive---------25-----------------------

处理 3D 人脸图像的初学者指南

在过去的十年中,已经提出了几种用于图像处理和计算机视觉应用的机器学习算法。LBP、HAAR 是一些流行的算法,它们被广泛地用于人脸识别,并且产生极好的结果。但是,这些算法大多不适合无约束环境下的实时识别。最近,最新的深度学习技术已经成为超越传统机器学习算法的新宠。人脸识别应用程序处理的图像只不过是范围(0–255)内像素值的组合。算法在这些灰度值中找到一个有区别的模式,并将其视为一个特征,该特征被认为对于每幅图像是唯一的。然而,在 3D 图像中,不存在像素信息,而只有每个点的位置(x,y,z)可用。这使得很难在 3D 图像中找到图案。

最近,我开始研究 FRGC2.0 3D 人脸数据集,最初,我无法找到足够的资源来处理 3D 图像。终于,过了一段时间,我看到了一篇基于 3D 人脸识别的论文,作者是阿杰马勒·米安,在此感谢他提供的有益建议和参考。我还想提一下我的同事 Jayeeta Chakraborty,他同样为开发这个项目做出了贡献。在这篇文章中,我将讨论开发三维人脸识别系统的预处理步骤,以便其他寻找类似工作的人可以有一个良好的开端。

读取 3D 深度图像

物体的 3D 图像包含物体中每个点的高度、宽度和深度。通常,3D 原始数据集,例如 FRGC 2.0 人脸数据库、集合 F 和集合 G 的 3D 人耳数据库中具有图像文件。abs、. abs.Z 或. abs.gz 格式。图 1 显示的是 FRGC 2.0 三维人脸数据库的图像样本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些图像是压缩的 ASCII 文本文件。建议不要预先解压缩数据集,因为扩展这些文件可能需要很大的磁盘空间。每个图像文件都有一个三行标题,给出行数和列数。接下来是四幅图像。第一个是所谓的“标志”图像,其中像素值为 1 意味着该像素的相应(x,y,z)值有效。如果标志值为零,您应该忽略该像素的(x,y,z)分量。跟随旗帜图像的是 X 坐标图像、Y 坐标图像和 Z 坐标图像。都是浮点图像。您可以使用每个范围像素的 3D 坐标,也可以丢弃 X 和 Y 图像,只关注 Z 值。请注意,图像的“纵横比”不一定是 1。以下代码部分可用于获取 x、y、z 和标志值。

您可以使用 imshow()函数打印 x,y,z,这将显示相机朝向 x 轴、y 轴和 z 轴时拍摄的图像。连接所有你能看到的图像,如图 2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们提取了云点,将其转换成。ply 文件,并显示它可视化三维形状的图像。下图 3 显示了人脸的 3D 视图。因为原始图像包含包括颈部和肩部的面部图像,这对于特征提取过程是不需要的。因此,我们必须从整个图像中只裁剪人脸区域,这将在下一节中讨论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(a)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(b)

图 3:以上数字是同一主题。图(a)表示使用 Matlab 的 3D 可视化,而图(b)是在 Meshlab 工具中显示时产生的。

人脸检测

为了从整个图像中只提取人脸区域,我们利用了深度信息。如果您注意到图 4 中所示的图像,可以观察到对象面向 z 轴,传感器捕捉到正面。因此,噪声提示点距离摄像机的深度最小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4: Subject is facing towards camera in z-axis

如果你仔细观察图 3,你会注意到深度值从 1500 增加到 1700,当我们从鼻子点到耳朵。如果仍然不清楚鼻尖的概念,请看图 5。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5: Nose tip detection

你会注意到黑点显示的鼻尖( P )的 z 值(深度)在 1450 到 1480 左右,假设是 1460。现在考虑以鼻尖’ P '为中心,我们画了一个尺寸为 140 单位的正方形,如图 6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6: Face region cropping

经验上发现正方形的大小适合于覆盖面部区域。唯一的要点在于,选择正方形来表示人脸区域。最后,从整幅图像中裁剪出面部部分,我们得到了如图 7 所示的人脸。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7 (a): Cropped facial region

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7 (b) : Cropped face image

图 7 (a)和 7(b)表示当在不同角度可视化时裁剪的面部图像。一旦你得到了裁剪后的人脸区域,下一步就是去尖峰,孔洞填充和去噪。

去尖峰、填洞和去噪

去尖峰:3D 面有噪声,包含尖峰,因此需要应用平滑技术。在我们的研究中,我们将 2D 加权中值滤波技术的概念扩展到三维人脸图像。所研究的技术使用网格中值滤波的加权中值实现来执行 3D 数据集的滤波。

**补洞:**去除尖刺会导致孔洞的产生,因此有必要对这些孔洞进行补洞。为此,我们使用了 3D 插值。在所有的插值技术中,我们使用了’‘立方’。在三次插值方法中,查询点处的插值基于每个维度中相邻网格点处的值的三次插值。这种插值基于三次卷积。

**噪声去除:**数字图像易受不同种类噪声的影响。噪声是图像采集方法错误的结果,所产生的值不能代表实际场景的真实强度。再次有许多方法来消除噪声,我们使用三维高斯滤波器。

这是经过所有预处理步骤后的最终图像,如图 8 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 8: Pre-processed image.

下面显示了用于人脸区域检测、人脸裁剪、去尖峰、孔洞填充和去噪的源代码。

经过所有的步骤,我们得到的最终输出是一个网格图像。该网格图像可以根据应用要求用于特征提取技术。在我们的例子中,我们提取了 PCA 特征,以及线、点和面特征,我将在下一篇文章中讨论。在另一个实验中,我们将 ICP 应用于网格图像,以匹配产生更好结果的图像。如果要运行 ICP 算法,建议有 GPU。

完整的代码可以在 GitHub 库获得。您可以下载并使用它来预处理您自己的 3D 人脸数据集。如果你觉得这篇文章有帮助,请随意投赞成票。

在下一篇帖子中,我将分享使用主成分分析 (PCA)和迭代最近点 (ICP)的基于特征级和得分级融合的人脸识别【编辑:由于一些权限问题,我暂时不分享 PCA 和 ICP 的代码。].

社交聊天机器人的发展

原文:https://towardsdatascience.com/development-of-social-chatbots-a411d11e5def?source=collection_archive---------22-----------------------

社交聊天机器人设计简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image credit pixabay.com

社交聊天机器人或智能对话系统有能力与人类进行对话。模仿人类对话并通过图灵测试一直是人工智能(AI)运行时间最长的目标。即使在电影中,许多电影,如《T4》、《她的 T5》和《钢铁侠 T7》都展示了聊天机器人技术如何给人类和机器的互动方式带来革命性的变化。

在 20 世纪 70 年代初,有许多人试图创建智能对话系统,但这些系统是基于手工制作的规则设计的。2016 年,聊天机器人被认为是“下一件大事”。包括谷歌、微软、脸书和亚马逊在内的主要 IT 公司都发布了自己版本的聊天机器人平台。由于性能、设计问题和糟糕的用户体验,这些聊天机器人非常糟糕。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Google search trend of term“chatbot” from 1 Jan 2015 to 26-Dec 2018 source

但是由于最近在自然语言处理(NLP)方面的进步( BERTELMoULMFiTOpenAI transformer ),谷歌已经能够将文档检索性能提高 50–100%。因此,我们可以假设 NLP 的 ImageNet 时刻即将到来。在未来几年,聊天机器人很可能会变得更加广泛可用。

应用程序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image source: Woebot website

如果设计得当,聊天机器人可以改变许多领域,如教学、电子商务、法律实践、个人助理、管理等。

让我们来介绍一下 Woebot ,一个真正的 AI 治疗师。它为用户提供情感支持,并以自然的方式交流。这个过程有助于缓解压力,人们喜欢和它交谈。

XiaoIce 是社交聊天机器人的另一个很好的例子。它是由微软开发的,被认为是世界上最流行的聊天机器人。它有一个 18 岁女孩的个性,有趣,可靠,有同情心,深情。

你知道在 messenger 上有超过 5 个 AI 法律助理195 个人助理吗?让我们简单讨论一下,如何设计这些社交聊天机器人的方法之一。这篇文章旨在对 XiaoIce 的设计做一个基本的介绍,在论文中有描述。

基本设计

对于社交聊天机器人系统,需要高情商(EQ)和高智商(IQ),因为这些系统应该帮助用户完成特定的任务,并提供情感支持。聊天机器人的独特个性使其更加用户友好。一个社交聊天机器人必须有能力根据用户的兴趣领域来个性化回答,使之令人鼓舞、激励和适合。

小冰已经发展了超过 230 种不同的技巧,包括电影推荐、安慰、讲故事等。它还通过产生社交上有吸引力的反应来展示情商,并根据情况改变谈话的话题。它被设计成一个 18 岁的女孩,有创造力,有趣,可靠,有同情心。

社交聊天机器人评估指标:CPS

测量社交聊天机器人的性能是很困难的,因为过去使用图灵测试来评估性能。XiaoIce 是使用每次会话的会话次数(CPS)作为指标进行评估的。因为图灵测试不能测量用户的情感投入。CPS 是会话中聊天机器人和用户之间的平均对话次数。预期的 CPS 对应于长期合约。

作为分层决策过程的社交聊天

为了实现设计目标,人机交互被认为是一个决策过程。然后,聊天机器人会针对长期参与进行优化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Human-XiaoIce chat sample (source)

XiaoIce 可以通过使用各种技能使对话模式多样化来保持用户的兴趣。每个对话模式都由一个技能维护。顶层流程通过转换技能来处理整体对话模式。由当前所选技能控制的低级流程处理响应,以生成聊天片段或完成任务。例如,顶层流程可以从核心聊天技能切换到歌曲推荐。歌曲推荐技能可以推荐一首歌曲或选择采取类似切换到音乐会门票预订技能的动作,以预订用户喜爱的乐队的未来音乐会活动。

这种决策可以在称为马尔可夫决策过程(MDPs) 的数学框架中进行。所以聊天机器人通过 MDP 导航,与用户互动。在每一轮谨慎的对话中,聊天机器人观察当前的聊天状态,并选择一个技能发送响应。然后聊天机器人会收到用户的奖励。聊天机器人找到最佳策略和技能,以最大化 CPS。

系统结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

System Architecture of XiaoIce (source)

用户体验层:这一层将小冰连接到所有主要的消息平台,通过两种方式进行沟通。全双工模式是一种基于流的会话模式,支持语音呼叫。在基于消息的对话模式下,用户和聊天机器人轮流发送消息。这一层还包括语音识别、图像理解和文本规范化。

对话引擎层:该层由对话管理器、移情计算和对话技巧组成。对话管理器跟踪对话状态,选择对话技能或核心聊天。移情计算模块旨在从对话中理解人类的情感和兴趣。该模块帮助小冰获得社交技能,并根据小冰的个性生成个性化的响应。

数据层:该层由各种数据库组成,这些数据库以文本-文本对和文本-图像对的形式存储对话数据,非对话数据,如知识图表、用户资料、聊天机器人资料等。

数据科学家现在应该使用的开发实践。

原文:https://towardsdatascience.com/development-practices-that-data-scientists-should-use-now-7c4f54d6b92?source=collection_archive---------31-----------------------

我曾与经验丰富的开发人员、专家数据科学家、新人、非程序员一起工作,所有这些人都有一个共同点:他们必须编写代码。

正常情况下,这篇文章应该是非常笼统的,大多数程序员都是这样工作的,但是由于一些数据科学或数据工程实践固有的实验性质,我发现,有时候,这些建议中的一些,呃…被忽视了。因此,这里是{科学家|工程师}应该知道的关于编码实践的绝对最低数据。

你从来不为自己写代码,而是为别人写。

这是我告诉编码数据科学家的第一条基本规则:永远不要为自己写代码,而要为别人写。

而且,请注意,“其他”人可能是…你。如果不为同事写,至少为未来的自己写。

这意味着什么?

  • 注释您的代码。是现在的两倍:)实际上,在编写代码之前进行注释也是一个很好的实践:)
  • 礼貌地写。使用显式的变量名,文件名(我看见你了,untitled09.ipynb 先生)。删除/注释你不再使用的代码。
  • 记录你的代码(不完全等同于注释)。放一篇自述,助读者一臂之力。
  • 收集你正在使用的模块的版本,以便在一年内(谁知道一年内会创建多少 JS 框架),当你不得不匆忙运行项目时,你会找到你需要的模块版本。

不推入回购的代码是不存在的。

我很惊讶有这么多数据科学家在他们自己的 GPU 包装的机器上工作,所有的铃铛和哨子,以及一个非常脆弱的硬盘驱动器,他们所有的生命都装在一个小小的空间里。

比如说,硬盘的密度是每平方英寸 500 千兆比特。这意味着我微小的动作会导致灾难。考虑到我自己撞上家具的能力,对于这么小的空间来说,这是很大的信任。

因此,对待你电脑上的代码,就像它不存在一样。它没有版本控制,没有审核,没有 CIed,没有备份。它。只是。不会。存在。

哦,你知道 Jupyter 笔记本实际上是版本的文件吗?

在选择架构时尽可能保守

你是数据科学家?太好了。你想使用最新的框架,它在 Github 知识库上有半颗星,发布于 3 年前,从那以后再也没有接触过(抱歉,没有链接)。不要。

你将有很多不确定性要处理,所以请避免在薄冰上滑冰,使用一个废弃大学的不起眼的 Pytorch 叉子。

一行代码花费的时间是编写时间的 10 倍

…说到这里…你必须意识到,一行代码的成本远远超过了编写它所花费的时间。甚至是死代码。

因此,当你添加一个没有人要求你的新功能时,当你训练你的模型来检测不属于规格的模式时,你只是在建立技术债务。

成功的编码会议通常包括修剪代码中不必要的部分。这是管理复杂性的一个简单方法。

Trim your code.

你也从来不为自己训练。

机器学习通常涉及训练数据,评估你的训练,并建立一个可扩展的、强大的推理机。

第一部分涉及大量的实验。总会有一个更好的人来改进你的机器学习设计。我是说,即使是你,伊恩·古德菲勒,如果你在读这封信,相信我,有人比你更好。比如你未来的自己!

所以,根据经验,永远不要为自己训练,而是为别人训练。这意味着,记录,评论,和两件主要的事情:

  • 向其他人提供根据您的原始数据进行训练的方法(例如,将您的数据版本化并给出其 URL!)
  • 给其他人一些方法来根据你的测试数据评估

似乎很明显?去读一些深度学习的论文,你会明白并不总是那么明显:)

错误的编码者复制/粘贴。伟大的程序员无耻地偷窃。

程序员做的事情有一半是在谷歌上查找答案。啊,堆栈溢出的帖子来了,解释如何解决你的问题!

现在,一旦你复制并粘贴了解决方案,请参考原始的堆栈溢出帖子,例如作为注释。虽然不多,但当你试图弄清楚你为什么这么做时,它真的很有帮助。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Even Microsoft does that!

当你以后查看你的代码时,这会节省很多时间。

不要用 Python 2(拜托)

Don’t scare the python

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

啊,来吧…现在是 2019 年,真的。Python 3 带来了如此多的东西。另外,你不喜欢 UnicodeErrors,对吧?

总而言之,遵循这些简单的规则会让你成为一个更好的程序员、更好的数据工程师和更好的数据科学家。如果你做的事情有目的,至少让其他人分享它!

你呢?你的最佳实践是什么?在评论里告诉我!

设计零射击学习

原文:https://towardsdatascience.com/devise-zero-shot-learning-c62eed17e93d?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Completely unrelated apart from the fact that people are ‘learning’ in this beautiful fresco: The School of Athens by Raffaello Sanzio

Fromme 等人(2013) 撰写的《设计:深度视觉语义嵌入模型》是一篇真正漂亮的论文。作者提出了一种新的图像分类方法,利用语言模型学习语义知识。该方法能够对训练期间观察到的数万个图像标签而非进行零拍摄预测。我将向您详细解释这种方法,并且我使用 Docker 在 AWS 上部署了一个 device model,以便您可以对其进行试验。

本文组织如下:

首先,我将向您解释“传统”图像分类器的潜在问题,以及如何通过结合计算机视觉和语言建模来解决这些问题。为了可视化模型的能力,我将向你展示一些由部署在 AWS 上的模型 I 做出的零炮预测的很酷的例子。最后,如果您想自己培训和部署这样一个模型,我将为您介绍一些有用的资源。

在经典编程中,你可能会定义一组规则,允许你从你的数据中计算答案规则和数据进,答案出。

如果我要求你写下一组规则,在给定像素值的情况下,判断任意图像是否包含汽车,你肯定会失败。这个任务太复杂了,无法手工表达这样的规则。所以我们做的就是“参数化规则”,从数据和答案中学习参数。数据和答案在,排除。 原则上,这是所有(监督)机器学习背后的思想。

卷积神经网络形式的“传统”图像分类器(相对于设计而言是传统的)是参数化函数,其学习为输入图像的 n 个可能类别中的每一个计算有意义的概率。概率分布通常用网络顶部的 softmax 层计算。

这种神经网络已经被证明在图像识别任务中表现出色,那么为什么还需要改进的方法呢?

最大的问题是,我们被限制在数据集的 n 个类别,我们在这些类别上训练我们的图像分类器。ImageNet 的精简版(1000 类)包含 90 多种不同品种的狗。因此,在这个数据集上训练的训练有素的分类器可以比我更成功地区分更多的狗品种,但它永远无法将图像分类为狗,因为“狗”这个词本身不是一个类别。

另一方面,设计模型预测接下来的四张照片非常像“狗”,即使它从来没有被展示过“狗”类别的训练对。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

免责声明:如果你为一个受限的设置训练一个模型,例如医疗诊断,带有 softmax 输出层的分类器当然是一个完全有效的好方法。你的模型不需要归纳成无数在训练中没有看到的不同类别。

回到我们的狗身边。原则上,您可以构建一个手工制作的层次结构,确定如果一个图像包含一只“德国牧羊犬”,它就自动包含一只狗。但是手动为所有现有的单词构建这样一个层次结构是大量的工作,这是我们在机器学习中极力想要避免的。毕竟,你选择将我们的世界划分为越严格定义的类别,构建标签数据集就越复杂和昂贵。

让我们仔细看看图像分类器返回的类别概率:

使用 softmax 输出图层,每张图片只能属于一个类别,因为 softmax 旨在将高概率分配给一个类别。这意味着你不应该引入一个额外的类别“狗”,因为网络将很难决定是将图像归类为“狗”还是特定的狗品种。

原则上,这个问题可以通过在输出层中使用 sigmoid 激活函数而不是 softmax 来解决,并允许不同的标注适用于单个图像。然后,您将不会预测图像的 n 个类别概率的总和为 1,而是预测每个类别的一个独立概率,即该类别的对象是否可能包含在图像中。这允许你引入额外的类别,如“狗”,而不与狗的品种竞争。

我这么说是什么意思?

如果在网络顶部使用 softmax 图层,您可能会得到类似“该图像包含一只德国牧羊犬的概率为 87%”的答案。所有其他 999 类加起来占 13%。

如果您在输出图层中使用 sigmoid 并允许不同的类别包含在图像中,您可能会得到类似于“图像包含德国牧羊犬的概率为 87%,狗的概率为 89%,法国斗牛犬的概率为 67%,…,核潜艇的概率为 0.13%,飞机的概率为 1%”的答案。请注意,概率的总和不再是 100%。

使用这种方法,分类器不必决定是否应该将高概率分配给“dog”或“German shepherd dog”,因为它必须使用 softmax 输出层。它决定每个类别是否可能被检测到,而不考虑其他类别。

那么问题解决了吗?

比方说,你为 ImageNet 找到或创建了包含成千上万个附加类别的标签,即“狗”,并实际上成功训练了一个卷积神经网络,允许预测成千上万个类别概率。网络现在可能会说“这个图像包含一只德国牧羊犬和一只狗”。网络能否回答这个图像中是否包含“小狗”、“小狗”或“猎犬”的问题?不,它不能,因为当你添加像“狗”这样的类别到数据集中时,你没有包括“小狗”、“小狗”或“猎犬”这样的类别。那么接下来,我们应该把这些词也作为潜在的标签吗?

问题是,这些分类器都不能预测它们在训练中没有遇到的类别,它们不能将关于它们已经被训练的类别的语义信息转移到看不见但相似的类别。

像 DeViSE 这样的模型为这个问题提供了一个真正优雅的解决方案,它将图像识别任务与从在未标注文本上训练的语言模型中学习到的关于单词/类别相似性的语义信息相结合。

基本上,目标是开发一个能够推断图像包含“狗”、“小狗”、“小狗”或“猎犬”的模型,因为这些词与“德国牧羊犬”相似。我们希望我们的模型能够归纳出在训练过程中从未遇到过的类别,因为这些类别在语义上与模型被训练的类别相似。这就是所谓的零射击分类。

设计

建立一个设计模型始于在一个未标注的文本语料库上训练一个语言模型。

每个单词(或令牌)都被表示为高维空间中的一个点,或者用简单的英语来说,表示为一个向量,比如说 300 个浮点数(当然也可以是 400 或 500 或 1325,但在本文的其余部分,我们假设是 300)。这样的向量被称为单词向量,单词向量包含的数字是模型的参数。这意味着,随着模型的学习,优化器可以更改这些值。接下来,你需要一个神经网络,一个参数化的函数,它可以根据过去的 m 个单词来预测句子的下一个单词。简单地说,这就提出了一个问题“如果你有这个由 m 个单词组成的句子,下一个单词会是什么?”。问这个问题的好处在于,你不必对你的数据集做任何标记,你只需浏览任何文本语料库,并反复询问你的神经网络下一个单词是什么。网络通过调整其参数来学习预测下一个单词,这些参数包括代表单词的所有单词向量中的数字。

300 个元素向量指向高维嵌入空间中的一个点,并且相似的单词在该空间中彼此接近,因为同义词倾向于出现在相似的上下文中。这个高维空间中代表“狗”的点会接近代表“doggy”的点。(在这个高维空间中“接近”的一种可能解释将在后面解释。)

我知道这一切对你来说可能听起来非常吓人,但不要担心,此时我希望你知道的是,在训练语言模型后,代表单词“dog”的 300 个数字更接近于代表“doggy”的 300 个数字,而不是代表“train”的 300 个数字。

如果你自己还没有训练过语言模型,但有兴趣这样做,我强烈推荐你跟着这个一起编码,我保证,我在这里写的一切对你来说会更有意义。

目前,我们需要的只是语义上有意义的单词向量。幸运的是,我们可以在这里简单地下载经过训练的嵌入/词向量。

现在到了第二部分:将图像映射到这个丰富的高维嵌入空间。听起来很困惑?别担心,这比听起来容易。

我们采用基于预训练的 softmax 输出层的图像分类器,在网络的顶部截断最终的分类层,并用几个层来代替它们,这些层不预测 n 类的 n 类概率,而是简单地预测 300 个数字,这代表一个词向量。我们将分类问题转化为回归问题。

将图像映射到高维单词向量嵌入空间中,然后允许我们在这个高维嵌入空间中找到与其接近的单词——或者用英语来说:我们预测图像的单词向量,并找到具有相似单词向量的单词。

来自报纸:

我们的模型的一个明显的优点是,它能够对它从未观察到的候选标签做出合理的推断。例如,一个在标记为虎鲨、牛鲨和蓝鲨的图像上训练的设备模型,但从来没有标记为鲨鱼的图像,将可能具有概括为这种更粗粒度的描述符的能力,因为语言模型已经学习了与所有特定鲨鱼相似的鲨鱼的一般概念的表示。

例如,使用余弦距离与虎鲨最接近的 9 个术语是牛鲨、黑顶鲨、鲨鱼、大洋白顶鲨、沙洲鲨、灰鲨、蓝鲨、安魂鲨和大白鲨。与汽车最接近的 9 个术语是轿车、肌肉车、跑车、小型车、汽车、赛车、皮卡、经销商和轿车。

训练设计模型的主要步骤是:

  1. 下载字向量
  2. 下载带标签的图像数据集,即 ImageNet。完整的 ImageNet 数据集可以从这里下载(不过大约 170GB)。ImageNet 的一小部分可以从这里下载。部署在 AWS 上的模型是在完整的 170GB 数据集上训练的,但子集也工作得相当好。
  3. 找到你有一个词向量的 ImageNet 的类别。构建包含图像-单词向量训练对的数据集。
  4. 在预训练的图像分类网络的顶部截断最终分类图层,并用自定义图层替换它们以预测 300 个数字。在 PyTorch 中,可以这样做:

5.定义一个损失函数。也就是说,你可以使用余弦相似性的适应。记住,单词的数字表示是矢量。在学校里,你可能被教导过,你可以把向量想象成箭头。当两个箭头指向同一个方向时,它们是相似的(我们忽略箭头的长度)。余弦相似度计算两个向量之间角度的余弦。如果角度为 0,余弦相似度为 1,如果角度为 90,余弦相似度为 0。对于损失,当向量彼此更相似时,我们想要更小的数字,因此,当它们之间的角度更小时。因此,我们简单地将损失计算为两个向量的 1 -余弦相似度:

6.训练网络。

如果你想自己做这件事,我建议你按照 fast.ai 第 2 部分的这一部分编写代码。正式课程笔记本来了。我的笔记本稍微没那么杂乱/评论更多。它还使用 PyTorch 从头开始构建模型,而不是调用 fast.ai 便利函数来构建它。也可以随意借鉴。

让我们总结一下我们讨论的内容:我们不是建立一个返回 n 个类别的 n 个类别概率的模型,而是建立一个预测给定图像的单词向量的模型。然后我们简单地寻找具有相似单词向量的单词(近似最近邻搜索)。这允许模型利用语义知识来概括和预测在训练期间没有看到的类(零射击学习)。

这种方法还有一个额外的巨大好处:

  1. 语言模型的数据集根本不需要标记!我们使用的单词向量是在维基百科文本语料库上训练的,但理论上,你可以在所有书面文本的整体上训练大型语言模型。以这种方式学习到的语义相似性知识很可能比任何手工制作的语义相似性层次结构都要好!
  2. 您使用的数据集不必像使用传统图像分类器时那样维护良好!来自报纸:

也许更重要的是,虽然我们在这里训练的是一个精选的学术图像数据集,但我们的模型的架构自然适合于在所有可用的图像上进行训练,这些图像可以用(更大的)词汇表中包含的任何文本术语进行注释。我们相信,训练这种形式的大规模“开放”图像数据集将极大地提高视觉对象分类系统的质量。

好了,理论够了,让我们来玩玩模型吧!我使用 Docker 将它部署在 AWS 上,这样您也可以使用它。(免责声明:该应用程序在 AWS 上的单个 t2.micro 实例上运行,因此它在一年内保持在新客户获得的 AWS 免费层内。我的故事通常每天有大约 100 名观众,所以我不希望有太多的读者同时使用它。)

[## 设计

Fromme 等人的深度视觉语义嵌入模型(2013 年)](http://ec2-18-195-116-70.eu-central-1.compute.amazonaws.com:8000/apidocs/)

我们将使用该模型进行三种不同的零炮预测:

  1. 通过首先预测输入图像的单词向量,然后从大约 50.000 个存储的单词向量中找到近似的最近邻居,来计算输入图像的前五个零镜头预测(类别)。

我向该应用程序提供了大约 5000 张随机图片,这些图片来自我在培训期间创建的验证数据集。该应用程序为每张存储的图片预测一个单词向量。这使我们能够:

2.给定输入图像,预测语义相似的图像。这是通过预测输入图像的单词向量,然后对为存储图像预测的单词向量执行近似最近邻搜索来完成的。

3.给定一个输入单词,预测语义相似的图像。这是通过将输入单词翻译成其相应的单词向量,然后对存储图像的预测单词向量执行近似最近邻搜索来完成的。

让我们从 3 号开始。还有试试“鸟”这个词。ImageNet 中有几种鸟,即“信天翁”、“雪鸟”、“靛雀”、“美洲鹰”、“秃鹰”或“鸵鸟”,但没有“鸟”这一类别。

该模型预测以下图像最像“鸟”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“昆虫”也一样(不是 ImageNet 中的一个类别):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

包含类别“curch”。显然,该模型可以概括为“大教堂”类别:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单词“measure”没有出现在任何 ImageNet 类别中(事实上,没有一个动词是一个类别)。然而,该模型能够预测用于“测量”的以下图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“服装”一词也是如此:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单词“连衣裙”也不属于 ImageNet 中的任何类别,但是该模型预测了以下图片:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“跑车,跑车”是唯一包含“运动”一词的品类。该模型为“运动”预测了以下图片:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“武器”不是一个范畴:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“植物人”也不是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们试试别的:

函数wordvec_2_image需要一个,但接受两个单词作为输入。如果你传递两个单词,单词向量被平均(相加并除以 2)。让我们看看语言模型是否学会了平滑过渡,这意味着我们可以在词向量之间进行插值,并找到一些有意义的东西。

(Mikolov 等人,2013)证明了简单的算术运算揭示了表征空间中丰富的线性结构。一个典型的例子证明了向量(“国王”)—向量(“男人”)+向量(“女人”)产生了一个向量,它的最近邻居是皇后的向量。(引自拉德福德等人,2016 )

存储的数据集中预测单词“ship”的前四个图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有两艘旧帆船和两艘现代船。让我们检查一下模型对单词“船”+“帆”的预测:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,现代的船都走了,现在所有的船都有帆了。这是否意味着有意义的插值在这种模型中是可能的?嗯,我们只看了四张照片,所以我对这样的声明要小心。第五艘可能是现代船。帆只出现在船上,所以矢量这个词可能一开始就很接近。对它们进行平均会返回一个与“ship”和“sail”都非常相似的单词向量,我们看到的结果可能是一个巧合,而不是有意义的插值。

不出所料,单单“帆”就给出了类似的选择:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后一段相当含糊。让我们试着量化其中的一些:

我们用np.corrcoef(wordvectors.get_word_vector("ship"), wordvectors.get_word_vector("boat"))[0,1]计算两个词向量的皮尔逊相关系数来估计两个词的相似度(见笔记本)。数字越大意味着它们可能越相似。向量与其自身的相关系数是 1。

“Ship”和“bug”显然非常不相似,相关系数为 0.08。

可以算作同义词的“船”和“舟”给 0.56,“船”和“帆”给 0.59,“舟”和“帆”给 0.57。所以“帆”确实和“船”和“舟”都很相似。我们试着用一个与“船”不太相似的向量来插值,即“发动机”。

有些船有发动机,但不是所有的发动机都在船上。“船舶”和“发动机”的相关系数为 0.31。

“船”+“引擎”给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,现在有帆的船都走了。我们交叉核对一下。仅“引擎”的结果是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有这些东西都有引擎,但显然“引擎”并不自动意味着“带引擎的船”。看来有意义的插值原则上可能有这种视觉语义嵌入模型。注意我写出现可能*。请记住,我们只看到了几张图片。*

不过我不得不承认,我尝试的大多数两个单词的组合都没有产生任何有意义的结果。这可以归因于这样一个事实,我只为模型提供了大约 5000 张图片,以保持在 AWS 自由层内。你能找到其他很酷的组合吗?如果你有,请在评论中告诉我!

让我们试试 API 的另外两个函数。我们传递一张图片,并从存储的数据集中获得前五个零镜头预测和前四个语义最相似的图片。

“虾”和“对虾”都不是 ImageNet 中的类别:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source

这张图片的前五个零镜头预测是:

***crayfish mosquitofish needlefish goosefish ladyfish***

谷歌“小龙虾”,我能理解为什么模型认为它们和虾语义相似。该应用程序的所有存储图像都来自 ImageNet,因此,该模型不能返回一只虾的图像。我认为四个中的三个在语义上是相似的。孩子在那里做什么,我一点线索都没有…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后一次尝试是 ImageNet 中不包含的类别的图像。让我们尝试一个被包含的模型,看看这个模型是否在原则上是精确的*,而不仅仅是找到相似的类。下图显示了一只蓝色松鸦,ImageNet 中存在类别“松鸦”,*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source

前五个零射击预测是:

***jay Jay bobby Starr Shawn***

并且来自存储的数据集中语义上最相似的图像是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我是一名天体物理学家,不是鸟类学家,但对我来说,其中三只鸟的蓝白色羽毛位置正确,所以我认为这是一个成功。

到目前为止,我只给你们展示了成功的例子,但是当然,我也发现了几个预测是错误的例子。让我们试试这张图片:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source

该模型返回以下前五个预测

***dog beagling poodle kelpie turnspit***

而下面这四张图即使“北极熊”是 ImageNet 类别!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当被要求展示“猫”类别的图片时,这个模型也会展示狗。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source

然而,对于这张猫的图片,零命中率的预测是

***tabby fawn kitten cat grizzle***

并且该模型返回以下四幅语义相似的图片:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当要求图片语义上与单词“虎斑猫”相似时,我也会得到猫的图片…

如果您尝试其他单词或图片,并想找出某个特定单词是否属于 ImageNet 的任何类别,请下载该文件并在命令行中运行cat imagenet1000_clsidx_to_labels.txt | grep word

在这个资源库中,你可以找到一个笔记本来训练模型(基于 fastai),这是一个预训练的模型,以防你不想自己训练它,但想尝试应用程序,flask-app 将模型作为 API,关于如何使用 flask 开发服务器尝试应用程序的说明,以及关于如何在 Docker 容器中运行应用程序的说明。如果有兴趣学习 Docker 部署机器学习模型,可以考虑这门课。这要花几美元(我不是附属机构),英语也不完美,但我知道我到底在寻找什么来开始。

我发现这个视频对于在 AWS 上部署容器非常有帮助。只是一个警告:如果你试图在 AWS 上部署一个应用程序,并有资格获得 AWS 免费层服务(针对新客户),请确保使用 ec2 t2.micro 实例,因为其他实例没有资格免费使用。此外,请记住,没有“仅自由层帐户”,一旦您超出自由层限制,您将被计费。

如果这篇论文发表在 2019 年,而不是 2013 年,我可以很好地想象一些媒体的标题:“谷歌科学家创造了一个能看、能说、能描述从未教过的东西的人工智能……机器人将杀死我们所有人。”好吧,我在这里故意夸大其词,但在所有这些宣传中,向人们解释什么是机器学习,什么不是机器学习是很重要的,特别是如果你属于那些能够理解的人。最终归结为以下几点:

[……]机器学习和深度学习的核心问题是有意义地转换数据:换句话说,学习手头输入数据的有用表示——这些表示让我们更接近预期的输出。[……]所有机器学习算法都包括自动寻找这种转换,将数据转化为对给定任务更有用的表示。[……]从技术上来说,这就是深度学习:一种学习数据表示的多阶段方法。这是一个简单的想法——但是,事实证明,非常简单的机制,如果规模足够大,最终可能看起来像魔术一样。(引自 Chollet,Franç ois,用 Python 进行深度学习)

将输入图像转换为单词向量而不是 n 类概率的想法非常简单,但它允许我们做令人惊讶的事情,因为单词嵌入是连续的,并允许我们测量图像与未知类别的相似性——只需将数据转换为更有用的形式!此外,与“传统的”深度学习图像分类器(只要能够找到描述图像的词)相比,该算法能够利用更大和更不精确的真实生活数据集,这可以显著提高视觉对象分类方法的质量。

我希望你能从这篇文章中得到乐趣,并且我能教你一些东西。如果你有问题,请在评论中告诉我,我很乐意帮助你理解:)

机器学习研究工作流程的开发运维

原文:https://towardsdatascience.com/devops-for-machine-learning-research-workflows-bfd054da9f9e?source=collection_archive---------24-----------------------

我从独自研究中学到的一些东西

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一次做机器学习研究?或者也许你已经在一家大型机构中这样做过,现在你正试图自己解决这个问题?这篇文章送给你!

近年来,我一直在从事几个项目,这些项目需要专注和严格的实证研究。我的大部分工作都是独自完成的,不同程度地受到其他人的间接影响。因此,我有机会完全从零开始建立我的研究工作流程。

因为大量的研究都花在了运行受控实验和快速迭代想法上,所以拥有一个有组织的和健壮的研究环境是至关重要的。从我花费的大量时间(以及我犯的许多错误)中,我发现改进我的研究工作流程需要问自己以下两个问题:

  1. 我能做些什么来提高我对工作结果的信心?
  2. 我如何缩短我的反馈周期,以便我可以更快地迭代?

下面介绍的三个想法都回答了上面的一个或两个问题。

使开发与生产相匹配

你一直在做一个项目,它在你的笔记本电脑上运行良好。但是现在是时候扩大规模了。您可能想要运行更强大的机器,或者您可能想要运行更多的机器,或者您可能只想在代码运行时玩英雄联盟。像正常人一样,你决定开始在云上运行你的代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The Cloud. (For the screenreaders, literal clouds in the sky.)

虽然使用云计算提供商可以让您在水平和垂直方向上扩展您的实验,但代价是您的反馈周期通常会变长。其中一个很大的原因是你几乎立即开始调试“它在我的机器上工作”的问题。

对此的处理是确保您的开发环境与您的“生产”环境紧密匹配[1]。这通过减少由于环境不匹配而发生的错误数量,缩短了您的反馈周期。

为了使您的环境相匹配,我建议创建一个 Docker 映像,您可以在您的开发机器上和云中使用它。或者,您可以在云中的专用计算实例上进行开发,并将该实例的克隆作为生产机器启动。你可以在【GCP】AWS 中使用磁盘快照来完成这项工作。

使用通用部署脚本

我在自己的设置中做的一件比较另类的事情是,我有一个通用的部署脚本。该脚本的目标是能够获取您在开发机器上运行的任何 shell 命令,并在生产机器上运行它。

该脚本有两个参数:一个标识符**job-name**和一个 shell 命令**cmd**。然后,它执行以下操作:

  1. **<cmd>**以及其他一些设置命令写到我的工作目录中的一个名为**run.sh**的文件中。
  2. 将我当前的工作目录(包含我所有的脚本和代码)打包到一个名为**<job-name>.zip**的文件中。
  3. 上传**<job-name>.zip**到云端。
  4. 启动一个实例,a)下载并解压**<job-name>.zip**,b)执行**run.sh**,c)自行关闭。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The deploy script in action. (Please ignore the fact that I’m trying to use Python to run a shell script here.)

这有两个主要好处:

  • 我可以确定在我的开发机器上运行的确切代码现在正在生产中运行。这减少了错误的发生,并且让我迭代得更快
  • 为了更好的再现性,我现在可以审计和重新运行任何曾经在生产机器上运行过的代码。这增加了我对结果的信心

处理数据

许多机器学习工作流(例如,任何涉及监督学习的工作)也涉及从大型数据集读取。要使数据集在开发和生产环境中保持同步,您可以做几件事:

  • 将数据包含在您的工作目录中。如果您有大量数据,这就不太好了,因为您必须在每次部署时将数据上传作为工作的一部分。
  • 在每台机器上维护单独的数据副本。如果您的数据不经常更改,这种方法还可以,但是如果您的数据经常更改,这种方法就很麻烦了。每次数据发生变化时,您都需要更新 Docker 映像或磁盘快照。
  • 将数据存储在对象存储器(如 S3)中,并在每个任务开始时下载数据。如果作业的执行时间不是由最初的数据传输决定的,那么这种方法非常有效。
  • 使用 NFS 在开发和生产机器之间同步数据。如果您不想编写用于访问文件的 S3 客户端代码,这是一个很好的选择。

下一节将讨论最后两种选择,并解释为什么我更喜欢后者。

使用 NFS 存储数据

在一个个人项目中,我用 GCS (GCP 的 S3 等价物)存储了一段时间的数据。使用 GCS 有很多好处:

  • 存储很便宜
  • 您可以存储数 Pb 的数据,而不会增加延迟
  • 通过向他人发送 URL,您可以轻松地与其他人共享数据
  • 您可以从任何地方访问 GCS

不幸的是,GCS 缺乏文件系统的易用性。这表现在几个方面[2]:

  • 浏览文件和目录是一件痛苦的事情。像“计算一个目录中文件的数量”这样的操作在文件系统中非常简单,但是在 GCS 中却非常困难。(这是因为 GCS 本身没有目录结构的概念。)
  • **编写代码很麻烦。**任何涉及数据的操作都需要与 GCS 客户端库或gsutil命令行工具接口。
  • 大文件可能会带来问题。GCS 支持逐段流式文件,但是如果您的研究代码不支持,您需要首先将整个文件下载到您的本地系统。

我的研究工作流程非常适合使用文件系统,而不是像 GCS 这样的对象存储,所以我硬着头皮在 GCP 上建立了一个 NFS 服务器。之后,我配置了 Docker 实例和 Kubernetes 集群,以便在启动时挂载 NFS 服务器。

在切换到 NFS 之后,操作通常是这样的:

def load_model_state_from_path(path):
  fd, name = get_tmp_filename()
  logger.info('Downloading %s -> %s', path, name)
  blob = get_blob(path)
  with os.fdopen(fd, 'w') as ofd:
    blob.download_to_file(ofd)
  rv = torch.load(name)
  os.unlink(name)
  return rv

现在看起来像这样:

def load_model_state_from_path(path):
  return torch.load(path)

我在编写新代码中获得的便利使得快速迭代变得更加容易。通过一点点关于如何处理数据文件的训练(例如,使用版本控制方案,避免覆盖数据),你还可以对你的结果建立信心

建立 NFS

*那么,我该如何在我的工作流程中设置 NFS 呢?*您有两个主要选项:

**使用交钥匙解决方案。**这将是 AWS 上的 EFS 或 GCP 上的云文件存储。此解决方案易于设置,但维护成本很高(存储成本约为 0.20 美元至 0.30 美元/ GB /月)。

滚动你自己的 NFS 服务器。如果你有成本意识,这个解决方案是最好的。设置您自己的 NFS 服务器的成本是:

  • 每月 0.04 美元/ GB(比云文件存储节省 80%),此外
  • 大约每月 50 美元的开销(运行为 NFS 服务器提供动力的计算实例)

至少在 GCP,建立一个单节点文件服务器相当容易。

不管怎样,一旦 NFS 启动并运行,您需要将它连接到您的开发和生产机器。

  • 如果你在 GCP 上运行 Kubernetes(即谷歌 Kubernetes 引擎),本指南提供了你将 NFS 安装到豆荚上所需的一切。
  • 如果您在裸计算实例上启动作业(并且在 Linux 上),您将需要编辑您的/etc/fstab文件以将您的 NFS 挂载到实例上。这里有一个关于如何做的指南
  • 另一个指南是专门针对 AWS 的,它将帮助您将 EFS 挂载到 EC2 实例上。

给自己发送电子邮件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A picture of my Gmail inbox, with many email notfications from various jobs.

当检查我过去的实验时,我会:

  • 强迫性地刷新 GCP 仪表盘,从而浪费时间,或者
  • 忘记我的实验几天(有时甚至几周)。

我对这个问题的解决方案非常简单:我让我的工作在达到令人满意的检查点时给我发电子邮件(例如,完成一次迭代培训)。这使得我的反馈周期尽可能的短,而不用我花任何时间检查我的实验。

你可以更进一步,在邮件中加入有用的信息。有一段时间,每当一个实验结束,我就手工绘制损耗曲线。为了让自己轻松一些,我现在让我的工作以编程方式生成损失曲线,并将它们附在我的电子邮件中。

当然,如果你发送的太多,电子邮件通知可能会适得其反。为了减少收件箱的混乱,我遵循以下两条原则:

  • 偏向于发送太少的邮件,而不是太多的邮件。
  • 如果有必要,利用你的电子邮件客户端的对话线程功能,给你自己发送相同主题的邮件。

对于个人项目,我会推荐 Mailgun 。集成到您的代码中非常简单,如果您每月发送的电子邮件少于 10,000 封,它也是 100%免费的。

最后的话

虽然我认为我在过去的几年里进步了很多,但我仍然认为我还有很多要学的。我很想听听你对这些技巧的想法,或者对你自己的环境有什么想法!

最初发表于www.yuzeh.com。感谢@ no diraZack阅读本帖的早期草稿。

脚注

  1. 这里我滥用了开发环境和生产环境的术语。我的开发环境是我编辑和测试代码的地方;通常,我会手动启动我的笔记本电脑或专用计算实例。我的生产环境是代码无需修改就能运行的地方;它通常是以编程方式启动的计算实例。
  2. 这里的难点描述了 GCS,但通常适用于许多存储系统,如 HDFS 或任何类型的数据库。虽然我不愿意说“文件系统”是轻松导航和存储数据的最终方式,但我确实认为大多数懂计算机的人在使用计算机的早期就接触到了文件系统,并且它最终成为一种非常熟悉的做生意的方式。

DevOps 安全性既令人不安又具有破坏性

原文:https://towardsdatascience.com/devops-security-is-as-disruptive-as-it-is-uncomfortable-670f19c916a0?source=collection_archive---------28-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各种规模的企业都越来越关注安全性。从小网点到大企业组织。在了解 DevOps 如何在这一领域产生影响时,重要的是要记住 DevOps“是什么”和“不是什么”DevOps 安全可能是一个重要的焦点,但必须以正确的方式进行。

DevOps 安全是什么样子的?

DevOps 就是很多东西。当然,这是一个工具,但不是“a”工具。它不是一个程序或一个软件。确切地说,是很多人。还有更多。在这个世界上,很多高层管理人员想知道“它是什么”“它要花多少钱”“要花多长时间”等等,这可能很难理解。

事实是所有这些事情,没有这些事情。从根本上说,DevOps 是人和过程的组合,包括将软件工程策略、技能、模式等渗透到生产环境中应用程序的操作中。

总之就是很多东西。

毫无疑问,安全性是 DevOps 开始涉足的一个领域。我们必须在运营基础上构建的相同模式和流程,也需要引入到安全领域。

为什么?首先,这样做对企业有利。我们生活在一个快节奏的环境中。只会越来越快。能够迭代地、快速地、迅速地开发和部署操作,意味着所有的领域都需要效仿。

这种情况下的安全性不能被视为事后的想法。也不能将其视为一个不考虑其他因素而无所不在的组成部分。我们不能把安全简单地看成一扇锁着的门。不管里面发生了什么,门都是锁着的,就是这样。

不,整个过程必须改变。因此,也需要改变思维。

不仅仅是新工具。当然,这可能是一部分。然而,我们还必须改变我们对安全形势的一些基本假设。

观念和期望的改变

这里有一个例子来说明我们所说的改变方法和假设是什么意思。我们曾经跟踪服务器的登录。有道理,对吧?因为“我们一直都是这样做的。”然而,我们不再需要这样做了。现在有许多方法可以接近 access。许多产品更高效、更安全、更快,等等。

我们需要交互式登录作为安全向量管理的基本假设的想法已经过时了。尽管如此,直觉上继续使用它是有意义的,那么为什么要改变呢?

毕竟我们只是想控制访问,对吗?如果这是我们安全设备的第一道防线,我们就跟踪登录。很简单。然而,事情并不一定是那样的。

这不是工具的问题

或者更准确地说,不仅仅是工具的问题。DevOps 安全性从提出“我首先真的需要它们吗?”明确一点:我们并不提倡无政府技术的环境,在这种环境中,没有什么是重要的,也没有什么是不重要的。当然,有些工具总是需要的。

然而,在交互式登录的情况下,这一基本功能已经不再需要了。只要承认并继续前进,事情就会朝着正确的方向发展。它从复杂的试探法和来自年复一年的工具和学习的规则转变为“让我们停止它。”

登录?谁需要登录?没有人。我们不需要他们。不再是了。

改变是艰难的

然而,这种关键的改变很难推进,因为你在与学习和已建立的工具做斗争。你在与“我们一直都是这样做的”和“嗯,这行得通”的心态作斗争。

你也在与通常回避破坏性变革的组织哲学作斗争。最终,这不仅仅是购买产品或使用工具的问题。这是一个过程,一种方法,以及让它发生的人。更重要的是,它是关于将所有这些东西整合在一起,让它们协调工作,同时采用一种新的整体方法。

这不仅仅是工程如何升级,或者运营和管理如何升级。更重要的是,所有这些学科在历史上是如何分裂成这些孤岛的,我们允许它这样做,因为我们无法再为业务做出足够快的变化。

这正是 DevOps 安全方法,一般来说,DevOps 就是要解决这个问题。安全性至关重要。它需要从看门人转变为推动者,以便与其他领域一起发展。

这是一个很难实现的转变。然而,在当今的环境中,它可以成就一个组织,也可以毁灭一个组织。

原载于 2019 年 10 月 11 日【https://introspectdata.com】

使用 TensorFlow.js 的逻辑回归预测糖尿病

原文:https://towardsdatascience.com/diabetes-prediction-using-logistic-regression-with-tensorflow-js-35371e47c49d?source=collection_archive---------10-----------------------

了解如何使用 TensorFlow.js 构建逻辑回归模型,并用于预测患者是否患有糖尿病

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TL;DR 使用高层 API 在 TensorFlow.js 中构建逻辑回归模型,并预测患者是否患有糖尿病。了解如何可视化数据、创建数据集、训练和评估多个模型。

你已经在这个被遗忘的城市生活了 8 个多月了。除了家,你在任何地方都不会感到舒服。然而,这个地方树立了一个新的标准。干热和湿热之间的不断变化会很快杀死你。

网络连接时断时续,你已经超过两周没有收到你的家人的消息了。你不知道你的伴侣怎么样,你的孩子怎么样。你有时会质疑对国家的爱。

今天早上你感觉更糟。不断的饥渴。你已经尿了四次了,而且你的视力有些模糊。不仅仅是今天,至少一个星期以来你都有这种感觉。

你去看医生,她说你可能有糖尿病。你的父母都患有这种病,所以看起来很有可能。她不太确定,做了葡萄糖测试。不幸的是,你被叫到,应该在结果出来之前离开。

你要离开两周。只有几个人和你的笔记本电脑!你有几分钟时间下载糖尿病患者数据集。您已经安装了 TensorFlow.js 和整个 API 的副本。你能建立一个模型来预测你是否有糖尿病吗?

在你的浏览器中运行本教程的完整源代码:

糖尿病数据

糖尿病(Diabetes mellitus,DM)俗称糖尿病,是一组以长期高血糖为特征的代谢紊乱性疾病。高血糖的症状包括尿频、口渴和饥饿。如果不治疗,糖尿病会导致许多并发症。急性并发症包括糖尿病酮症酸中毒、高渗性高血糖状态或死亡。严重的长期并发症包括心血管疾病、中风、慢性肾病、足部溃疡和眼睛损伤。

截至 2017 年,全球估计有 4.25 亿人患有糖尿病(约 5.5%)

我们的数据来自 Kaggle 但在论文中首次介绍:使用 ADAP 学习算法预测糖尿病的发病

这项研究的人群是亚利桑那州凤凰城附近的皮马印第安人。自 1965 年以来,国家糖尿病、消化和肾脏疾病研究所一直对该人群进行持续研究,因为其糖尿病发病率高。每个 5 岁以上的社区居民被要求每两年进行一次标准化检查,包括口服葡萄糖耐量试验。根据世界卫生组织标准诊断糖尿病;也就是说,如果在任何调查检查中 2 小时后血浆葡萄糖至少为 200 mg/dl (11.1 mmol/l),或者如果服务于该社区的印度健康服务医院在常规医疗护理过程中发现葡萄糖浓度至少为 200 mg/dl。

以下是数据汇总:

  • Pregnancies -怀孕次数
  • Glucose -口服葡萄糖耐量试验中 2 小时的血浆葡萄糖浓度
  • BloodPressure -舒张压(毫米汞柱)
  • SkinThickness -三头肌皮褶厚度(mm)
  • Insulin - 2 小时血清胰岛素(μU/ml)
  • BMI——身体质量指数(\frac{weight}{height^2} 身高 2 体重单位为千克/米)
  • DiabetesPedigreeFunction -糖尿病谱系功能(DPF)
  • Age -年龄(岁)
  • Outcome -等级变量(0 -健康或 1 -糖尿病)

根据使用神经网络估计糖尿病概率的论文,DPF 提供:

亲属中的糖尿病史以及这些亲属与受试者的遗传关系的综合。DPF 使用来自父母、祖父母、兄弟姐妹、叔叔阿姨和堂兄妹的信息。它提供了受影响和未受影响的亲属对受试者最终糖尿病风险的预期遗传影响的测量。

皮马印第安人是谁?

皮马人(或 Akimel Oʼ odham,也拼写为 Akimel Oʼ otham,“河民”,以前被称为皮马)是一群居住在现在亚利桑那州中部和南部地区的美洲土著人。aki Mel o odham 幸存的两个部落的大多数人口居住在两个保留地:Gila 河印第安人社区(GRIC)的 Keli Akimel Oʼ otham 和 Salt 河 Pima-Maricopa 印第安人社区(SRPMIC)的 On 'k Akimel Oʼ odham。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

读取数据

我们将使用 Papa Parse 库来读取 csv 文件。不幸的是,Papa Parse 不能很好地与await/async一起工作。让我们改变这一点:

我们使用dynamicTyping参数来指示 Papa Parse 从字符串转换数据集中的数字。让我们定义一个加载数据的函数:

并使用它:

干得好!我们有数据,让我们熟悉一下!

探测

虽然 tfjs-vis 很好,并且与 TensorFlow.js 很好地集成在一起,但它缺少(在撰写本文时)大量您可能需要的功能——覆盖图、颜色变化、比例定制等。这就是为什么我们将使用 Plotly 的 Javascript 库为我们的数据探索制作一些美丽的情节。

让我们来看看健康人和糖尿病人的分布情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们的数据集中,65%多一点的病人是健康的。这意味着我们的模型应该在 65%的时间里更加准确,这样才是好的。接下来——胰岛素水平:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,这两个分布之间有很大的重叠。此外,数据集中有很多 0。似乎我们有很多缺失的价值观。NaNs 被替换为 0。

另一个重要因素是测试后的葡萄糖水平:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然有一些重叠,但这项测试似乎很好地区分了健康人和糖尿病患者。

让我们看看年龄:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一般来说,老年人似乎更容易患糖尿病。

也许我们应该看看年龄和血糖水平之间的关系:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这两者的结合似乎可以很好地区分健康和糖尿病患者。这可能会给我们的模型带来奇迹。

你可能想尝试的另一个组合是皮肤厚度与身体质量指数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是的,这是可怕的,并没有告诉我们太多:)

预处理

目前,我们的数据位于一个对象数组中。不幸的是,TensorFlow 不能很好地处理这些问题。幸运的是,有 tfjs-data 包。我们将从我们的 CSV 文件中创建一个数据集,并使用它通过createDatasets()函数训练我们的模型:

features参数指定哪些列在数据集中。testSize是将用于测试的数据部分。batchSize当数据集被分割成块(批)时,控制数据点的数量。

让我们从提取数据中的特征开始:

我们将要素中缺失的值替换为 0。你可以试着不用这一步来训练你的模型,看看会发生什么?

让我们准备标签:

oneHot 的定义如下:

一键编码将分类变量(健康— 0 和糖尿病— 1)转换为一个数组,其中 1 对应于类别的位置,所有其他变量为 0。以下是一些例子:

1; // diabetic =>
[0, 1];

和健康:

0; // healthy =>
[1, 0];

让我们从我们的数据中创建一个数据集:

请注意,我们还使用 42 的种子来混洗数据:)

最后,让我们将数据分成训练和验证数据集:

我们使用 take 来创建训练数据集, skip 来省略验证数据集的训练示例,最后,使用批处理将数据分割成块。

此外,我们返回数据来测试我们的模型(稍后将详细介绍)。

逻辑回归

逻辑回归(与其名称相反)允许您从数据中获得二元(是/否)答案。此外,它给出了每个答案的概率。像这样的问题:

  • 这是垃圾邮件吗?
  • 我应该向老板要求更高的薪水吗?
  • 这个病人有糖尿病吗?
  • 这个人是真正的朋友吗?
  • 我的伴侣欺骗我吗?
  • 我对我的伴侣不忠吗?
  • 你明白我的意思吗?

如果有足够的数据,并且你足够幸运地相信所有这些问题都有答案,用逻辑回归是可以回答的吗?

但是我跑题了,让我们来看看逻辑回归的数学公式。首先,让我们从线性模型开始:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 x 是我们要用来训练模型的数据, b 1 控制斜率, b 0 控制与 y 轴的交点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将使用 softmax 函数从线性模型中获取概率,并获得逻辑回归的广义模型。 Softmax 回归允许我们创建一个具有两个以上输出类别的模型(二元响应):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 b 1 定义曲线的陡度,而 b 0 左右移动曲线。

我们想利用我们的数据 X 和一些训练魔法来学习参数 b 1 和 b 0。让我们使用 TensorFlow.js 来实现它!

请注意,这个模型将给我们一个概率性的答案,而不仅仅是一个二元的反应。如果模型对某个预测不确定(例如低于 80%),您可能会决定忽略该预测。

预测糖尿病

让我们通过在 TensorFlow.js 中构建一个模型来将理论付诸实践,并预测患者的结果。

模型

请记住,构建逻辑回归模型的关键是线性模型,并对其应用 softmax 函数:

请注意,我们有 2 个输出,因为根据我们为训练模型而选择的功能,存在一次性编码和动态输入计数。是的,在 TensorFlow.js 中建立逻辑回归模型就是这么简单。

下一步是编译模型:

我们模型的训练过程包括最小化损失函数。这由我们提供的亚当优化器来完成。请注意,我们提供的学习率是0.001

学习率被称为超参数,因为它是您提供给模型使用的参数。它控制每个新的更新应该“覆盖”您的模型已经知道的内容的程度。选择“正确的”学习速度有点像巫术。

我们使用交叉熵损失(被称为对数损失)来评估我们的模型做得有多好。它(严厉地)惩罚分类模型给出的错误答案,基于它们给每一类的概率。定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 C 是类的数量, y 是二进制指示器,如果类标签是观察的正确分类,并且 po 是类 c 的预测概率。

请注意,我们请求 TensorFlow 记录准确性指标。

培养

让我们使用 fitDataset 使用我们准备的训练和验证数据集来训练我们的模型:

我们对我们的模型进行 100 个时期的训练(整个训练集显示给模型的次数),并使用 onEpochEnd 回调来记录可视化的训练日志。

我们将把所有这些打包到一个名为trainLogisticRegression的函数中,其定义为:

估价

让我们用目前为止我们已经建立的一切来评估我们的模型做得有多好:

请注意,我们仅使用葡萄糖水平来训练我们的模型。结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一点都不好。我们的模型比一个在 65%的时间里预测健康的假人表现更差。此外,损失从未真正开始下降。让我们尝试更多的数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更好的是,在训练期间损失值显著降低,并且我们在验证集上获得了大约 79%的准确度。让我们用一个混淆矩阵来仔细看看分类性能:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用模型预测和测试集可以获得混淆矩阵:

即使我们的模型可能已经获得了更好的准确性,结果仍然是可怕的。与患糖尿病相比,健康被大大高估了。如果我们尝试一个更复杂的模型会怎么样:

这是该模型的混淆矩阵:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在不研究这个模型,但是请注意,通过增加模型的复杂性,我们可以获得更好的结果。

结论

恭喜你!你建立并训练了不止一个,而是几个模型,包括逻辑回归,来预测病人是否患有糖尿病。你也遇到了现实世界——处理数据、训练和建立模型是很难的事情。此外,无论你有多少数据点,也不是一切都是可以预测的。

在你的浏览器中运行本教程的完整源代码:

也就是说,有一些方法可以改进构建和训练模型的过程。我们知道,在特定的环境下,使用某些技术比其他技术更好。嗯,机器学习是细致入微的:)

参考

最初发表于https://www.curiousily.com

建立机器学习模型(特别是深度神经网络),可以轻松地与现有或新的 web 应用程序集成。想想您的 ReactJs、Vue 或 Angular 应用程序通过机器学习模型的强大功能得到了增强:

[## JavaScript 黑客的深度学习

建立机器学习模型(特别是深度神经网络),您可以轻松地与现有或新的网络集成…

leanpub.com](https://leanpub.com/deep-learning-for-javascript-hackers)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值