TowardsDataScience 博客中文翻译 2019(二百八十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在 PiZero W 中安装 OpenCV

原文:https://towardsdatascience.com/installing-opencv-in-pizero-w-8e46bd42a3d3?source=collection_archive---------4-----------------------

我们大多数人在 Pi 中安装 openCV 时都遇到过问题。在这篇博客中,我将一步一步地告诉你如何在你的 pi-zero W 中安装 opencv。

虽然 Pi Zero 对于高级视频处理来说不够快,但它仍然是一个很好的工具,可以用来学习计算机视觉和 OpenCV 的基础知识。我建议你晚上继续关注这个博客,因为仅仅编译 OpenCV 就需要 12 个多小时。

让我们开始…

要求:

1> pi 零 W 硬件

2> SD 卡(最低 16 GB)

3 >任何安装在你的 pi zero 上的 Raspbian 操作系统(我用过 Raspbian Buster)

假设您有给定的需求,让我们开始设置。

第一步:文件系统扩展:

很少再需要扩展文件系统,因为 NOOBs 和 Raspbian 的独立安装都会在第一次启动时自动扩展文件系统。但是,为了确保系统已扩展,请运行以下命令:

pi@raspberrypi:~ $ raspi-config --expand-rootfs

第二步:增加交换空间

交换空间是硬盘驱动器(HDD)的一部分,用于虚拟内存。有一个交换文件允许你的计算机操作系统假装你有比实际更多的内存。这将增加 openCV 的编译过程。否则你会以内存耗尽的错误结束。

要增加交换大小,请使用以下命令打开 pi zero 的交换文件:

pi@raspberrypi:~ $ sudo nano /etc/dphys-swapfile

转到交换大小,并将其从 100 更改为 2048。如下图所示。

.
.
.
# where we want the swapfile to be, this is the default
#CONF_SWAPFILE=/var/swap# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
#CONF_SWAPSIZE=100
CONF_SWAPSIZE=2048
.
.
.

重启你的系统。

pi@raspberrypi:~ $ sudo reboot

步骤 3:安装依赖关系:

首先让我们更新和升级现有的软件包:

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade

如果您使用 Raspbian Buster,请运行以下命令:

pi@raspberrypi:~ $sudo apt update
pi@raspberrypi:~ $sudo apt upgrade

出现提示时,输入“Y”。

安装开发人员工具:

pi@raspberrypi:~ $ sudo apt-get install build-essential cmake pkg-config

安装 IO 包:

pi@raspberrypi:~ $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

以及一些视频 I/O 包(尽管您不太可能使用 Raspberry Pi Zero 进行大量视频处理):

pi@raspberrypi:~ $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devpi@raspberrypi:~ $ sudo apt-get install libxvidcore-dev libx264-dev

我们需要为 OpenCV 的 GUI 界面安装 GTK 开发库:

pi@raspberrypi:~ $ sudo apt-get install libgtk2.0-dev

OpenCV 利用的常规优化包:

pi@raspberrypi:~ $sudo apt-get install libatlas-base-dev gfortran

步骤 4:获取 OpenCV 源代码

所以现在我们有了所有的依赖关系。让我们从 opencv github 中拉出 OpenCV 的发布。

请注意,我已经发布了 3.4.1 版本。您也可以尝试其他版本。只需替换发布版本号。

pi@raspberrypi:~ $cd ~pi@raspberrypi:~ $ wget -O opencv.zip [https://github.com/Itseez/opencv/archive/3.4.1.zip](https://github.com/Itseez/opencv/archive/3.0.0.zip)pi@raspberrypi:~ $unzip opencv.zip

让我们一起抓取 opencv Contrib,因为 SIFT 和 SURF 已经从 opencv 的默认安装中移除:

pi@raspberrypi:~ $ wget -O opencv_contrib.zip [https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip](https://github.com/Itseez/opencv_contrib/archive/3.0.0.zip)pi@raspberrypi:~ $ unzip opencv_contrib.zip

一旦两个存储库都被下载并在您的系统中展开,最好将它们删除以释放一些空间。

pi@raspberrypi:~ $ rm opencv.zip opencv_contrib.zip

步骤 5:设置 Python

如果您的系统中已经安装了 python2.7,您可以跳过这一步,否则请安装 Python 2.7 头文件,以便我们可以编译 OpenCV + Python 绑定:

pi@raspberrypi:~ $ sudo apt-get install python2.7-dev

之后安装 pip,一个 python 包管理器。

pi@raspberrypi:~ $ wget [https://bootstrap.pypa.io/get-pip.py](https://bootstrap.pypa.io/get-pip.py)pi@raspberrypi:~ $ sudo python get-pip.py

构建 Python + OpenCV 绑定的唯一要求是安装了 NumPy ,所以使用 pip 安装 NumPy:

pi@raspberrypi:~ $ pip install numpy

步骤 6:为 Raspberry Pi Zero 编译并安装 OpenCV

现在我们准备编译和安装 OpenCV。

构建文件:

pi@raspberrypi:~ $ cd ~/opencv-3.4.1/pi@raspberrypi:~ $ mkdir buildpi@raspberrypi:~ $ cd buildpi@raspberrypi:~ $ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.0.0/modules \ -D BUILD_EXAMPLES=ON ..

现在是编译的时候了。请记住,自行编译可能需要 9 个多小时,有时您可能会认为系统已经冻结。但是不要失去耐心,让系统工作,直到你看不到任何错误。

pi@raspberrypi:~$ make

假设您的文件编译成功,没有任何错误,现在将使用以下命令安装 opencv。

pi@raspberrypi:~$ sudo make installpi@raspberrypi:~$ sudo ldconfig

步骤 7:完成安装

检查 cv2.so 文件的路径:

查找/-name“cv2 . so”

pi@raspberrypi:~$ /usr/local/python/cv2/python-2.7/cv2.so

现在您所要做的就是将 cv2.so 文件(绑定文件)符号链接到 python lib 的站点包中。

pi@raspberrypi:~$ cd /usr/local/lib/python2.7/site-packages

运行以下命令:ln-s[cv2 . so 文件的路径] cv2.so。在我的例子中,如下所示:

pi@raspberrypi:~$/usr/local/lib/python2.7/site-packages $ ln -s /usr/local/python/cv2/python-2.7/cv2.so cv2.so

步骤 8:验证您的 OpenCV 安装

现在是时候验证我们的 openCV 安装了。

启动 Python shell 并导入 OpenCV 绑定:

pi@raspberrypi:/usr/local/lib/python2.7/site-packages$ pythonimport cv2>>> cv2.__version__3.4.1’

现在你已经在你的系统上安装了一个新的 openCV。现在导出 python 可以从任何地方访问它的路径。

pi@raspberrypi:~$ export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH

现在,您可以删除 opencv-3.4.1 和 opencv_contrib-3.4.1 目录,释放文件系统上的大量空间:

但是在运行这个命令之前要小心!在清空这些目录之前,确保 OpenCV 已经正确安装在你的系统上,否则你将不得不重新开始(漫长的,12 个多小时)编译*!*

如果你遇到任何错误,请在评论区告诉我。

如果您想要 python3 的 OpenCV,那么您可以简单地使用 sym-link 将绑定文件指向您的 python3 站点包并导出路径

在 ubuntu 18.04 上安装 PySpark 和 JAVA 8

原文:https://towardsdatascience.com/installing-pyspark-with-java-8-on-ubuntu-18-04-6a9dea915b5b?source=collection_archive---------3-----------------------

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

source: https://bigdatapath.wordpress.com/2018/02/03/introduction-to-apache-spark/

分布式机器学习的基本设置

经过几个小时的挣扎,我终于安装了 java 8,spark 并配置了所有的环境变量。我浏览了许多中型文章和 StackOverflow 答案,但没有一个特定的答案或帖子解决了我的问题。所以这只是我的一点小小的努力。

我的机器安装了 ubuntu 18.04,我使用的是 java 8 和 anaconda3。如果您按照步骤操作,您应该可以毫无问题地安装 PySpark。

  1. 确保你已经安装了 java。

如果没有,请在终端中运行以下命令:

sudo apt install openjdk-8-jdk

安装后,如果您在终端中键入 java -version ,您将得到:

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)

2。从 下载火花 https://spark.apache.org/downloads.html

记住你下载的目录。我把它放在我的默认下载文件夹中,我将在那里安装 spark。

3。设置 JAVA _ HOME 环境变量。

为此,在终端中运行以下命令:

sudo vim /etc/environment

它将在 vim 中打开文件。然后,在 PATH 变量后的新行中添加

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

wq 型!然后退出。这将在文件中保存编辑。后来,在终端运行中

source /etc/environment

不要忘记在终端中运行最后一行,因为这将创建环境变量并将其加载到当前运行的 shell 中。现在,如果你跑

echo $JAVA_HOME

输出应该是:

/usr/lib/jvm/java-8-openjdk-amd64

就像加进去的一样。现在 ubuntu 的一些版本不在每次打开终端时运行/etc/environment文件,所以最好把它加入进来。bashrc 文件为。bashrc 文件在每次打开时都会加载到终端。因此,在终端中运行以下命令,

vim ~/.bashrc

文件打开。在末尾添加

source /etc/environment

稍后我们将在它下面添加 spark 变量。现在退出并加载。bashrc 文件,通过运行下面的命令。

source ~/.bashrc 

或者您可以退出此终端并创建另一个终端。现在,如果您运行 echo $JAVA_HOME,您应该会得到预期的输出。

4。安装 spark。

转到下载 spark zip 文件的目录,运行命令安装它:

cd Downloads
sudo tar -zxvf spark-2.4.3-bin-hadoop2.7.tgz

注意:如果您的 spark 文件是不同的版本,请相应地修改名称。

5。为 spark 配置环境变量。

vim ~/.bashrc

在末尾增加以下内容:

export SPARK_HOME=~/Downloads/spark-2.4.3-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
export PATH=$PATH:~/anaconda3/bin
export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH
export PYSPARK_DRIVER_PYTHON="jupyter"
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
export PYSPARK_PYTHON=python3
export PATH=$PATH:$JAVA_HOME/jre/bin

保存文件并退出。最后,加载。bashrc 文件在终端中再次被

source ~/.bashrc

现在运行:

pyspark

这将为您打开一个 jupyter 笔记本。我卸载并再次运行命令来安装 spark 和 java。最后,如果你做了:

cd $SPARK_HOME
cd bin 
spark-shell --version

你会看到这样的图像。

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

结论

我希望这篇文章能帮助你安装 spark。今天,Spark 已经成为分布式机器学习的一个非常重要的工具,它是任何数据科学家或机器学习工作的必备简历。设置 spark 可能是首先要做的事情,其次是学习 spark 数据框架,然后在任何项目中使用它。

接触

如果你热爱数据科学,让我们在 linkedin 上联系或者在这里关注我。如果你喜欢这个故事,请鼓掌欣赏。谢谢:)

在 GoDaddy 上安装 Python 3 和 Flask

原文:https://towardsdatascience.com/installing-python-3-and-flask-on-godaddy-1635fe6f24bc?source=collection_archive---------6-----------------------

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

这篇文章过时了。Flask 需要 Python 3.7 >,请到这里查看更新的指令。

最近我决定在我的 GoDaddy 主机上托管我的 Python 应用程序,并花了几个小时调试,因为在 Heroku/Apache 独立服务器之外的其他服务器上安装 Python 和 Flask 的文档很难获得。我想把它放在我的托管平台上的原因是因为 Heroku 和其他人不能支持我的 web 应用程序需求。它们受限于功率和内存限制。任何复杂的应用程序都应该通过自己的平台托管,因为这样会快得多。

下面的 Github 文件可以在这里找到

****在接下来的几周,我将更新这篇文章,为新用户提供每个主题的链接,并且随着新问题的出现,还将增加更多的故障诊断内容。

目录:

先决条件

ᴛᴏᴘ^

在开始之前,你需要下载一些东西或者做一些准备。

****这些指令已经在 GoDaddy Shared 和 GoDaddy Business hosting 上进行了测试。

您将需要:

  • 一个 GoDaddy 托管帐户,至少有 1 个网站托管。
  • PuTTy 是一个免费的 SSH 控制台,用于连接 GoDaddy 服务器。这将用于安装 Python。
  • 通过 GoDaddy 的 SSH 访问。(下面的说明)
  • 稳定的互联网连接。如果互联网中断,安装将会停止,您必须卸载它并重新开始。我对这个有很多问题。
  • 编程 IDE。我用 PyCharm 处理 Python/CGI,用 Visual Studio 处理 HTML、CSS 和 Javascript。

安装 Python

ᴛᴏᴘ^

登录 PuTTy(或其他 SSH 终端):

一旦 PuTTy 安装完毕,就可以开始安装 Python 了。打开 PuTTy 控制台。

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

PuTTy Icon. Don’t open PuTTyGen

键入您的主机名,这将是您在 GoDaddy 上启用 SSH 时的 IP 地址。这可以在Server子菜单下的主机设置中找到。您的端口几乎总是为22,但是请仔细检查以确保正确。这可以在 SSH 启用菜单中找到。点击打开,它将开始连接。

PuTTy 将创建一个到 GoDaddy 服务器的安全连接;它会提示您输入用户名进入 FTP 账户。这将在您启用 SSH 的主机设置下找到。这将是一串字母字符和数字,都是小写字母。该密码将与用于登录 GoDaddy 的密码相同。

****一旦登录到 PuTTy,键入以下命令开始安装过程。

**##** *Download Python 3.5.7 (latest version GoDaddy supports as of writing)* $ wget [https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tgz](https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tgz)**##** *Once wget is done downloading* $ tar xvzf Python-3.5.7.tgz**##** *Once tar is done decompressing*$ cd Python-3.5.7**##** *This should take you to the main Python Directory*$ ./configure --prefix=$HOME/.local**##** This step sets up your configuration and makes files**$** make
**$** make install**##** *This will create the Python files and folders, but will take a long time. The last command will install* pip *and* setuptools *which will be used to install any package you want*

****上面的步骤将下载并安装 Python、pip 和设置工具。如果有任何错误,请参见下面的故障排除部分。(这将随着更多错误的发现而更新)

****接下来的需要完成 Python 的安装并确保环境变量已经设置好。

**$** cd $home
**$** vi .bash_profile**##** Press enter and change the file to equal this EXACTLYPATH=$HOME/.local/bin:$PATH
export PATH**##** Once done, Type :wq and press enter. This will save your file and close it**$** python3 -V
**>>** Python 3.5.7

****那里你去吧!如果你只是想在 GoDaddy 上安装 Python3,你可以就此打住!如果你想在 GoDaddy 上部署 Flask 或 Heroku 应用,请继续这篇文章。

安装烧瓶

ᴛᴏᴘ^

注意:如果你使用的是子域,确保子域文件夹在 public_html 里面,除了你需要添加 *subdomain_name/* 到这些指令之外,这些指令都是一样的。

**##** Install Virtual Environment Package
**$** python3 -m pip install virtualenv**##** Navigate to your CGI-BIN folder inside public_html
**$** cd $home
**$** cd public_html/cgi-bin**##** Create Virtual Environment. 'venv' can be named whatever you want, but just change the other code accordingly.
$ virtualenv venv**##** Activate the virtual environment
**$** source venv/bin/activate
**$** pip install Flask
**$** deactivate

Flask 现已安装,可在接下来的步骤中用于设置 Flask 应用程序以在 GoDaddy 主机上运行。

****你也可以安装任何需要的包,就像本地机器上面的步骤一样。安装前一定要用source venv/bin/activate激活虚拟环境,否则无法工作。

设置您的 Flask 应用程序

ᴛᴏᴘ^

为了发布 GoDaddy 托管的应用程序,您需要将其转换为 GoDaddy 可以使用的东西。为此,我们将不得不使用一个名为wsgiref的包。不需要下载任何东西,因为这个包从 2.7 开始就包含在 Python 中了。

一旦你完成这些说明,这个就是你最终的文件夹结构。(你可以从我的 Github 复制/粘贴源代码,但在修改任何选项之前,请确保你完全理解)。静态文件夹是可选的,它允许你在你的 Flask 应用中使用 CSS 和 Javascript,但是那是另外一篇文章。

public_html/
├── .htaccess
└── cgi-bin/
    ├── app.cgi
    ├── app.py
    ├── templates/
    │   └── home.html
    └── venv/

****将cgi-bin中新建一个文件,命名为app.cgi。以下代码应该放在该文件中,并根据您的网站设置进行更改。

用户名将与您登录 PuTTy 或其他 SSH 终端时的用户名相同。

#!/home/USERNAME/.local/bin/python3
import os
import syssys.path.insert(0,
                '/home/USERNAME/public_html/cgi-bin/venv/lib/python3.5/site-packages')from wsgiref.handlers import CGIHandlerfrom app import appclass ProxyFix(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['SERVER_NAME'] = ""
        environ['SERVER_PORT'] = "80"
        environ['REQUEST_METHOD'] = "GET"
        environ['SCRIPT_NAME'] = ""
        environ['QUERY_STRING'] = ""
        environ['SERVER_PROTOCOL'] = "HTTP/1.1"
        return self.app(environ, start_response)if __name__ == '__main__':
    app.wsgi_app = ProxyFix(app.wsgi_app)
    CGIHandler().run(app)app.wsgi_app = ProxyFix(app.wsgi_app)
CGIHandler.run(app)

让我们稍微分解一下代码。第一行是被称为shebang的,它告诉程序使用什么 shell。在本例中,我们正在运行 python,因此我们需要将它指向 python shell,它位于/local文件夹中。

接下来你导入你的应用,就像一个普通的 init。py 文件。class ProxyFix初始化应用程序,并确保设置正确的环境变量。您可以根据需要更改和删除环境变量,但是这些应该适用于大多数项目。需要改变的主要是'QUERY_STRING' & 'REQUEST_METHOD'。如果设置了这些,对 Flask 应用程序的所有调用都将是 GET 请求,查询字符串将是NONE

****在cgi-bin中创建另一个名为app.py的新文件,并键入以下代码。这段代码设置了一个测试应用程序,所以 Flask 有一些东西要显示。

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def home():
    return render_template('home.html')

****在cgi-bin创建一个名为templates的文件夹,并在该文件夹内创建一个名为home.html的文件

<!DOCTYPE html>
<html>
    <head>
        <title>Home</title>
    </head>
    <body>
        <h2>It Works! Congrats!</h2>
    </body>
</html>

****在public_html文件夹中插入一个名为.htaccess的文件。下面的代码将所有传入的请求指向你的 app.cgi 文件,并确保唯一运行的是你的 Flask 应用。将用户名更改为您用于 SSH 终端的主 FTP 帐户。

Options +ExecCGI 
AddHandler cgi-script .py
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /home/USERNAME/public_html/python/cgi-bin/app.cgi/$1 [L]

我在这里会完全诚实,我不是这方面的专家。htaccess 文件,但我能够得到这个工作与一些摆弄左右。确保你完全复制粘贴了这个。如果差了一个空格或一个字母,就不行了。

****那里你去吧!一旦这些都上传完成,输入你的网址并祈祷吧!您可以开始扩展并确保导入所有需要的包。您最有可能创建一个脚本来检查安装并为您安装它们,但这不是本文的内容。

最重要的是,你的应用程序不会打印或输出任何非 HTML 格式的内容。这是在任何平台上发布任何 Flask 应用程序的一个缺点。

【GoDaddy 内的所有 Python 和 CGI 文件必须将权限设置为 755。请确保在尝试打开 URL 之前进行检查。

如何启用 SSH

ᴛᴏᴘ^

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

  • 在右边,点击Settings菜单下的Server按钮
  • 点击SSH Access旁边的Manage
  • 从那里你所要做的就是将开关拨到On

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

注意:记住你的端口号(22)、用户名和 IP 地址。这将位于帐户选项卡下的设置菜单中,但我们将在 Python 安装期间使用它们。

注 cPanel 密码是您登录 GoDaddy 使用的密码。

解决纷争

ᴛᴏᴘ^

尝试通过 URL 打开 flask 应用程序时,我收到错误 500。

  • 检查 GoDaddy cPanel 中的错误日志。它会让你很好地了解正在发生的事情。最常见的情况是没有安装软件包,或者 Python 安装失败而没有抛出错误。
  • 或者,确保您的应用程序根本不打印或试图访问控制台,这将使应用程序崩溃。
  • 环境变量也可能不正确。最常见的是 SERVER_NAME 和 SERVER PORT,它们必须与上面脚本中的完全相同。

Python 安装失败。是在 **make** 或者 **make install** 期间抛出错误。

  • 最有可能的是,由于ctypes的错误,安装失败。这些都包含在 Python 2.7 中,但是 GoDaddy 没有将它们安装到他们的 Python 版本中。尝试下载旧版本或新版本的 Python。烧瓶兼容 2.7。及以上,不包括 3.0。–3.4.*
  • 确保您对尝试安装 Python 的文件夹具有读/写权限。

尝试打开应用程序时,我收到一个 404 错误。

  • 检查你的。htaccess 文件,并确保它和我的完全一样。
  • 请确保@app.route 具有有效的端点,即:/home,/,/index

这些尚未通过 GoDaddy 或 Windows 主机在 VPS 主机上进行测试。据我所知,GoDaddy Windows 不支持 Python。

这段代码摘自 GoDaddy 的博客文章 此处 ,已经修改为与 Flask 一起工作,并添加了一些自定义代码。

感谢 Flask 文档为用户提供了一个起点。 文档链接

在 Windows 10 上安装支持 CUDA、cuDNN 和 GPU 的 Tensorflow

原文:https://towardsdatascience.com/installing-tensorflow-with-cuda-cudnn-and-gpu-support-on-windows-10-60693e46e781?source=collection_archive---------0-----------------------

在本系列的第 1 部分中,我讨论了如何升级您的 PC 硬件,以集成 CUDA Toolkit 兼容的图形处理卡,例如 Nvidia GPU。第 2 部分介绍了在 Windows 10 上安装 CUDA、cuDNN 和 Tensorflow。下面这篇文章假设你已经在你的电脑上安装了一个兼容 CUDA 的 GPU 但是如果你还没有准备好,本系列的第 1 部分将帮助你设置硬件,为这些步骤做好准备。

第一步:检查你需要安装的软件

假设您的电脑上已经安装了 Windows,您将在这些步骤中安装的其他软件包括:-

  • Microsoft Visual Studio
  • NVIDIA CUDA 工具包
  • NVIDIA cuDNN
  • 计算机编程语言
  • Tensorflow(有 GPU 支持)

步骤 2:下载 Visual Studio 速成版

Visual Studio 是 CUDA 工具包的先决条件

安装 Nvidia CUDA Toolkit 需要 Visual studio(这个先决条件这里指的是)。如果您试图在没有安装 Visual Studio 的情况下下载并安装 CUDA Toolkit for Windows,您会得到如图 1 所示的消息。

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

Fig 1: Message when attempting to install CUDA Toolkit without Visual Studio

选择和下载 Visual Studio 速成版

在撰写本文时,Visual Studio 的最新版本(免费)是 Visual Studio Express Community Version 2017,如图 2 所示。加入“Visual Studio Dev Essentials”,然后搜索想要的 Visual Studio 版本,就可以免费获得 Visual Studio 以前的版本。

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

Fig 2: Visual Studio Community 2017 (free)

安装 Visual Studio 速成版

一旦您下载了 Visual Studio 速成版,它的安装就很简单了。图 3 显示了下载的可执行文件。

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

Fig 3: The Visual Studio Community executable file

当你按下图 3 中的“保存文件”选项时,图 4 中的窗口将会出现,你可以在这里设置安装选项(或者像我一样,让它们保持默认设置)。

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

Fig 4: installation window for Visual Studio Community 2017

在安装过程中,Visual Studio 会提示您是否’希望在没有工作负荷的情况下继续。我在这里按了“继续”,因为我根本不想使用工作负载。

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

Fig 5: I didn’t add workloads on prompting by Visual Studio

安装 Visual Studio 后,可能需要重新启动电脑 d

安装 Visual Studio 后,我开始直接下载并尝试安装 CUDA Toolkit for Windows——这一步是我将在下面描述的第 3 步。我得到消息说 Visual Studio 仍在运行,并阻止 CUDA 工具包的安装。在尝试再次安装 CUDA Toolkit 之前重启我的电脑解决了这个问题。

第三步:下载适用于 Windows 10 的 CUDA 工具包

这些 CUDA 安装步骤大致基于Nvidia CUDA windows 安装指南。CUDA 工具包(免费)可以从 Nvidia 网站这里下载。

在撰写本文时,所提供的 CUDA 工具包的默认版本是 10.0 版,如图 6 所示。但是,你应该检查你选择下载和安装哪个版本的 CUDA 工具包,以确保与 Tensorflow 的兼容性(期待本流程的步骤 7 )。当你进入 Tensorflow 网站时,可用的 Tensorflow 最新版本(1.12.0)需要 CUDA 9.0 ,而不是 CUDA 10.0。要找到 CUDA 9.0,您需要导航到图 6 右下角的“Legacy Releases”。

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

Fig 6: The default (most recent) version of CUDA for Windows is cuda_10.0.130_411.31_win10.exe. For CUDA 9.0, choose “Legacy Releases”

步骤 3.1:从 CUDA 工具包档案下载 CUDA 9.0

选择“遗留版本”会将您带到 CUDA 工具包归档。根据 Tensorflow 安装指南,所需的 CUDA 版本为 9.0,如图 7 所示。

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

Fig 7: List of archived CUDA releases still available for download — CUDA Toolkit 9.0 (Sept 2017)

步骤 3.2:安装 CUDA 9.0

CUDA 9.0 以基础安装和四个补丁的形式提供;必须首先安装 CUDA 9.0 的基础安装,然后安装补丁。我选择的基本安装选项如图 8 所示。

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

Fig 8: Options chosen for the base installation of CUDA 9.0 for Windows base installer

运行刚刚下载的基础安装程序将产生 CUDA 安装包窗口,如图 9 所示。

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

Fig 9: CUDA Setup Package for CUDA base installer

CUDA 安装程序解压到您的电脑上,完成后,NVIDIA CUDA Toolkit 安装将开始;你会收到一条大意如此的信息。整个安装过程中产生的 NVIDIA 安装程序窗口如图 10-图 13 所示。我选择了快速安装选项(图 10)。

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

Fig 10: Installation options for CUDA 9.0 base installer — I chose the Express option

图 11 提供了选择安装位置的机会;我选择了所提供的默认位置,对于 CUDA 来说是:

C:\Program Files\NVIDA GPU Computing Toolkit\CUDA\v9.0

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

Fig 11 : CUDA 9.0 base installation — selecting CUDA installation location

下面的图 12 显示了依赖于 Visual studio 的 CUDA 安装,先前在步骤 1 中安装。

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

Fig 12: CUDA 9.0 base installation process — window showing installations relying on Visual Studio

在上面图 12 所示的窗口中按下“下一步”,出现最后的安装窗口,如下图 13 所示,其中 NVIDIA 安装程序被标记为完成。

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

Fig 13: Final installation window for CUDA 9.0 base installer

第四步:下载 Windows 10 CUDA 补丁

在撰写本文时,有四个 CUDA 补丁需要获取(以及基础安装程序),所以让我们去下载这些补丁吧。它们如图 14 所示

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

Fig 14: Downloading and installing the additional four patches for CUDA 9.0

下载这四个修补程序后,它们可以按照与基本安装程序相同的方式进行安装,安装窗口会在整个过程中提供指导。

第 5 步:下载并安装 cuDNN

安装了 CUDA 9.0 基础安装程序及其四个补丁后,下一步是找到 CuDNN 的兼容版本。根据 Tensorflow 网站上的信息,具有 GPU 支持的 Tensorflow 要求 cuDNN 版本至少为7.2

步骤 5.1:下载 cuDNN

为了下载 CuDNN ,你必须注册成为 NVIDIA 开发者计划的成员(这是免费的)。

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

Fig 15: Creating a free membership account in order to download cuDNN

当您创建一个帐户,登录并填写一些关于您为什么使用该帐户的其他必需的细节时,您会得到如图 16 所示的下载页面。

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

Fig 16: cuDNN download page with selection of cuDNN v.7.4

由于我下载的是 CUDA 9.0,cuDNN 对应的版本是 7.4.2 版。选择 cud nn 7 . 4 . 2 版可下载如下名称的 zip 文件:

cudnn-9.0-windows10-x64-v7.zip 

步骤 5.2:解压 cuDNN 文件并复制到 CUDA 文件夹

Nvidia 的说明提供了对 windows cuDNN 安装的支持,Tensorflow 网站上的说明也是如此;基于我对这些指令的实现,我以提炼的形式复制了这些指令。就我而言,我下载了 cuDNN。将上面命名的 zip 文件压缩到一个文件夹中,该文件夹在我的 PC 上有以下路径(您的路径无疑会不同)。

C:\Users\jo\Documents\cuDNN_downloads\

在下面的说明中,我将文件夹路径“*C:\ Users \ jo \ Documents \ cud nn _ downloads *”(上面提到的)称为“ < downloadpath > ”,这样,zip 文件现在位于以下路径中:

<downloadpath>\cudnn-9.0-windows10-x64-v7.5.0.56.zip

我拉开了拉链。zip”文件,因此包含所需 cuDNN 文件的解压缩文件夹结构现在是:-

<downloadpath>\cudnn-9.0-windows10-x64-v7.5.0.56\

解压缩后的 cuDNN 文件夹子目录中有三个文件,它们将被复制到 CUDA Toolkit 目录中。它们是 cudnn64_7.dll、cudnn.h 和:

1。cudnn64_7.dll

cudnn64_7.dll 可以在下载的 cudnn 文件的以下路径中找到:

<downloadpath>\cudnn-9.0-windows10-x64-v7.5.0.56\cuda\bin\cudnn64_7.dll

假设您将 CUDA 9.0 安装到了它的默认路径(正如我在步骤 2.3 中所做的),即下面的默认路径:

C:\Program Files\NVIDA GPU Computing Toolkit\CUDA\v9.0

可以将 cudnn64_7.dll 文件直接复制到 CUDA 文件夹的 bin 文件夹路径中(注意:不需要新建任何子文件夹):

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\

2。cudnn.h

和上面的 cudnn64_7.dll 文件一样,下载并解压 cudnn 文件夹后,可以在路径中找到头文件 cudnn64.h :

<downloadpath>\cudnn-9.0-windows10-x64-v7.5.0.56\cuda\ include\cudnn.h

同样,假设您像我在步骤 2.3 中一样将 CUDA 9.0 安装到默认路径中,将 cudnn.h 直接复制到 CUDA 文件夹中,路径如下(不需要新建子文件夹):

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include\

3。cudnn.lib

的。lib 文件 cudnn.lib 可以在下载的 cudnn 路径中找到:

<downloadpath>\cudnn-9.0-windows10-x64-v7.5.0.56\cuda\lib\x64\cudnn.lib

将 cudnn.lib 直接复制到 CUDA 文件夹中,路径如下:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\x64\

步骤 5.3:检查在 Windows 中设置了 CUDA 环境变量

最后,Nvidia 的指令指示您确保 CUDA 环境变量已经预先设置好,如下所示:

Variable Name: CUDA_PATH 
Variable Value: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

在 Windows 10 中,可以通过选择以下选项找到环境变量:

控制面板->-系统和安全->-系统->-高级系统设置

这将打开一个名为“系统属性”的窗口(图 17),此时应该选择“环境变量”按钮。

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

Fig 17: Environment Variables button (in System Properties window) for setting and checking CUDA paths

当环境变量窗口出现时,在“系统变量”中(在窗口的下半部分),点击“路径”并选择按钮“编辑”。将出现一个新窗口,名为“编辑环境变量”,如下图 18 所示。

在检查环境变量时,我发现确定 CUDA 安装路径的安装过程— 步骤 3.2 ,见图 11——已经向 CUDA 添加了两条路径。这些路径如下面的图 18 所示,所以我发现我不需要再添加一个 CUDA 路径。

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

Fig 18: Default paths previously created during CUDA 9.0 installation process

步骤 6:安装 Python(如果你还没有的话)

既然已经安装了 CUDA 和 cuDNN,是时候安装 Python 了,以便稍后安装 Tensorflow。在撰写本文时,Python 3 可用的最新版本是 Python 3.7,但 Tensorflow 所需的 Python 3 版本是 3.4、3.5 或 3.6 。Python 3.6 可以从这里为 Windows 10 下载。当您运行 Python installer for windows 时,将出现图 19 中的设置窗口。

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

Fig 19: Python 3.6 installation screen; I choose all the optional features on this screen (pip and IDLE are both used in subsequent steps)

在 Python 安装期间,我选择了上面图 19 中的所有选项。这些选项很有用:Python 的“pip”安装程序在本指南的步骤 7.2 中用于安装 Tensorflow。此外,我在步骤 8 使用了名为“IDLE”的 IDE(用于编写和运行 python 代码的集成开发环境)。

在“高级选项”中(如下图 20 所示),我为所有用户选择了 Python 的安装(默认情况下没有勾选);这提供了更有用的系统范围的安装。

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

Fig 20: Advanced options available when installing Python 3.6

步骤 7:安装带 GPU 支持的 Tensorflow

Tensorflow 提供指令来检查 CUDA、cuDNN 和(可选:CUPTI)安装目录是否被正确添加到 PATH 环境变量中。由于三个 cuDNN 文件被复制到 CUDA 的子文件夹中,所以我没有更新现有的 CUDA 环境变量路径。

步骤 7.1:使用管理权限调用命令提示符

在此步骤中,将执行 Tensorflow 的系统范围安装,而不是每个用户的安装。Tensorflow 的系统范围安装需要管理权限,因此,相应地,命令提示符应该以管理权限运行。

通过在搜索栏中运行’ cmd ‘打开命令提示符,然后右键单击命令提示符选择’以管理员身份运行’。这将打开 Administrator:命令提示符,如图 21 所示。

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

Fig 21: Running the command prompt as administrator from the Windows 10 search bar

步骤 7.2:通过 python pip 在系统范围内安装 tensor flow

打开命令提示符后,带 GPU 支持的 Tensorflow 的系统范围安装命令如下:

pip3 install --upgrade tensorflow-gpu

“pip3”命令(相对于“pip”)是必需的,因为安装到 Python 3。在命令提示符下执行该命令如图 22 所示。

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

Fig 22: Pip install command for Tensorflow with GPU support

该命令的输出如图 23 所示,如果一切按计划进行,最终应该会有一条消息确认 Tensorflow 已经成功安装。

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

Fig 23: Command prompt messages shown when Tensorflow GPU 1.12.0 installed successfully.

步骤 8:测试 TensorFlow 的安装及其对 GPU 的访问

进入 windows 中的开始菜单,搜索名为“idle”的 IDE,如果你像我在步骤 6 中所做的那样选择,它将作为 python 安装的一部分进行安装。一个 Python 窗口应该显示为Python 3.6 . x Shell。在提示符下(用’> > >')导入 Tensorflow 包。这将检查 Tensorflow 是否已安装(因为您可以导入它)。空闲 shell 导入 tensorflow 包的命令如下:

# importing the tensorflow package
import tensorflow as tf 

要测试您的 Tensorflow 安装对 CUDA 的支持,您可以在 shell 中运行以下命令:

tf.test.is_built_with_cuda()

最后,为了确认 GPU 对 Tensorflow 可用,您可以使用 TensorFlow 中的内置实用函数进行测试,如下图所示:

tf.test.is_gpu_available(cuda_only=False, min_cuda_compute_capability=None)

从这里返回一个结果需要几分钟;完成后返回 ,然后提示` > > > '再次出现。导入 tensorflow 和这些测试都显示在 Python IDLE Shell 的图 24 中。

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

Fig 24: Using the IDLE python IDE to check that Tensorflow has been built with CUDA and that the GPU is available

结论

这是我安装 Visual Studio、CUDA Toolkit、CuDNN 和 Python 3.6 的步骤,最终目的是在 Windows 10 上安装支持 GPU 的 Tensorflow。迄今为止,我基于 GPU 的机器学习和深度学习工作一直在 Linux Ubuntu 机器上进行;出于同样的原因,很多机器学习社区的在线支持都集中在 Ubuntu 上。

对于机器学习来说,使用 Windows 的主要缺点是,与在 Linux 上相比,需要从源代码中构建更多的东西(例如使用 Cmake ),并且还需要为构建过程安装额外的软件,例如 Visual Studio。例如,如果您要在 Windows 上安装 Caffe2 ,则没有预构建的二进制文件,Windows build 处于测试和 beta 模式。我在 Windows 10 上安装 CUDA 和 cuDNN 更多的是出于好奇,只是想看看它有多简单(或其他)。

正如我在第一部分中所暗示的,现在 CUDA、cuDNN 和 Tensorflow 已经成功安装在 Windows 10 上,并且我已经检查了 Tensorflow 对 GPU 的访问,我将清除整个 Windows 10 操作系统,以便全新安装 Ubuntu 18.04 LTS。这个新的 Ubuntu 安装将在本系列的第 3 部分中讨论。

这篇文章也在 https://schoolforengineering.com 的这里发表过。

实例选择:数据采样背后的神话

原文:https://towardsdatascience.com/instance-selection-the-myth-behind-data-sampling-d3556ea2e37d?source=collection_archive---------23-----------------------

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

任何大数据系统中最常见和最具挑战性的问题之一是选择分层样本,使其能够代表整个数据群体的特征。从数据注释到评估数据集的选择,数据采样是每个数据科学解决方案成功的关键。高效采样也是一个关键要求,因为它假设在这个采样集上训练的机器学习模型和生成的洞察对更广泛的集合适用。

实例选择的概念是通过保持基本分布不变从总体中选择一个子集,以便采样数据能够代表整个数据总体的特征。

让我们假设您有大约 100 亿个未标记的数据点。要解决你遇到的这类问题,可能需要一种监督的方法。现在的问题是*如何注释所有这些数据点?*除非你想出一种方法来自动化注释过程,否则在许多人类专家的帮助下,这将花费大量的时间。即使我们设法拥有所有数据的标签,由于资源限制,在非常大量的数据上训练机器学习模型有时也是不可行的,并且可能消耗非常大量的时间来训练,这也导致不可行的状态。同时,大量的数据可能彼此相似。因此在图案中引入了冗余。这种冗余数据在模型的学习过程中帮助不大。我们可以通过仔细分析数据集中存在的所有维度来大幅缩减数据集,从而减少训练时间并提高性能。

实际上,处理这种情况的方法是计算在可用时间和可用资源内可以注释的数据量,并从总体中选择许多样本,使样本遵循总体数据的相同基本分布。有两种方法可以实现这一目标:

  1. 定量取样
  2. 数据驱动采样[实例选择]

2 训练机器学习模型的主要目的是学习多个类别/聚类之间的决策边界,或者学习输入数据分布。从统计学上来说,对于这些情况,只要群体和采样数据之间的基础数据分布不变,学习将是相似的。

  1. **定量抽样:**这种抽样技术需要大量的领域知识和对数据的深入理解。该策略根据数据类型而不同,无论是文本数据、图像数据、音频数据还是视频数据等。

一、**唯一性:**采样的第一步是找出唯一的数据点。独特性可以用几种方式来定义。在文本数据的情况下,如果两个文档具有相同顺序的完全相同的单词集,则它们可以被认为是重复的,或者在图像数据的情况下,如果两个图像数据(相同大小)之间的欧几里德距离小于ε,则这些可以被认为是重复的。找出所有重复的数据点,其中只有一个将代表其他重复的数据点。

二。**模式:**这一步非常棘手,需要领域知识。大多数情况下,我们需要手动或通过半自动过程从数据中识别一组模式/结构。如果我们有一个时间序列数据,也许一个模式是周期性的。也许我们能发现一种模式每个月都在重复。然后,我们需要选择分布在一年中每个月的候选数据,但对个别月份的数据进行缩减采样。

对于文本数据,在删除停用词后,我们可以用相应的“词性”替换每个词,如下所示:

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

POS tag of text document

可以将词性标签序列视为给定文本的结构,并基于词性标签序列进行数据的重复数据删除。但是我们需要确保在样本空间中维护词汇。

**2。数据驱动采样:**实例选择首先从所有重要维度的数据采样开始。进行数据驱动采样的方法之一是首先以监督或非监督的方式学习数据的分布式嵌入表示,然后遵循候选选择的贪婪算法,其思想是选择一个数据点作为位于 delta-ball 距离内的所有其他数据点的代表。如下图所示,每个浅绿色或浅红色圆圈是一个半径为δ的球体,仅从球体中选择一个数据点作为球体的代表。关于 delta 的选择有不同的研究。可以在质心和边界区域周围选择较小的增量,而在其他区域选择相对较大的增量值。增量越大,表示越稀疏。对δ的这种选择将确保质心和边界区域中的密集群体,而导致中间区域周围的稀疏群体。

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

Visualization of delta-ball sphere

在文本数据的情况下,可以利用 word2vec、fasttext 或 Glove 嵌入,而在图像数据的情况下,可以训练低延迟分类器模型来获得分布式嵌入表示。

**结论:**从数据收集到模型维护,在数据科学产品生命周期的每一步,相关数据点的选择都起着至关重要的作用:

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

I .人类专家用于注释的所有数据点是什么。

二。所有数据点将用于模型训练。

三。如何对评估数据集进行采样以测量已训练模型的性能。

四。历史中的所有数据点都需要重新运行更新的模型,因此我们只在选择的实例上重新运行模型,这些实例很可能会绕过邻居群集。

Git: 助手代码可用这里

用于音频分析的瞬时频率特征与频谱特征

原文:https://towardsdatascience.com/instantaneous-frequency-features-vs-spectogram-features-for-audio-analysis-fac224d84152?source=collection_archive---------38-----------------------

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

What a spectrogram looks like.

音频信号表示

首先,让我们试着理解音频信号是如何表示的。音频信号由不同的正弦分量组成,可以用数学方法表示如下:

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

其中 x(t):信号,r(t):幅度,θ(t):信号正弦分量的相位。

音频信号的幅度-时间表示可以如下所示:

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

Amplitude time representation.

音频信号的频谱图特征

它是信号频谱随时间变化的直观表示。可以使用几种方法生成频谱图,包括傅立叶变换、小波变换和带通滤波器。

设 x 是长度为 n 的信号。考虑长度为 m 的 x 的连续段(或“片段”),其中 m ≤ n,设 X ∈ R ^(m×(N−m+1)是以连续段作为连续列的矩阵。换句话说,[x[0],x[1],。。。,x[m 1]]^t 是第一列,[x[1],x[2],。。。x[m]]^T 是第二列,依此类推。X 的行和列都是按时间索引的。

窗口大小为 m 的 x 的谱图是矩阵 xˇ,其列是 x 的列的 DFT。因此

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

xˇ的行按频率索引,列按时间索引。

python 中的声谱图定义在声谱图中提供。

瞬时频率特征

瞬时频率特征也称为 IF,当与 mel-filterbank 结合时,产生 ifgram 特征矩阵,而不是频谱图特征矩阵。

对于音频信号,瞬时频率在数学上定义为:

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

其中φ(t)表示瞬时频率,d(θ(t))表示相位,t 表示音频信号的时间参数。mel-ifgram 特征矩阵具有类似于 Mel-spectra gram 特征矩阵的形状,但是包括时间导数分量。数学上,mel-ifgram 特征矩阵可以定义为 IF 频谱图和滤波器组矩阵的点积。

Ifgram 中解释了 python3 中瞬时频率特性的实现。

带 R 的整数规划

原文:https://towardsdatascience.com/integer-programming-in-r-33ee6f48a3c8?source=collection_archive---------11-----------------------

r 代表工业工程师

探索“LP solve”R

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

Image by Nick Hillier available at Unsplash

运筹学

运筹学是一种科学的决策方法,通常在需要分配稀缺资源的条件下,寻求系统的最佳设计和操作。制定决策的科学方法需要使用一个或多个数学/优化模型(即实际情况的表示)来做出最佳决策。

优化模型寻求在满足给定 约束 的决策变量的所有值的集合中找到优化(最大化或最小化) 目标函数决策变量 的值。它的三个主要组成部分是:

  • 目标函数:要优化的函数(最大化或最小化)
  • 决策变量:影响系统性能的可控变量
  • 约束:决策变量的一组限制(即线性不等式或等式)。非负约束限制决策变量取正值(例如,您不能产生负的项目数 x 1、 x 2 和 x 3)。

优化模型的解称为最优可行解

建模步骤

精确地模拟一个运筹学问题是最重要的——有时也是最困难的——任务。一个错误的模型将导致一个错误的解决方案,因此,不会解决原来的问题。以下步骤应该由具有不同专业领域的不同团队成员执行,以获得模型的准确和更好的视图:

  1. 问题定义:定义项目的范围,确定结果是三个要素的确定:决策变量的描述、目标的确定和限制条件(即约束条件)的确定。
  2. 模型构建:将问题定义转化为数学关系。
  3. 模型求解:使用标准优化算法。在获得解决方案后,应进行敏感性分析,以找出由于某些参数的变化而导致的解决方案的行为。
  4. 模型有效性:检查模型是否如预期的那样工作。
  5. 实施:将模型和结果转化为解决方案的建议。

整数规划

整数规划(也称为 IP)是一种运筹学技术,当(通常)所有的目标和约束都是线性的(在变量中)并且所有的决策变量都是整数或二进制(即 0 或 1)时使用。当决策变量的子集被允许连续时,这有时被称为混合整数线性规划(也称为 MILP)。

来自 R 的 lpSolve 包包含了几个用于解决整数规划问题和获得重要统计分析的函数。对于下面的例子,让我们考虑下面要求解的数学模型:

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

这是一个整数规划问题的例子,其中所有决策变量都是二进制的(即,它们可以取值 0 或 1)。

我们来看看 R 代码!

Integer Programming R Code

解决方案:

在满足给定约束的情况下可以获得的最大 z 值(因此也是最优值)为 19,其中 x 1 = 1 ,x 2 = 1, x 3 = 0, x 4 = 0。灵敏度系数从 0,0,-1e+30 和-1e+30 到所有的 1+e30。约束的影子/对偶价格分别为 0、0 和 0,而决策变量的影子/对偶价格分别为 8、11、6 和 4。约束和决策变量的影子/双重价格下限都是-1.0e+30。最后,约束的影子/双重价格上限分别为 1.0e+30、1.0e+30、1.0e+30、1.4e+00,而决策变量的上限分别为 1.285714e+00、5.0e-01 和 6.667e-01。

总结想法

整数规划代表了另一种更好的决策优化技术。 lpSolve R 包允许用几行代码解决整数规划问题并获得重要的统计信息(即敏感性分析)。虽然有其他免费的优化软件(如 GAMS、AMPL、TORA、LINDO),但在您的个人代码库中存储一个整数优化 R 代码可以节省您大量的时间,因为您不必从头开始编写公式,而只需更改相应矩阵的系数和符号。

— —

如果你觉得这篇文章有用,欢迎在 GitHub 上下载我的个人代码。你也可以直接在 rsalaza4@binghamton.edu 给我发邮件,在LinkedIn上找到我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的媒体 个人资料 来探索我以前的文章。感谢阅读。

罗伯特

在你的应用中集成人脸检测

原文:https://towardsdatascience.com/integrate-face-detection-in-your-app-df29f6ae932a?source=collection_archive---------24-----------------------

不要不知所措,因为将人脸检测添加到您的应用程序从未如此容易!

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

Face detection on an original image by Austin Distel on Unsplash

很多时候,人脸检测不是应用程序的主要焦点,但却是一个重要的组件,许多开发人员只是被将人脸检测添加到他们的应用程序的想法所淹没。

如果应用程序要计算进出商店的人数,开发人员需要检测的人脸来计算人数。在这样的情况下,他们肯定不希望重新发明轮子,建立自己的人脸检测器(除非你有巨大的预算和开发时间,当然还有机器学习团队)。相反,他们希望获得市场上已有的人脸检测器,并将其集成到他们的应用程序中,并继续专注于他们应用程序的目标。

想象一下,如果像 Facebook Messenger、WhatsApp 和 Viber 这样的即时通讯平台都要重新发明 TCP/IP ,那么今天还会有多少即时通讯平台存在。

在这篇文章中,我将讨论你可以从*(还有很多我没有探索的,所以也可以随意寻找其他解决方案)和中选择的一些选项,以及示例 python 代码,用于人脸检测*。

因此,让我们来看看今天您可以选择的一些人脸检测器,以便您可以轻松地将其集成到您的应用程序中,减少您的开发时间,使您能够更快地交付给您的客户。

微软 Azure Face API

Face API 是微软 Azure 提供的认知服务之一。它可以用于使用客户端 SDK 在本地或使用 REST API 在云中检测人脸。面向 Face API 的客户端 SDK 可用于。NET,Python,Java,Node.js. Go,还有 iOS。

下面是使用 Face API Python Client SDK 进行人脸检测的代码片段:

下面是在一些面部图像上运行上述人脸 API Python 客户端 SDK 人脸检测代码的输出:

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

从上面的输出图像中,我们可以观察到所有正面人脸都被检测到,一些侧面人脸被检测到,而一些被 Microsoft Azure Face API 遗漏。

关于 Azure Face API 的更多细节,请参考文档

亚马逊认知

亚马逊 Rekognition 可以检测图像和视频中的人脸。当提供人脸图像或视频时,它给出人脸所在位置的信息。Amazon Rekognition 在云端进行人脸检测,并提供 Java、Python、.NET、Ruby 和 Node.js 来封装实现,让开发者更容易使用。

以下是使用 Python SDK 将 Amazon Rekognition 用于人脸检测的示例代码:

下面是在一些面部图像上使用 Python SDK 对面部检测代码运行上述 Amazon Rekognition 的输出:

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

从上面的结果中,我们可以看到所有的人脸,正面和侧面人脸都被 Amazon Rekognition 检测到了。

关于亚马逊 Rekognition 的更多细节,请参考文档

Xailient FaceSDK

Xailient 的 FaceSDK 是世界上最快的人脸检测器。人脸检测发生在设备本身,并针对 Raspberry Pi 等边缘设备的使用进行了优化。Xailient 的 Face SDK 适用于 ARM 32、ARM 64 和 x86_64 设备。

当您下载 FaceSDK 时,它附带了示例代码和测试图像,您可以毫不费力地看到它正在运行。

以下是使用 Xailient Python Face SDK 进行人脸检测的示例代码:

以下是 Xailient FaceSDK 对相同输入面部图像的输出:

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

我们可以观察到,使用 Xailient FaceSDK 可以检测到所有正面和大部分侧面轮廓的面。

有关 Xailient FaceSDK 的更多信息,请参考网站

谷歌云视觉 API

谷歌的云视觉 API 也有一个人脸检测功能。类似于 Amazon Rekognition,为包括 C#、Go、Java、Node.js、Python PHP、Ruby 在内的不同语言提供了使用人脸检测的客户端 SDK。

下面是使用谷歌云视觉 API Python SDK 的人脸检测的示例代码:

下面是在一些面部图像上运行上述谷歌云视觉 API Python SDK 人脸检测代码的输出:

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

使用 Google Vision API,可以检测到大多数人脸,包括正面和侧面。

有关谷歌用于人脸检测的云视觉 API 的更多信息,请参考文档

在这篇文章中,我们看了一些人脸检测器:微软 Azure FaceAPI,亚马逊 Rekognition,Xailient FaceSDK 和谷歌云视觉 API,用 Python 编写了样本代码,并输出了在一些面部图像上运行它们的图像。虽然亚马逊人脸识别在样本输入图像中显示出最好的结果,但所有四个人脸检测器表现同样出色。使用微软 Azure FaceAPI亚马逊 Rekognition谷歌云视觉 API 在云上为人脸检测处理图像,而使用 Xailient SDK 在本地(设备上)处理图像。这四个工具都很容易使用, Xailient SDK 是最简单的,因为它需要最少的代码来运行面部检测

您正在使用人脸检测构建什么应用程序?你用的是哪个人脸检测器? 在下面留下你的想法作为评论。

原载于*www.xailient.com/blog*。**

更多故事:

在计算受限的设备上运行深度学习计算机视觉的挑战

运行物体检测上的挣扎

你现在需要从云计算转移到边缘计算!

将业务优化与机器学习模型相集成

原文:https://towardsdatascience.com/integrating-business-optimization-with-a-machine-learning-model-ad0471420693?source=collection_archive---------9-----------------------

在本文中,我们阐述了将优化业务指标的目标与机器学习管道相集成的概念。具体来说,我们展示了一个简单的优化循环如何围绕一个核心 ML 算法来引导它实现特定的业务目标的案例说明。

介绍

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

机器学习(ML)的需求量很大。人工智能的这一分支正在颠覆传统和现代商业实践,并带来一生一次的变革。

[## 机器学习革命:人工智能如何改变你的业务

像机器学习(ML)这样有影响力的技术,很难避免夸张。当然,数十亿…

www.forbes.com](https://www.forbes.com/sites/allbusiness/2018/10/20/machine-learning-artificial-intelligence-could-transform-business/#7815726cc6c3)

然而,关于 ML 算法、工具和技术的学术讨论和在线文章通常只关注它们的实现、性能、部署和可伸缩性。

也详细讨论了 ML 的业务方面,但是这些讨论通常与核心算法或 ML 管道有些距离。很难找到一个简单的 ML 管道的例子,它整合了实现体面的 ML 性能和满足相当普通和直观的业务目标的双重目标。

然而,大公司在他们的运营中不断地进行这种整合——应用 ML 并调整管道以推动它满足整体业务目标(或其子集)。

对于年轻的数据科学和 ML 实践者来说,如何用一个足够简单的例子——也许是几行代码——来演示这个想法并不是很直观。

在本文中,我们展示了一个这样的例子。

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

机器学习问题:高精度

对于案例说明,我们将想象一个非常简单的场景— 一家全新的创业公司通过提供基于 ML 的预测分析产生收入

特别是,它们接收数据流并预测二进制类作为输出——“是”或“否”。在其服务的核心,他们使用基于决策树的分类模型和集成技术——使用 AdaBoost 分类器

他们预测的准确度越高,收入就越高。

当然,你可以做一个随机的预测(下面没有任何模型),仍然有 50%的预测正确。因此,他们只有在高于某个阈值的更高精度下才能获得报酬,这个阈值可以低至 50%。例如,如果他们对某项工作的预测准确率为 75%,那么他们将获得与 75% — 50% = 25%成比例的收入。

但是它们是如何达到更高的精度的呢?

一个简单直观的答案是调整算法的超参数。在像 AdaBoost 这样的算法中有相当多的超参数——大部分与底层的基本估计量有关。对于决策树,这些可以是每片叶子的最小样本数、最大树深度、像基尼指数这样的分裂标准等等。然而,为了使这个例子简单,我们选择了最直观的超参数——应用于增强的树估计器的数量

在其核心,集成技术,如 Boosting 通过保持基本估计器相对简单和低精度(略高于 50%是好的)来工作。他们通过并行使用大量这种简单的基本估计器来实现强大的泛化能力,并对其预测进行平均,动态更新估计器在前一次迭代中出错的例子。

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

Source: Realizing Low-Energy Classification Systems by Implementing Matrix Multiplication Directly Within an ADC ( IEEE Transactions on Biomedical Circuits and Systems)

因此,毫不奇怪,较高数量的基本估计量可能导致更大的泛化能力——对客户数据(真正的未知测试集)的更高准确性。

之前,我们建立了一个简单的场景,即收入与客户提供的数据的预测准确度成正比。

因此,似乎最大化 ML 模型准确性的策略,从而最大化公司的收入,是保持单个基础评估者真正简单——选择树的最大深度,比如 2 或 3——并且使用大量的基础评估者

这似乎是一个简单的策略。但是,它可能不是最佳的。

收入不是利润。十有八九,年轻的初创公司希望利润最大化,而不仅仅关注收入,因为这显示了他们的长期生存能力,并有助于他们获得更多投资和更多客户。

让我们稍微深入一下利润方面。

商业目标:利润最大化

利润是王道(至少在大多数商业情况下是如此),对于大多数类型的企业来说,利润是经济附加值的一个非常好的指标。没有人更喜欢以较低的运营成本获得可观的收入。

我们了解 ML 模型和收入之间的关系。但是,运营成本与模型有什么关系呢?

在现实生活中,这可能非常复杂。但是为了便于说明,我们可以简单地假设成本与模型拟合和预测的总计算时间成比例

这并不难想象,因为如果年轻的初创公司租用某种云服务来托管和运行他们的 ML 算法,例如 AWS EC2,这种情况将是类似的,它是基于总计算时间计费的。

现在,您还记得感兴趣的超参数 Boosting 算法的基本估计数吗?坏消息是,这个数字越大,算法的计算量就越大,模型拟合和预测的计算时间就越长。

因此,我们确定了 ML 算法的单个超参数和两个业务指标(收入和成本)之间的关键关系。

什么是利润?这是一个很好的古老定义,

利润=收入-成本

最优化问题:如何选择最大似然算法来实现利润最大化?

这与传统的关于 ML 算法选择的讨论有些不同,不是吗?你可能已经做过很多次了,

  • 偏差-方差权衡分析
  • 对超参数进行网格搜索以确定最佳精度
  • 争论 ML 性能测量的正确标准— 准确度/精确度/召回率?F1 比分ROC 曲线和 AUC
  • 头脑风暴数据获取和注释策略——进行特定的特征工程有意义吗?为增加训练集的大小而多花钱买几个标注有意义吗?

所有这些仍然至关重要。

但是,从商业的角度来看,很可能你被评判的唯一标准是你的 ML 算法能产生多少利润。如果它是一个很大的正数,高层管理人员很可能不会追问你算法的细节。如果是负面的,一切都可能失控!

因此,我们必须采取以下平衡措施,

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

我们构建了一个极其简单的场景,但至少,它显示了一个公平的机会,即一个算法选择可以与一个关键的业务指标紧密结合。

当一个模型参数同时影响两个输出(在我们的例子中是精度和成本)时,优秀的工程师会怎么做?

他们优化。

他们试图找到模型参数的最佳设置,这将最大化业务指标,在这种情况下是利润。

让我们通过一个简单的代码演示来看看如何做到这一点。

演示:以业务为中心的 ML 优化

事实上,遵循代码是乏味的,而且会让人分心。创意和图片好多了:-)

因此,我将让您从 Github repo 这里的派生并复制这个演示的代码。但是主要思想如下,

感兴趣的超参数——决策树估计器的数量——已经被编码为目标函数的参数,优化器算法可以最小化该参数。目标函数值的计算考虑了验证集上的提升算法精度和与模型拟合和预测所花费的时间成比例的简单成本项。

下面是训练集和验证集的准确性如何随着决策树估计器的数量而变化。

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

这里是计算时间(模型拟合和预测),

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

很明显,对于少数估计器,精确度从低值开始,但是在数量达到一定水平后 T4 就会饱和。另一方面,计算负荷持续增加。

因此,随着边际收益率(就提高精确度而言)在某一水平达到峰值然后下降,继续增加估值器的数量是没有意义的。

啊…就是这个…著名的 边际收益率 ,对商界人士来说是如此的近和贵。

机器学习科学家、工程师和业务开发团队终于有了一个共同的概念来思考,一个共同的衡量标准来绘图和决策。

为了更清楚地说明这种行为,我们构建了一个 目标函数通过在一个具有适当权重的线性函数中组合验证集精度和计算时间,将精度和计算成本集成到单个标量输出中。如果我们绘制目标函数,可以清楚地看到 MRR 行为,

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

很容易看出,在这个等式中,准确度系数是正数,而计算时间系数是负数,以反映目标的真实性质——从收入中减去成本。

Github repo 中,我还展示了如何通过调用 Scipy 包中的函数来解决优化问题。对于这个特定的例子,目标函数是非常简单的,并且一个简单的图将显示演变,以确定包括在 ML 算法中的树的最佳数量是大约 10 或 11。所以,确实不需要使用 Scipy 函数。

但是,同样的想法可以扩展到一个更复杂的目标函数,其中包括过多的最大似然超参数。然后,优化算法的全部能力可以用来解决以业务为中心的优化。

参见本文中关于 Scipy 优化算法的讨论,

[## SciPy 优化及其在机器学习中的应用

我们展示了如何使用 Python 中最流行的科学分析包— SciPy 来执行优化,并讨论了…

towardsdatascience.com](/optimization-with-scipy-and-application-ideas-to-machine-learning-81d39c7938b8)

摘要

在本文中,我们讨论了以业务为中心的优化。讨论了一个简单的演示来清楚地说明这个想法——通常,ML 算法及其设置的选择需要由业务度量优化的总体目标来指导。在这种努力中,用优化循环包装核心 ML 算法对于快速决策非常方便。

事实上,在我之前的一篇文章 的 中,我谈到了这个想法不需要局限于单一类型的机器学习,甚至是单一类型的分析过程,而是可以跨越多种定量学科——ML 模型、统计估计、随机模拟等。—全部输入到一个通用优化引擎。

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

如果您有任何问题或想法要分享,请通过tirthajyoti【AT】Gmail . com联系作者。另外,你可以查看作者的 GitHub 资源库中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样,对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。

[## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…

通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…

www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)

整合民族志和数据科学

原文:https://towardsdatascience.com/integrating-ethnography-and-data-science-baa65690dde0?source=collection_archive---------26-----------------------

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

Picture from Frank V

作为一名数据科学家人种学家,我参与过许多类型的研究项目。在专业和商业环境中,我对数据科学和人种学的巨大发展感到兴奋,但也感到沮丧,尽管最近的发展使它们更加相似,但它们各自的团队似乎越来越疏远,相互竞争。

在学术界,定量和定性研究方法在历史上发展为截然不同和相互竞争的方法,就好像一个人在做研究时必须选择哪个方向:部门或个人研究人员专门研究这个或那个,并争夺稀缺的研究资金。这种划分的一个主要理由是,与倾向于描述性和自下而上的定性方法相比,定量方法倾向于指令性和自上而下。不幸的是,许多专业研究背景继承了这种划分。

数据科学的最新发展与定性研究相类似,如果有什么不同的话,可能是合作混合的起点。统计学入门课程中教授的“传统”统计学通常是自上而下的,假设数据遵循一个规定的理想模型,并根据该理想模型提出系统化的问题。在机器学习的发展过程中,出现了一种向模型的转变,这种模型是根据所讨论的数据和环境量身定制的,并且是反复开发和改进的。这些趋势可能会打破传统统计工作自上而下的性质。

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

Picture from Arif Wahid

如果有一个时间来整合定量数据科学和定性人种学研究,那就是现在。在日益重要的“数据经济”中,理解用户/消费者对于发展战略性商业实践至关重要。在商业世界中,面向社会的数据科学家和人种学家都是理解用户/消费者的专家,但将他们分成相互竞争的群体只会妨碍他们的洞察力的真正综合。整合两者不应该仅仅包括合并各自的研究团队和他们的项目,还应该鼓励研究人员发展两者的专长,而不是简单地专攻一个或另一个。当我们不再将这些视为独特的方法或专业时,新的创造能量就会爆发。

【I】纳福斯,d .&诺克斯,H. (2018)。数据饱和世界的民族志。曼彻斯特:曼彻斯特大学出版社,11-12。

(原刊在此:https://ethno-data . com/integrating-ethnography-and-data-science/。其余的文章请随意查看:【http://ethno-data.com/。)

也感谢《数据科学》杂志发表这篇文章。关于他们工作的更多细节,见

在以用户为中心的 ML 模型开发中整合人物角色

原文:https://towardsdatascience.com/integrating-personas-in-user-centered-ml-model-development-afb593741c49?source=collection_archive---------16-----------------------

有一个来自以用户为中心的设计领域的关键工具,它可以改变我们从根本上设计和构建 ML 系统的方式。

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

How do we keep users at the forefront of our ML systems?

ML 模型开发困难重重,充满挑战——不仅难以构建能够提供经过适当格式化、预处理、缩放和训练的大型数据集的数据管道,还存在平衡、偏差、训练外性能和整体模型性能的问题。

所有这些工作会导致我们只见树木不见森林。

我们应该问的更深、更基本的问题

开发正确的模型架构和数据管道,虽然华而不实,值得新闻报道,但只是过程的一部分。是的,积累一个大的数据集对于建立一个有效的 ML 模型是非常重要的,但是它又一次忽略了开发 ML 产品的一些更基本的挑战:

  • 这种模型实际上解决了用户的需求吗,或者我们只是“用机器学习来解决问题”,希望会出现一些神奇而强大的东西?
  • 这个模型是否正确地模拟了用户问题的输入?或者我们的系统中有没有其他我们没有考虑到的输入?
  • 如果我们实现了机器学习系统,是否会出现我们没有考虑到的二阶效应?

在我的上一篇文章和我的 PyGotham 演讲中,我认为在问题域中建立模型的最佳方式是在整个开发生命周期中从根本上保持用户的中心地位。事实证明,在过去的几十年里,以用户为中心的设计领域一直倡导这种思想。

什么是以用户为中心的设计?什么是人物角色?

以用户为中心的研究的核心是人物角色,它们是真实用户的虚拟表现,为我们的开发工作提供信息。由程序员艾兰·库伯在80 年代开发,角色:

  • 是团队根据真实客户创造的虚构角色
  • 用名字、爱好和生活趣闻将它们带入生活
  • 叙述他们的目标、恐惧和与产品相关的目标

当整个团队将角色内在化时,它有助于集中他们的工作。他们现在可以称呼用户的名字,考虑他们开发的每个产品功能或机器学习能力是否会影响他们的客户个人。

简而言之,人物角色激励我们的客户,并把他们放在我们做出的每个产品(和数据)决策的首位。

见见团队

想象一个场景在 AcmeWidgets.com 的工程团队中展开,我们的团队正在为电子商务零售商开发一个推荐系统,以在产品页面上显示相关商品。为了做到这一点,一个由 ML 工程师和数据科学家组成的技术娴熟的团队聚集起来构建这个系统。

团队首先为他们的模型定义一个目标函数。在这种情况下,团队决定选择一个使购物车价值最大化的函数(我们的目标函数)。例如,它可能会发现用户倾向于在我们的目录中购买一系列高价商品。

然而,事情很快就出了岔子。该团队注意到,他们的模型最终给出了低质量的推荐,牺牲了长期客户保持率来换取平均订单价值的短期提升。该团队发现,他们的模型最终会促使客户购买他们并不真正想要或需要的物品,从而降低客户对产品和业务的长期忠诚度。事实上,推荐引擎推荐的产品最终会以高得多的比率被退回,从而导致企业的运营支出和成本。

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

Photo by Christina @ wocintechchat.com on Unsplash

当然,这只是调整模型的问题!团队回到绘图板,这一次推出了一个模型,该模型改变了模型的目标函数,以最小化其产品的回报率。模型经过测试,瞧,系统又开始愉快地运行了。用户似乎对他们的购买很满意…

…直到三个月后,他们发现与这个推荐引擎交互的用户实际上比那些没有看到推荐的用户更频繁地离开产品!事实证明,这些推荐让用户如此不安和愤怒,以至于他们甚至懒得返回。

因此,团队回到了绘图板,沮丧并对他们在项目的下一次迭代中可能发现的其他东西有一种不祥的预感。

哪里出了问题?

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

Photo by Kelly Sikkema on Unsplash

如果我们回去和团队一起参加他们的项目回顾会,我们可能会听到这样的反映:

  • 在我们的模型中,我们没有考虑全套的用户生命周期指标
  • 我们考虑得不够全面
  • 我们冲向市场,相信我们知道正确的前进方向
  • 有些客户边缘案例我们没有考虑

当然,这些东西很多只能从经验中学习!但是,对于这个项目来说,还有更好的前进方式吗?

关键问题是团队只在战术层面思考。他们认为——“哦,推荐引擎应该很简单。我们将为我们的模型引入架构 X,针对目标 Y 进行训练,并在我们能够实现模型性能 Z 时交付它。

人物角色让我们站在客户的角度,因此我们可以发展专家的直觉

ML 从业者经常会告诉你,一个伟大的 ML 系统融合了领域专长专家直觉。这意味着 ML 模型必须由团队成员设计,他们对业务领域有深刻的理解,对数据集有深刻的熟悉,对客户的需求有深刻的直觉。

你如何获得领域专业知识?嗯,你必须让合适的人加入到团队中,解决合适的问题,在模型开发过程中的所有环节考虑客户。用户角色是如何帮助我们避免这种情况的?

想象一下,在开始的时候,团队同意将他们的客户视为现实世界中活生生的人。事实上,他们的 UX 同事做了一系列客户访谈,得出了一系列客户综合草图:

办公室管理员卢克

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

Photo by Marius Ciocirlan on Unsplash

剖面图

卢克是一名 31 岁的男子,住在印第安纳波利斯,是一家小型物流公司的办公室管理员

动机

Luke 需要在办公室存放一些小工具,供员工使用。考虑到办公室的小配件经常缺货,他需要每隔几周就补充一些。他害怕不得不重新登录网站下订单,因为他觉得这很乏味。

目标

同一 SKU 的无缝、定期订单再履行

和谐,婚礼策划

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

Photo by Kim Carpenter on Unsplash

简介

27 岁的哈莫尼住在波士顿,经营着一家刚刚起步的活动策划公司。她喜欢在自己的活动中提供 Acme 小配件,因为它们受到客人的喜爱,并为她的企业提供了她需要的知名度。

动机

哈莫尼梦想在她的城市建立一个活动策划帝国

目标

独特、难找、令人向往的小配件,让她的生意脱颖而出

天齐,自由职业爸爸

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

Photo by JodyHongFilms on Unsplash

简介

田琦是一名生活在上海的远程自由职业者,他享受在家工作的灵活性,因为这让他可以在伴侣全职工作的同时为家人照看孩子。

动机

天齐希望在预算有限的情况下,过上有序、高效的家居生活

目标

以预算价格购买他想要的东西。

如何将人物角色整合到模型开发中

我们可能想要考虑人物角色的原因是,这样我们可以直接了解我们客户的目标动机。Harmony 希望发现流行的独特商品。卢克只是想完成办公室的一个经常性订单。天齐想要最便宜的东西。

经常讨论它们

该团队在考虑其推荐算法时,应在开发其模型时主动提及 Harmony、Luke 和 Tianqi 的名字-

队友 1:如果我们选择使用协作过滤模型,我们必须考虑这样一个事实,即我们只有非常小的用户样本量符合 Luke 的用例(power fulfiller)。我担心在任何有意义的信号出现之前,Luke 的团队会看到许多垃圾推荐,并对我们的产品失去兴趣。

队友 2:是啊,的确如此。但我们知道,Harmony 的团队占我们销售额的 75%以上。这里有很多机会。如果我们用强盗的方法呢?这应该有望最大限度地减少出现在用户面前的不良推荐的数量。

队友 1:这主意不错。鉴于我们的经营规模,我们可以很快学会,我们可以尽量减少向卢克团队提供糟糕建议的时间。

或者考虑开发过程中的另一个场景,团队不得不在野外与推荐者进行负面互动:

队友 1:我们在 Twitter 上收到一些客户反馈,说我们的产品太贵了。显然,一些顾客觉得他们被骗了,购买了他们并不需要的东西——天齐一族。我们如何确定人们确实收到了有价值的推荐呢?

队友 2:为什么他们觉得自己的物品没有价值?

队友 1:由于某种原因,我们的推荐系统正在制造某种买家的遗憾。我们可能会过度宣传我们的一些促销活动,或者我们可能会推出一些有质量问题的产品。

队友 2:让我先和我们的 UX 设计师朱莉谈谈,看看是否有某种用户研究可以证实或验证这个假设。如果我们需要将某种功能重新整合到我们的模型中,以确保我们做出真正高质量的推荐,那么就让我们整合它吧。否则,如果我们的建议不符合标准,让我们测试一个新的模型变体,我们根本不会显示任何结果。

队友 2:知道了。

看到了吗?我们希望将这种以客户为中心的全面对话融入团队的自然工作方式中。所有这些都是通过客户角色实现的。

让他们看得见,摸得着

我在创业公司工作的时候,我们经常把客户角色打印出来,贴在墙上给团队看。当团队看到活生生的顾客时,他们会想起他们是在为谁解决问题。如果团队陷入了只讨论特征工程问题、精确召回曲线和准确性指标的深层技术细节的陷阱,在房间里提醒您的客户将有助于将 ML 产品与您正在解决的实际客户问题联系起来。

最后

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

Photo by Philipe Cavalcante on Unsplash

人物角色是强大的——但他们不是银弹。人物角色帮助我们做的是把我们的客户想象成真实的人,有真实的目标、动机和挫折。当我们定义我们的客户时,我们给自己一个词汇,将他们作为一等公民来讨论,然后围绕他们确定我们的技术解决方案。

哦——顺便说一下,谷歌的人与人工智能研究(PAIR)团队对设计以人为中心的人工智能产品的过程进行了更多的思考。通读他们的最佳实践指南,从他们构建 ML 产品的丰富经验中学习。

你怎么看?你有以客户为中心构建 ML 模型的经验吗?伸出手让我在 Twitter 上知道在 @andrewhao

参考

原载于

集成 Python 和 Tableau

原文:https://towardsdatascience.com/integrating-python-tableau-5511dd7102e9?source=collection_archive---------5-----------------------

通过引人入胜的数据可视化,让您的分析栩栩如生。

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

当对大型和非结构化数据集执行深入分析时,Python 和相关机器学习库的威力怎么强调都不为过。Matplotlib 是帮助我们可视化结果的一个很好的工具,但是它的风格化选项并不总是最适合用于演示和仪表板。当然,你可以让它工作,但是像 Tableau 这样的可视化软件更适合帮助你讲述你的故事。

为了说明这一点,考虑一个来自金县住房数据集的简单例子。在探索性分析中,您可能会发现位置是价格的重要预测因素,但您想知道是使用邮政编码还是 GPS 坐标作为预测因素。通过创建一个带有经纬度坐标的散点图,创建一个基于价格的彩色地图,我们可以了解哪里的价格最高。

ax = housing_data.plot.scatter('long', 'lat', 
                               c = 'log_price',
                               s = housing_data['log_price'],
                               colormap = 'magma', 
                               figsize=(15, 10), 
                               title='Location-Price Map')
ax.set(xlabel='Longitude', ylabel='Latitude')
plt.show()

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

基于此,我们得到一种感觉,即经纬度与价格之间的关系有点像抛物线,从这里,你可以决定如何继续分析。然而,如果你想让高级经理更清楚地知道哪里的价格最高,这种可视化效果并不理想。使用 Tableau,我们可以创建这样的东西:

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

可以用 Python 中的库创建这样的东西吗?我想是这样的,但是专用于数据可视化的软件可以帮助你以更高的效率获得这些结果。更重要的是,这个软件使得比较不同的风格变得更加容易。请看下面的信息图,它展示了 1999 年至 2016 年美国心脏病死亡率的变化。

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

此图表结合了 Tableau 的可视化效果和 PowerPoint 中的动画选项。我们如何利用 Tableau 的可视化能力和 Python 的分析能力?我会给你三个选择,并强调每个选择的利弊。在这篇文章的末尾可以找到实现的相关文档的链接。

泰比

任何想要结合这些工具的人都可能很快找到标签选项。Tableau 本身开发了 TabPy,并允许您在 Tableau 的计算列中运行 Python 脚本。部署机器学习模块后,您可以将调用函数合并到计算变量列中。

作为一个用例,考虑一个基于位置和其他因素预测房价的机器学习模型。一个住宅开发商可能试图决定在哪里建立一个新的社区,他们想知道在哪里可以得到最好的价格给定的一般特点的家居设计。业务分析师只需输入设计细节和潜在位置,Tableau 将立即提供相关地图和价格预测。

此外,TabPy 还支持高级特性,比如身份验证管理和代码发布。然而,伴随这些特性而来的是额外的复杂性:安装并不总是容易的,对遗留 Python 代码的支持使其运行繁重,并且脚本实现并不总是干净的。但最重要的是,TabPy 依赖于使用 Tableau 服务器,这是一种付费服务。换句话说,这不适用于 Tableau Public,Tableau 的免费版本。基于这些原因,AltTabPy 应运而生。

AltTabPy

AltTabPy 的主要目标是简化和精简 TabPy 的关键功能。就大小而言,AltTabPy 只有 TabPy 的 5%,这使得它的效率令人难以置信。安装可以通过一个简单的 pip 命令完成。并且将代码合并到 Tableau 计算列中要干净得多。

但是,它不提供 TabPy 的高级功能。考虑到这一点,AltTabPy 对于资源有限、没有遗留代码负担的公司或个人来说是一个极好的选择。价值主张实际上与 TabPy 相同,但针对的是不同的用户。最重要的是,不需要 Tableau 服务器。

CSV 共享

尽管功能有限,但 CSV 共享是将数据从 Python 发送到 Tableau 的最简单方式。该选项非常适合于显示历史数据,而不需要即时预测新数据。它也适用于不需要对新数据进行即时预测的单一分析。

这里的方法非常简单,只需对相关数据运行机器或深度学习模型,并将结果数据帧保存到 CSV。

df.to_csv('filename.csv')

从这里,Tableau 可以从主屏幕上的连接菜单连接到相关文件,并选择**文本文件。**从可持续发展的角度来看,数据科学家应该设计代码,以便在新的数据预测可用时更新 CSV 文件。通过刷新 Tableau 中的连接,可以将新数据合并到相关的可视化中。

如果数据科学家被授予写 SQL 服务器的权限,这种策略也可以适用于 SQL。

这里最大的缺点是使用 Tableau 的业务分析师不能添加新数据来预测结果。相反,他们将不得不依靠其他团队来生成预测结果,然后才能将其纳入可视化。

结论

TabPy 是一个端到端的解决方案,允许在团队设置中真正集成 Python 和 Tableau。然而,它带来了更多的复杂性和更高的成本。

AltTabPy 提供了更大的简单性,并且不需要对 Tableau 服务器进行投资。对于使用新版本 Python 并且不需要遗留支持的初创公司来说,这是一个很好的选择。

CSV 共享非常适合不需要共享数据的个人和不需要快速部署机器学习模型的公司。

来源

TabPy 和 AltTabPy 的官方文档可以在下面找到:

使用深度学习对单细胞多组学数据进行综合分析(带视频教程)

原文:https://towardsdatascience.com/integrative-analysis-of-single-cell-multi-omics-data-using-deep-learning-66a61a3448c5?source=collection_archive---------16-----------------------

视频教程#1:

Tutorial on Saturn Cloud

视频教程#2:

单细胞 RNA 测序(scRNA-seq)提供了一种全面、公正的方法,利用下一代测序技术,以单细胞分辨率分析包括 T 细胞在内的免疫细胞。最近,通过测序( CITE-seq )对转录组和表位进行细胞索引等令人兴奋的技术已经被开发出来,通过联合测量多个分子模式(如来自同一细胞的蛋白质组和转录组)来扩展 scRNA-seq。通过利用与寡核苷酸结合的抗体,CITE-seq 同时产生基于测序的表面蛋白表达和基因表达的读数。

由于基因和蛋白质表达传达了关于细胞的独特和互补的信息,CITE-seq 提供了一个独特的机会,将转录组和蛋白质组数据结合起来,以比单独使用其中一种高得多的分辨率破译单个细胞的生物学。这需要能够有效整合来自两种模态的单细胞数据的计算方法。在这篇文章中,我们将使用无监督的深度学习,更具体地说,autoencoder,对 CITE-seq 数据进行综合分析。

数据

我们将使用 2017 年由 Stoeckius M 等人 发表的首个 CITE-seq 数据集。作者测量了大约 8000 个脐带血单核细胞(CBMCs)的单细胞转录组以及 13 种蛋白质的表达。有两个 CSV 文件——一个用于基因表达,另一个用于蛋白质表达,可以从这里下载。 Seurat 是一个 R 包,设计用于单细胞基因组数据的质量控制、分析和探索。在将数据输入到我们的自动编码器之前,我们将首先对数据进行预处理,并使用 Seurat 软件包基于基因表达进行细胞聚类和注释。代码可在随附笔记本中找到。

预处理后,基因和蛋白质表达数据被连接在一起,其中每一列是基因或蛋白质,而每一行是细胞(每个细胞都有一个唯一的条形码)。该数据集包含总共 7895 个细胞的 2000 个基因和 10 种蛋白质的表达水平(3 种由于富集差而被去除)。

Concatenated gene and protein expression data

自动编码器

Autoencoder 是一种无监督的深度学习模型或神经网络,由三个主要组件组成:编码器、瓶颈和解码器,如下图所示。编码器压缩输入,瓶颈层存储输入的压缩表示。相反,解码器试图根据压缩数据重建输入。

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

Image source: https://medium.com/@curiousily/credit-card-fraud-detection-using-autoencoders-in-keras-tensorflow-for-hackers-part-vii-20e0c85301bd

瓶颈层的尺寸通常大大低于输入的尺寸。因此,编码器将尝试了解尽可能多的关于输入的有意义的信息,同时忽略噪声,以便解码器可以更好地重建输入。Autoencoder 可以用作降维算法,存储在瓶颈层中的输入的低维表示可以用于数据可视化和其他目的。此外,由于其灵活的神经网络架构,它提供了无限的方法来将基因和蛋白质表达数据整合到 autoencoder 中,正如我们将在下面看到的。

履行

由于基因和蛋白质数据具有显著不同的维度,我们将首先使用两个不同的编码器分别对它们进行编码,然后将输出连接起来,这些输出将通过另一个编码器来生成瓶颈层。随后,解码器将尝试基于瓶颈层重建输入。总体神经网络架构如下所示:

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

Autoencoder architecture

使用 Pytorch 和 fastai 库,自动编码器的实现非常简单。在这个例子中,压缩的基因和蛋白质数据的维数分别是 120 和 8,瓶颈层由 64 个神经元组成。完整的代码可以在这个(仅限基因)和这个(基因和蛋白质)的随机笔记本中找到。

Autoencoder implementation

结果

除了根据基因和蛋白质表达数据训练的模型之外,我们还仅使用基因表达数据训练对照模型。通过这种方式,我们将能够辨别对 CITE-seq 数据进行整合分析的任何优势。在训练模型后,我们提取存储在瓶颈层的原始输入的 64 维压缩表示,随后在由 t-SNE 生成的二维地图上可视化。

如下图所示,转录组和蛋白质组数据的综合分析产生了比单独使用基因表达数据更好的结果。例如,当仅使用基因表达数据时,CD8 T 细胞(红色箭头)和 CD4 T 细胞簇一起形成了一个大的“岛”,并且不能被分开。相比之下,当将蛋白质表达数据与基因表达数据结合时,CD8 T 细胞(红色箭头)形成与 CD4 T 细胞群完全分离的独特群。因此,组合分析在分析 CITE-seq 数据时比使用单一分子模式的数据更有效。

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

Visualization based on gene expression data only. The red arrow points at CD8 T cells.

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

Visualization based on both gene and protein expression data only. The red arrow points at CD8 T cells.

总结和未来方向

在这里,我们建立了一个基于自动编码器的深度学习模型,用于单细胞 CITE-seq 数据的降维和可视化。我们证明转录组和蛋白质组数据的综合分析在区分各种免疫细胞类型方面获得了更高的分辨率。

一个限制是在预处理步骤中仅使用基因表达数据将细胞分配给不同的免疫细胞类型。开发一个深度学习模型将是非常有趣的,该模型还可以使用来自多个分子模态的数据来执行细胞聚类和表征。

源代码

数据:
https://www . Dropbox . com/sh/opxrude 3s 994 lk 8/aaaiwrzfviksxkpyomlwqhea?dl=0

朱庇特笔记本:
【https://github.com/naity/citeseq_autoencoder】T4

我是一名具有生物信息学和编程技能的免疫学家。我对数据分析、机器学习和深度学习感兴趣。

网址: www.ytian.me
博客:https://medium.com/@yuan_tian
领英:https://www.linkedin.com/in/ytianimmune/
推特:https://twitter.com/ytian

真空中的智能

原文:https://towardsdatascience.com/intelligence-in-a-vacuum-54db3ec2a56b?source=collection_archive---------30-----------------------

在写我上一篇关于智能的文章时,我开始思考智能是否可以脱离环境而存在。 Headcanon alert : 我真的没有答案。

想象一个真空中的代理。真空不是严格的物理定义,只是一种环境,在这种环境中,代理不接收任何输入,其输出对周围环境没有影响。它可以是飞得有点远的宇航员鲍勃,或者是 iPhone,或者只是一块石头。

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

还有一些问题:

  1. 在这种情况下,斯通和鲍勃一样聪明(甚至更聪明)吗?
  2. 在这个抽象的例子中,任何智力测量都有意义吗?
  3. 智能可以被定义为某种与环境无关的内部机制吗?

我相信石头确实可以更“聪明”,因为它甚至不会试图在不会改变任何事情的行动上浪费精力。由于那些代理人没有能源来复制或生长,自我保存似乎是唯一“明智”的事情,而斯通有最大的机会成功。

另一方面,iPhone 可以使用天线在任意长的距离上发送信号,即使它们不会为这个特定的设备改变什么,但它可能对它的“亲戚”有所意义。

埃隆的 Roadster 怎么样?还是外星人?在一个封闭的系统中,有什么行为可以被认为是智能的吗?不知道是否有人认真研究过这些抽象的例子,但如果你想做这些工作,请联系我:)

雪花中的智能计算

原文:https://towardsdatascience.com/intelligent-computing-in-snowflake-2be96ac11049?source=collection_archive---------11-----------------------

再过一周多一点,我将前往旧金山参加 Snowflake 的首届用户峰会,在那里我将就澳大利亚私人健康保险行业的数据共享发表演讲。

我不仅为会议感到兴奋,而且当我在那里的时候,我也真的很兴奋能去 Numenta 的办公室参加 meetup 活动

雪花已经建立了下一代数据仓库,Numenta 正在建立我认为是下一代机器学习算法,所以这将是一个重要的一周!

自从大约 15 年前我在大学第一次研究机器学习以来,我对它一直有着浓厚的兴趣。那是在上一个人工智能冬天的中期,所以我对这门课没有太多期望,因为没有人真正谈论它。但它很吸引人,富有哲学挑战性,给我留下了持久的印象。

在我目前的工作中,我开始从事涉及当代机器学习的数据分析过程。但是意识到它的一些局限性,并且永远对人类智力的工作方式感到好奇,我一直密切关注 Numenta 的研究,并且多年来一直是他们的社区的一员。

因此,为了让我对即将到来的旅行感到兴奋,这篇文章是我结合两种技术的一个实验;在雪花上运行 Numenta 当前的数据库内智能计算算法,并使用它来检测数据序列中的异常。

AI 不是已经智能了吗?

简单来说,机器学习算法(包括深度学习)允许我们通过使用历史数据来训练一个模型,从而进行预测。作为学习算法,这种想法是,如果一些信息对一个结果具有预测能力,并且你有很多例子,那么你不必指定一个精确的公式来进行预测。相反,你可以用蛮力和一些巧妙的捷径来近似它。

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

credit: https://visualstudiomagazine.com

在某些情况下(比如我之前的 Medium 故事中的基于树的学习),你会得到一个可解释的预测,而使用神经网络它可能更像是一个黑箱。但在这两种情况下,你通常都在寻求最小化特定预测任务的误差,这样你就可以自动将其应用于新数据。

这篇文章的目的绝不是贬低这些机器学习方法的强大。它们被全世界最大的公司和最聪明的人用来解决实际问题。给定足够的样本数据,他们可以对图像进行分类,将语音转换为文本,或者预测能源消耗。使用规则而不是数据,他们可以学习赢得像围棋这样的游戏,或者在雅达利游戏中取得成功(没有享受部分)。

不仅如此,即使在我们破解了哺乳动物智能的难题之后,这些传统方法对于某些类型的分析仍然至关重要,在这些分析中,我们实际上并不需要类似人类的推理。

但是,尽管它们打着人工智能的旗号,甚至被称为“神经”网络,但重要的是要认识到,它们的工作方式与人类和其他动物的智能工作方式非常不同。相比之下,人类大脑使用未标记数据的时间流不断预测和学习,并且使用单一的通用算法非常有效。

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

credit: http://dmangus.blogspot.com

我们的大脑也非常擅长保持“不变”的表示和关系的层次,所以我们可以很容易地从一个不熟悉的角度识别一只狗,并直观地理解它更像一只猫,而不是一条鱼。这就是为什么我们的婴儿在图像识别方面轻而易举地超过了最好的深度学习算法,这是实现完全自动驾驶道路车辆比最初预期的要远得多的核心。

Numenta AI 方法有何不同?

Numenta 采取了一种“生物约束”的方法,并正在开发一种被称为分层时间记忆(HTM)的理论,这意味着他们不会将任何人脑不会做的事情纳入他们的算法中(根据神经科学研究告诉我们的)。

Numenta 的任务是了解智能如何在大脑中工作,以便他们可以在软件中实现它,并建立智能系统。从行业的角度来看,他们仍然处于边缘,但他们的研究正在进步,并且总是令人着迷,尤其是对任何对计算机科学和神经科学有双重兴趣的人来说。例如,最近有很多关于网格细胞结构的关注,一个古老的导航机制如何适应高等教育。我希望 6 月 meetup 活动上的研究更新会围绕丘脑的作用,以及他们如何将注意力的作用纳入他们的理论。

我们的大脑包含现有的最好的通用学习算法。因此,尽管前方仍有许多发现,但该理论吸引我的是,随着它的成型,它的学习将不会像当前的 ML 那样受到限制——我们可以用它来构建的可能性确实是巨大的。

你可以通过观看 Youtube 上的 HTM 学校来开始了解 HTM,它会带你了解基础知识。或者,如果你是一个爱读书的人,你不能错过《智力的 T2》,这本书由 Numenta 的联合创始人杰夫·霍金斯所著,最初概述了 HTM 的基础。

它能做什么?

除了保持研究本身的开放性,Numenta 还有一个名为 nupic 的开源项目,实现了 HTM 理论中描述的学习算法。它主要是一个研究工具,它还不像一个完全正常工作的大脑。如果是这样的话,我相信这项技术已经在几乎所有的系统中使用了!

它已经被各种社区成员移植到其他语言中,有些人甚至用自己的一些想法进行了修改。

除了开源项目,还有一些商业应用正在出现。例如皮质。IO 正在将 HTM 专门应用于自然语言理解。

无论如何,要回答这个问题,它目前能做得很好的是学习序列而不需要太多的刚性,并预测下一个值。这又可以用于检测具有一定噪声容限的数据序列中的异常。

雪花实现

我将在雪花中进行一个非常基础的学习练习,使用简单的数字序列。

为此,我们需要构建几个组件,但在进入细节之前,我想先展示一个快照:

  1. 我们在雪花中构建的内容(右侧)
  2. 其中每个部分都符合 HTM 理论(中间),并且
  3. 这在生物学上是对应的(在左边)。

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

让我们从上到下努力吧。

编码器

编码器是我们的数据通过的第一个地方。

它们是初始大脑输入的一种快捷抽象,就像视觉皮层或听觉皮层一样。原始输入被映射成具有一些重要属性的稀疏表示,在本文中有更详细的描述。有趣的事实:你的大脑皮层没有视觉、听觉和嗅觉的概念,也不关心信号来自你的哪个感官。它只是使用单一的通用机制进行学习和预测,编码器是通向它的门户。

我将使用一个 javascript UDF 为雪花构建一个标量编码器。输入将是一个单一的数字,输出将是一个位的数组,其中一些是活动的,而大多数不是。

通过借用一些 Numenta 的 javascript 代码并做一些修改,我为自己节省了一些时间:

编码器的特性之一(来自上述论文)是:

相同的输入应该总是产生相同的 SDR 作为输出。

这意味着我们可以在雪花 UDF 上设置“不可变”属性,并从缓存中受益匪浅。

用值 1 到 5 来演示:

select 1 as value, SCALAR_ENCODER(1,1024,0,250,14,false) as ENCODED_VALUE
union all
select 2 as value, SCALAR_ENCODER(2,1024,0,250,14,false) as ENCODED_VALUE
union all
select 3 as value, SCALAR_ENCODER(3,1024,0,250,14,false) as ENCODED_VALUE
union all
select 4 as value, SCALAR_ENCODER(4,1024,0,250,14,false) as ENCODED_VALUE
union all
select 5 as value, SCALAR_ENCODER(5,1024,0,250,14,false) as ENCODED_VALUE

编码器输出 1024 位宽的稀疏数组,输入值范围为 0–250,宽度为 14。

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

如您所见,数字越接近,比特重叠越多。我们这样做是因为我们认为它们“语义相似”。

我们正在有效地构建类似于耳蜗毛细胞的东西,其中每一个输出位都可以活跃在许多类似的输入中。

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

credit: Numenta

空间池

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

A Sparse Distributed Representation (credit: Numenta)

在计算机中,我们密集地编码信息,但在我们的大脑中,它非常稀疏,这不是存储有效的,但产生了其他重要的属性,如噪声耐受性。这些被称为稀疏分布式表示(SDRs)。

因此,空间池的作用是将编码输入作为 SDR 之一投射到迷你列中。微柱是一束束垂直排列的神经元群,它们接收共同的输入并相互连接。

顺序记忆

大脑基本上是一个记忆系统,根据过去的序列不断预测未来的状态,并相应地加强/削弱突触。这就是 Hebbian learning,我记得是“一起火,一起线”。大脑只能在大约 20 瓦的功率下运行,因为它是连续有效的,它不像我们通常用计算机那样处理信息。

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

credit: brainworkshow.sparsey.com

随着信号在大脑的层次中向上移动,混沌的原始感觉输入最终成为稳定的概念(你可以在神经元放电模式中看到这一点),两个 SDR 之间的重叠量对应于语义相似性。

序列记忆(也称为时间记忆)的作用是使用远端连接(横向延伸到其他微柱)将微柱置于基于其对先前序列的识别的预测状态。

对于空间池和序列记忆,我将再次借用别人的代码。这次是 HTM.js ,一个由 Numenta 社区成员 Paul Lamb 构建的 javascript HTM 实现。同样,我所做的只是稍微修改它,使其在雪花上下文中工作。

在 HTM.js 中,所有不同的生物构造(细胞、列、层、突触等)都在不同的文件中被建模为它们自己的 javascript 原型。我将把它们全部放入另一个雪花 javascript 用户定义的表格函数(UDTF ),以及所有的学习和预测控制器逻辑。

最终版 UDTF 的源代码可以在这里找到(它太大了,无法在这里显示)。

有了这个函数,我们可以运行遍历表的列的查询,并一次性学习它找到的值的序列。HTM 网络的状态存在于 UDTF 执行者的记忆中,最初是随机的,但随着它学习到的每个新值而改变。这当然意味着我们故意不利用 UDTFs 通常具有的雪花引擎的并行性,因为处理顺序很重要。

所以我们来试试吧!我会尽可能用 Tableau 来保持这种视觉效果。

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

从一个数字从 10 到 20 的表开始,循环回到 10,无限期地继续下去。

我把这个表叫做 LOOPING_NUMBERS,列叫做 _NUMBER。

从视觉上看,顺序是:

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

让我们看看我们的 HTM·UDTF 能否学会这个序列。

但首先,HTM.js 实际上采用密集表示的稀疏数组。显然,它希望输入数组只保存 1 的索引位置,而不是一长串 0 和 1。这就是我添加 DENSE_OUTPUT 参数的原因,如果设置为 true,我的 1,2,3,4,5 序列将如下所示:

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

Look, they fit on the screen now!

好,那么使用我们的输入表 LOOPING_NUMBERS,我们首先通过标量编码器运行 _NUMBER 列,然后通过 HTM 网络。

select 
THE_NUMBER,
SCALAR_ENCODER(THE_NUMBER,1024,0,250,20,true) as ENCODED_INPUT,
ACTIVE,
PREDICTIVE
from LOOPING_NUMBERS,
table(HTM(SCALAR_ENCODER(THE_NUMBER,1024,0,250,20,true)))

下面是我们得到的一个例子:

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

我将结果集向下滚动到预测开始的地方。你可能会想,这样解读有点难。活动列包含活动小列的索引,预测列是也处于预测状态的活动小列的索引。

为了更好地理解发生了什么,我们可以简单地使用预测的成功率来计算异常分数:

select THE_NUMBER,
    SCALAR_ENCODER(THE_NUMBER),
    ACTIVE,
    PREDICTIVE, 
    ARRAY_SIZE(ACTIVE)-ARRAY_SIZE(PREDICTIVE) as NOT_PREDICTED_COUNT,
    NOT_PREDICTED_COUNT/ARRAY_SIZE(ACTIVE) as ANOMALY_SCORE
from LOOPING_NUMBERS,
table(HTM(SPARSE_TO_DENSE(SCALAR_ENCODER(THE_NUMBER))));

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

现在我们有了一个异常分数,我们可以直观地看看 HTM 网络经历了什么:

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

有点像刚出生的婴儿,一开始什么都不懂,然后模式开始变得熟悉。

顶部偶尔留下的异常痕迹是怎么回事?这是由学习重复输入的方式造成的影响,在主要的 python nupic 代码库中有减轻它的方法,它们只是在 HTM.js 中不存在。所以请相信我,忽略它们:)

现在让我们扔一些曲线球,看看会发生什么。我们给它 10,11,13,13,而不是 10,11,12,13。

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

网络检测到几乎确定的异常。不完全是 100%的原因是因为在编码器输出中 12 和 13 之间有相当大的重叠,所以仍然预测了少量的活动列。

现在让我们用一个 10 的大序列来给它一个惊喜,因为那是非常不同的。

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

网络再次吐出它的咖啡,并在调整到新的序列之前短暂地困惑。

让我们再试一次,重复序列 10,12,14,16,18,20,19,17,15,13,11:

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

与之前类似,但调整期更长,因为新序列需要更长时间重复。

现在让我们做一些有趣的事情来结束,并回到最初的 10,11,12,13,14,15,16,17,18,19,20 的顺序。你可能会想,随着所有的变化,它已经被遗忘很久了。事实上,网络拥有巨大的存储容量,在识别它之前几乎不会漏过一个节拍:

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

摘要

我希望你读这本书的时候和我整理的时候一样开心。如果你和我一样,HTM 一开始会让人望而生畏,但如果你对智力的工作方式感兴趣,研究它会非常有价值。我开始将生物启发的学习算法视为我们建设更智能系统的道路上至关重要的一部分。

雪花作为一个云数据仓库给我留下了深刻的印象,似乎不可避免的是,我们将继续看到它得到扩展,变得越来越多才多艺。这是一个非常非传统的数据仓库任务的另一个例子,使用它的引擎很容易实现。

同样,如果您有兴趣了解更多信息,请访问 Numenta 社区,并且不要忘记介绍自己!。

智能数字机器人或 RPA 2.0

原文:https://towardsdatascience.com/intelligent-digital-robots-or-rpa-2-0-6487a1bdc54?source=collection_archive---------22-----------------------

我们生活在一个前所未有的技术飞速发展的时代。随着人工智能解决方案敲开每一扇门,是时候考虑它将如何影响我们工作的性质了。

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

1.机器人

18 世纪后期,西方世界经历了工业革命,从手工生产方式转变为机器生产方式。从那时起,随着我们在工作结构和整个社会中经历越来越快的变化,世界变得不一样了。许多传统的工作岗位消失了,但是更多的工作岗位出现了。

直到 20 世纪末,我们的文明采用了数字设备,这在 21 世纪初变得无处不在,我们才看到如此规模的革命。突然间,我们生活在未来,数字和物理机器人(例如,清洁 Roombas、自主 Teslas、波士顿动力机器人或工业手臂)与我们共存。

随着互联网的兴起,数字机器人在 90 年代已经出现。如今,在网络上抓取和发送垃圾信息的机器人很常见。更多面向商业的机器人是那些存在于机器人过程自动化系统(简称 RPA)中的机器人,这些机器人被编程为在办公室执行重复性任务——从复制数据到电子表格,到执行计算和通过电子邮件传递结果。你只是一个任务接一个任务地向他们展示你是如何做的,他们会无意识地一遍又一遍地重复。定制这些机器人需要时间,但如果你有几十个人每天重复做的单调乏味的工作,通常是值得花时间的。就像在工厂里用自动手臂代替人是值得的,这样整个工厂空间就更安全,而单调乏味的体力工作则委托给机器。

这第一波数字机器人相当于工厂中的机械手臂——它们没有任何“视觉”或“感知”,它们只能执行与编程相同的动作,而不会根据变化的条件进行调整,也没有任何创造力的迹象。

2.人工智能

自从计算机出现以来,人工智能就一直在争论,因为计算机慢慢取代人类的想法似乎很诱人。由于大肆宣传和过高的期望,人工智能作为一个计算机科学领域在 70 年代到 90 年代的大部分时间里经历了两个冬天(资金减少,负面新闻)

在 21 世纪的最后几年,情况发生了变化,当时机器学习算法在视觉相关任务中的表现优于经典解决方案。这是由计算能力和访问大型数据库(数字化内容)的增长引起的。机器学习本身是一种通过让算法根据输入数据进行自我调整来解决问题的方法。程序员不必编写所有必要的功能和特性。只需要将最初的架构放在适当的位置,让机器/计算机学习示例就足够了。

人工智能的崛起改变了一切——从我们购物的方式(主要是在线)到导航(谷歌地图),甚至是生活预期(每个过程都必须平稳愉快)。绘制草图并让机器解决其余问题的机器学习范式战胜了将每个功能和特征硬编码到结构中的经典程序主义范式。

3.RPA 2.0

随着人工智能的兴起,数字机器人终于可以对输入的数据进行“看到”和“推理”。他们不必盲从规则,而是可以临场发挥。数字机器人终于可以变得智能了。

从技术角度来看,机器学习——尤其是深度学习和强化学习——允许 RPA 系统具有很强的鲁棒性。你不必在办公室工作中手工编写重复性的任务。让机器在后台运行,分析你几个小时或几天的工作,并提出潜在的自动化解决方案,这就足够了。

无论这听起来多么接近人工通用智能,它仍然很遥远,这些智能数字机器人将很快在所有商业垂直领域(以及通用知识垂直领域)蓬勃发展,在这些领域,人们可以在高度受限的字典/本体上操作——例如税务解释、财务报告或法律协议。

我们目前正处于这场新革命的开端,这场革命将限制单调乏味的任务,让人们专注于真正有创造性的工作。这种变化将发生在起初自动化似乎遥不可及的工作中:顾问、银行家和律师。在未来的 5-10 年内,这些职业将会发生巨大的变化。它们将更多地是关于人类互动和共鸣,而不是数据处理。准备幻灯片、起草法律协议或审计等办公室任务将会消失。这将真正等同于工业革命,但这一次是在数字世界。而这只是 AI 未来能给我们的一小部分。

为改变做好准备!

P2P 贷款的智能贷款选择

原文:https://towardsdatascience.com/intelligent-loan-selection-for-peer-to-peer-lending-575dfa2573cb?source=collection_archive---------21-----------------------

在贷款选择中控制风险的同时使用神经网络对贷款俱乐部进行自动投资

介绍

在这篇文章中,我描述了如何训练一个神经网络来评估大众借贷平台 Lending Club 上提供的贷款。我还介绍了如何测试模型,如何调整贷款选择中的风险,以及如何使用 Lending Club 的 API 使用模型进行自动投资。

为了让您保持兴趣,下面是回溯测试结果的预览:

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

左边的图表显示了随机选择贷款的模拟投资组合的回报,这些贷款按照 Lending Club 指定的等级进行筛选。右边的图表显示了神经网络选择不同风险调整水平的贷款时的回报。

借贷俱乐部

lending Club(www.lendingclub.com)是一个允许任何人投资消费贷款的平台,每笔贷款只要 25 美元。贷款金额从 1000 美元到 40000 美元不等,期限为 36 或 60 个月。许多借款人借出贷款来巩固债务,但也有各种其他目的;比如:家装、医疗费用、商业贷款等。

Lending Club 主要通过向借款人收取 1%至 6%的贷款发起费来赚钱,但他们也会从支付给贷款人的任何款项中扣除 1%。这意味着 Lending Club 的主要动机是发放尽可能多的贷款,无论贷款质量如何,投资者在选择投资哪些贷款时必须小心谨慎。有一个基于可定制过滤器的自动投资选项,但是这种方法不太灵活。一些第三方公司收费提供更复杂的投资组合管理服务。

Lending Club 允许投资者开立正常的应税账户,以及延税退休账户。后者更可取,因为消费贷款是一种税收效率非常低的投资选择。原因是利息收入按所得税率征税(大多数人是 22%或 24%),而被冲销的贷款损失的本金通常只能用来抵消长期资本利得(大多数人的税率是 15%)。

史料

Lending Club 提供在该平台上发放的所有贷款的历史数据。这些数据包括申请贷款时已知的所有信息,还包括绩效数据,如贷款状态(当前、逾期、全额支付或注销)、偿还的本金金额、支付的利息金额、滞纳金和收回金额。

出于这个项目的目的,我考虑了 2007 年 6 月至 2015 年 12 月期间发放的贷款,筛选出尚未完全支付或冲销的贷款。考虑的贷款总数是 829000。以下是这些贷款的结果。

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

贷款列表

平台上当前列出的贷款数据可以用一个简单的 web API 以 JSON 格式检索。也可以使用 API 投资贷款。

太平洋时间早上 6 点、10 点、下午 2 点和 6 点,新贷款会在 Lending Club 平台上列出。有许多投资者使用软件自动投资贷款非常快,只要他们变得可用。

为了感受一下最好的贷款获得资金的速度有多快,我设置了一个脚本,每 5 秒查询一次贷款列表,从列表时间后一秒开始。下图显示了贷款的融资水平。每张图表都是在同一天不同的上市时间记录的。

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

可以看到,一些贷款(可能是最好的贷款)在 5 到 20 秒后就获得了全部资金,而在 20 秒后,活动逐渐减少。

虽然 Lending Club 每月发放超过 50000 笔贷款,但在撰写本文时,平均只有 1200 笔贷款可用于人工投资或使用 API 进行投资。绝大多数贷款是提供给机构投资者或有自动投资设置的个人。目前还不清楚贷款是如何在这些群体之间分配的,分配是否是随机的。

数据清理

Lending Club 提供的贷款数据有点乱,需要大范围清理才能使用。例如,历史贷款数据中的就业时间长度具有这样的值:“1 年”、“3 年”或“10 年以上”,而当前列出的贷款中的相同字段仅具有月数。像这样的例子还有很多。此外,历史数据和列表数据的列名也不同。

除了清理之外,我还对数据做了一些调整,使其更适合:

  • 我把最早的信用额度日期换算成了信用额度年龄。
  • 我取了各种“months since”字段的倒数(例如 mths_since_last_major_derog,mths_since_recent_inq,…)。这将时间间隔转换成与这些事件的频率相关的东西。当事件从未发生时,它还允许使用合理的值 0。这由原始数据集中的空字段表示。
  • 我通过基于期限、利率和贷款金额重新计算,修复了“分期付款”列中的一些值(包含一些贷款的无效数据)。

回溯测试

为了进行回溯测试,我实现了一个贷款和投资组合模拟器。投资组合由现金余额和贷款集合组成。模拟器以一个月的离散时间步长工作。每个月,对于投资组合中的每笔贷款,都会进行分期付款,从而增加投资组合的现金余额。一旦贷款全部还清(包括收回),它将从投资组合中删除。

Lending Club 没有提供关于确切付款日期和金额的数据。他们提供的是最后一次收到付款的日期以及收到的本金、利息、滞纳金和收回的总金额。对于模拟器,我必须做一些假设:

  • 我假设本金、利息和滞纳金在贷款期限内按月等额支付(从发放贷款之日到收到最后一笔付款之日),但永远不会超过定期分期付款的金额。如果这不足以支付收到的全部金额,则认为剩余部分将在最后一期支付。这包括提前支付剩余余额的情况。
  • 我假设在最后一次付款后 6 个月收到了收回款项。
  • 我假设贷款在最后一次付款后 4 个月被注销。根据 Lending Club 的说法,这是典型的,但他们的数据中没有提供这种程度的细节。何时注销贷款实际上只与税务计算有关,因为它决定了该事件是被视为长期资本损失还是短期资本损失。

实际的回溯测试采用一个清理过的贷款数据表,其中有一个额外的“_score”列,包含评分算法的输出。分数可以来自神经网络或随机数发生器,以进行随机测试进行比较。然后,贷款数据按发放贷款的月份分组。

为了启动这个投资组合,在最初的 12 个月里,每个月会有 1000 美元加入到这个投资组合中。之后,只有贷款的收益可以用于再投资。每个月,可用的现金余额被投资到当月发放的贷款中,将最小金额 25 美元投资到尽可能多的贷款中。例如,如果在给定的一个月中有$1132 可用,那么 45 (=floor(1132/25))个最高得分的贷款每个被提供$25。

开始的时候,Lending Club 每月不会发放那么多贷款。在将数据集分成训练和测试数据之后,在测试数据集的前几个月中没有足够的贷款给算法选择。由于这个原因,模拟开始的时间要晚一些,此时每月可用的贷款是投资所需贷款的四倍。

一旦历史贷款表用尽,回溯测试通过每月提取任何现金余额来结束投资组合,直到所有贷款都被完全处理。在这一点上,投资组合的价值回到 0,投资组合的回报率可以计算出来。

模拟应纳税帐户时,投资组合的现金余额每月会因当月产生的纳税义务而减少。纳税义务是收到的利息、滞纳金和回收乘以所得税率,减去已冲销贷款的剩余本金乘以适用的长期或短期资本利得税率。后面部分中的所有模拟都使用这些税率:收入和短期资本利得为 24%,长期资本利得为 15%。

该模拟还计算默认利率,即每年冲销的本金的百分比。为了计算这一点,模拟跟踪了一个假设场景,其中没有违约,但违约贷款的剩余本金没有被冲销,而是像贷款提前还清一样进行分配。这种无违约情景和实际收益率之间的差额就是违约率。

投资组合的回报率

计算有多次存款和取款的投资组合的回报率并不简单。

我的方法基于一个事务列表,其中每个列表条目代表一个固定的时间段,比如一个月。边界条件是投资组合在交易列表前后的值为零。

示例[1000,1000,0,0,0,-300,-1000,-800]:

从一个空的投资组合开始,第一期和第二期前存 1000,第 6 期前取 300,第 7 期前取 1000,最后取 800,使投资组合余额回到 0。

本例的净收益为 100 英镑(取款总额比存款总额多 100 英镑)。这里的结果是每期的平均回报率为 0.00854 (0.854%)。如果期限是一个月,那么年化回报率是 10.74%。

该函数如下所示:

sim(list, ror)用列表中的交易和每期收益率(ror)模拟投资组合。该函数返回列表覆盖的时间段后投资组合的值。如果 ror 参数等于投资组合的实际收益率,那么结果应该为零(基于边界条件)。如果 ror 参数高于实际收益率,则 sim 函数将返回一个正值。如果 ror 参数太低,情况正好相反。

root_scalar 函数搜索使sim(list, ror)的结果为零的 ror 值。

贷款回报率

同样的方法可以用来计算单笔贷款的收益率。

示例[1000,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100,-100]:

发行了一笔价值 1000 英镑的贷款,分 11 期偿还,每期 100 英镑。平均回报为每期 1.623%,如果期限为一个月,则年化 21.31%。

下图显示了 x 个月后违约的不同贷款的年化回报率。贷款有两种不同的期限(36 个月和 60 个月)和三种不同的利率(5%,10%,15%)。

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

例如,一笔为期 36 个月、利率为 10%的贷款在 24 次还款后违约,你的年回报率为-21%。不幸的是,这并不容易转化为整个投资组合的回报率。如果你要投资这笔贷款,如果你要立即将所有收益投资于具有完全相同资产的贷款,那么你的整个投资组合也将呈现-21%的年回报率。

构建和训练神经网络

对于神经网络,我使用了 Keras 和 Tensorflow 库,它们为您完成了几乎所有繁重的工作。Tensorflow 是后端,允许您构建可以映射到可用 CPU 和 GPU 资源的计算图。Keras 在此基础上增加了神经网络方面,如层定义、激活函数和训练算法。

更多数据预处理

在将贷款数据输入神经网络之前,还有一些处理工作要做。仍然有分类数据需要转换—例如,贷款目的(“债务合并”、“房屋修缮”、“商业”…),或者居住州(“CA”、“NY”…)。这些需要被转换成一次性编码:

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

如果类别只有几个成员,将它们合并到“其他”类别中有助于防止过度匹配。在上面的示例中,可以添加另一列“addr_state$OTHERS”来捕获贷款少于 1000 笔的所有州。

添加到“addr_state”列的前导下划线是我的约定,表示在将数据输入神经网络之前,应该删除该列。这同样适用于新贷款列表数据中不可用的列,因为它们与贷款的结果相关,而贷款的结果还不知道(loan_status,total_rec_int …)。

选择网络应该预测什么

这些是我评估过的选项:

  • 二进制输出:全额支付与冲销。
  • 平滑输出:收到的付款总额占预期付款的比例。

也可以在二进制和平滑输出之间进行插值,如下面的代码所示。“平滑度”参数值 0 选择二进制输出,而值 1 选择平滑输出。

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

使用二进制输出丢弃了有价值的信息,因为神经网络不知道贷款何时违约。在期限结束前几个月发生违约,要比首次付款前违约好得多。与此同时,选择完全平滑的产出会让一笔即将到期的违约贷款看起来非常类似于一笔完全偿还的贷款,尽管这在概念上有很大的不同。

完全平滑的输出有一个直观的优点:它是线性的,可以对多个贷款的结果进行平均,以得出这些贷款组合的支付分数。例如,如果训练数据集中有三笔参数非常相似的贷款,并且结果分别为 1.0、1.0 和 0.7,则平均值为 0.9。这相当于投资所有三笔贷款的回报率。当神经网络看到这样的贷款时,它产生这个输出是有意义的。同样的贷款,当使用二元期权时,得分分别为 1.0,1.0 和 0.0,平均为 0.67。因此,使用二元期权的模型预计会更加规避风险。

更多关于控制风险厌恶和比较图表可以在控制风险部分找到。

此时,我们有了全数字的 x 和 y 数据,并且可以将数据从 pandas 数据帧转换为 Keras 框架所期望的 numpy 数组。在这一点上,存储列名的序列是很重要的,以便以后在将训练好的网络应用于贷款列表时,可以准备列表数据,以便列处于正确的顺序,并且分类数据的一次性编码等同于训练数据。

最后一步是缩放数据,使所有输入值的大小大致相同。我评估了几个选项:

  • (最小值,最大值)-> (0,1)
  • (最小值,最大值)-> (-1,1)
  • (-sigma,平均值,+sigma) -> (-1,0,1)

最后一个选项产生的结果明显好于前两个。同样,保存每一列的缩放参数很重要,这样可以将相同的缩放应用于列表数据。

定义网络

网络的确切结构似乎并不重要。我对随机结构进行了一些测试,除非它们非常退化,否则它们会产生类似的结果。

输入层从贷款数据中提取大约 160 列(居住州的一次性编码产生许多列)。

输出层由具有线性激活函数的单个神经元组成。

受“通过混合激活函数进化简约网络”(Hagg、Mensing 和 Asteroth)的启发,我使用了具有混合激活函数的层,但在训练期间没有任何进化:

为了减少过度拟合,我发现高斯噪声层是最有效的。添加辍学层也可以帮助,但我没有成功的正则化。

仍然有一些过度拟合,但是在回溯测试中,与测试数据相比,当使用训练数据时,回报率仅高大约一个百分点。

解释输出

神经网络的输出可以解释为我们可以预期收到的总付款(分期付款乘以月期限)的一部分。例如,一笔分期付款为 500 美元、期限为 36 个月的贷款的总支出为 18,000 美元。如果该贷款的模型输出为 0.9,这意味着模型预计支付额为 0.9 * 18,000 美元= 16,200 美元。

为了给贷款打分,我们真正想知道的是三年后的预期支出占初始本金的比例:

分数= y * (1.0+(int_rate/12)) ⁶,其中 y 是模型的原始输出

请注意,该公式中的月数固定为 36,即使是 60 个月的贷款也是如此,以便进行比较。因此,即使是 60 个月的贷款,分数也相当于 36 个月的预期回报。

结果

这是引言中的图表,比较了不同投资策略下投资组合的收益。

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

左边的图表显示了投资组合的回报率,其中贷款是按等级过滤的,但在其他方面是随机选取的。该等级由 Lending Club 指定,与违约概率相对应,并决定借款人必须支付的利率。人们可以看到,违约率(每年冲销的未偿还本金的百分比)随着等级的提高而降低。

右边的图表显示了使用上述模型对贷款进行评分并做出投资决策的投资组合的回报率。对模型的输出进行后处理以调整风险。这在下一节“控制风险”中有更详细的描述。

控制风险

当使用模型进行投资决策时,需要调整贷款选择,以实现低违约率,同时保持高投资回报。可以在两个地方调整选择算法的风险级别:在训练模型时,或者作为使用模型输出时的后处理步骤。后者更实用,因为可以更快地做出改变,而不必训练新的模型,并且相同的模型可以用于不同的策略。

通过后处理进行风险调整

默认情况下,贷款的得分是根据以下公式从模型的预测(y)中计算出来的:

得分= y * (1.0+(int_rate/12)) ⁶

这是前面图表中风险调整参数为 0.0 的点。

在极端情况下,参数为-1.0(代表最高风险),根本不使用模型的预测,只有利率进入得分:

分数= 1.0 * (1.0+(int_rate/12)) ⁶

它只选择利率最高的贷款。

另一方面,当参数为+1.0(代表最低风险)时,仅使用模型的预测,而不对利率进行任何调整:

得分= y

这旨在将违约率降至最低。

在默认公式中使用 y 之前,可以通过调整 y 在这些情况之间进行插值:

得分= risk_adjust(y,adj) * (1.0+(int_rate/12)) ⁶

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

具有不同参数的风险调整函数如左图所示。调整函数的关键属性是它改变点(1,1)附近曲线的斜率。该函数在 adj=-0.5 时取 y 的平方根,在 adj=0.0 时不改变 y,在 adj=0.5 时将 y 提升到 2 的幂。

在任何情况下,该函数将 y 提升到 adj 确定的某个幂,并对拐点情况进行特殊处理:

当 adj 低于零时,通过减少与良好贷款预测相比的相对差异,对不良贷款的预测进行调整,以使它们看起来更好。当 adj 高于零时,对不良贷款的预测会进行调整,通过增加相对差异使它们看起来更糟。

右图显示了三种不同贷款(L1、L2 和 L3)在三种不同风险调整(a、b 和 c)下的得分。蓝色条代表调整后的预测(risk_adjust(y,adj)),而蓝色和橙色条的组合代表最终得分。橙色条显示利率对最终得分的影响。

在中间(L1b、L2b 和 L3b ),没有风险调整,在本例中选择贷款的预测和利率,使得最终得分相同。我们可以看到,贷款 L1 收到最低的预测(违约概率最高),但它有最高的利率来弥补差额。贷款 L3 具有最高的预测值(最低的违约概率),但它也具有较低的利率,因此最终得分与其他贷款相同。

在左侧(L1a、L2a 和 L3a),应用了-0.5 的风险调整,这将原始预测提高到更接近 1,从而减小它们之间的相对差异。现在,利率最高的贷款 L1 战胜了其他贷款,尽管它的预期风险更高。

在右边(L1c、L2c 和 L3c),应用了+0.5 的风险调整,这使原始预测更接近 0,增加了它们之间的相对差异。现在,被认为更安全的贷款 L3 战胜了其他贷款,尽管它的利率更低。

我选择这个特殊的函数进行风险调整是因为这些特性:

  • 它将 0 到 1 的输入范围转换为 0 到 1 的输出范围。
  • 它以一致的方式缩放相对差异:y1/y2 = y3/y4<=>f(y1)/f(y2)= f(y3)/f(y4)
  • 它在调整范围的末端收敛到有意义的极值:
  • 在 adj=-1.0 时,它收敛到一条穿过点(1,1)的水平线,这意味着将任何预测调整为 1,这意味着只有利率用于评分。
  • 在 adj=+1.0 时,它收敛到穿过点(1,1)的垂直线,增加了相对差异,使得无论利率如何,它都不能克服调整后预测中的差异。这意味着利率是不重要的,只有预测被用来获得分数,导致贷款的选择只基于违约概率。

通过培训进行风险调整

在训练模型时,有各种方法来控制贷款选择中的风险:

  • 模型输出的目标值可以调整。可以对训练数据使用类似于上述的风险调整,或者可以改变先前讨论的平滑度参数。
  • 样本的权重可以调整,这样拖欠的贷款就有更高的权重,或者权重可以是产值的函数。

这些方法控制内置于模型中的内在风险。同时,可以使用通过后处理的风险调整方法:

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

左边的数字来自一个本质上选择低风险投资的模型。它的平滑度参数为 0.5,并通过一个与全额支付贷款与冲销贷款之比成比例的因子来提高冲销贷款的权重。

右边的数字来自一个本质上挑选风险更高的投资的模型。它用平滑度参数 1.0 和所有样本的相同权重来训练。

参考模型(来自上面结果部分的图)的训练平滑度为 1.0,并增加了冲销贷款的权重。

在这些例子中,回报率接近 11%的平稳期比参考模型小。似乎最好用内在风险偏差来训练模型,使得平台的宽度最大化,并且在后处理期间仅需要有限的风险调整。

违约率变化时的绩效

只有在经济条件稳定的情况下,训练和配置模型和选择算法以最大化回报率(由回溯测试确定)才是有效的方法。观察模型在影响违约率的不同条件下的表现也很有趣。

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

上图显示了不同违约率下的假设收益率。蓝线显示假设没有违约(0%)时的回报,绿线是违约率没有变化(100%)的参考,紫线显示假设违约率翻了一番(200%)时的回报。

贷款有限选择的效果

正如我前面提到的,Lending Club 只为基于 API 的投资提供一小部分贷款。如果贷款的选择有限,为了投资可用的现金余额,必须选择更大比例的贷款。为了说明这种效果,我进行了模拟,每月随机选择一个贷款子集,算法可以从中进行选择。

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

正如预期的那样,随着可供选择的贷款减少,投资组合的回报率下降,因此选择的贷款比例增加。还可以清楚地看到,由评分算法分配的所选贷款的平均分数与回报率非常相关。

回顾回溯测试

在这个模型被用于实际贷款投资之前,还有一个障碍需要克服,那就是需要额外的测试。在我之前讨论的回溯测试中,该算法可以访问给定月份列出的所有贷款,并能够从中选择最佳贷款,直到不再有现金余额。

在现实生活中,我们不可能等那么久。贷款是小批量上市的,每天四次,必须实时做出决定,以避免其他投资者抢走最好的贷款。

我们从每批贷款中挑选出最佳贷款直到现金余额耗尽的策略并不是最优的,因为一些批次可能有高比例的良好贷款,而其他批次可能只有不良贷款。一个更好的策略是将一定的现金余额设定为大于零,以便保留一笔储备,在几笔贷款同时上市的情况下购买优质贷款。同时,现金余额不应过高,以避免损失回报(Lending Club 不对现金余额支付利息)。

如前所述,该模型为每笔贷款分配一个分数,该分数大致代表预期的总回报。现在的目标是找到这个分数的阈值,它可以用来决定是否投资贷款,同时保持合理的现金余额。换句话说,我需要实现一个控制循环,根据可用现金余额来调节选择阈值。

我的方法是基于 PI(比例积分)控制器。下图显示了一个控制器的现金余额和选择阈值,该控制器被设置为将现金余额保持在$200 左右。

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

以下是相关代码:

控制器对参数的变化相对不敏感。我对它们进行了调整,使选择阈值相对平滑,并保持现金余额不会偏离太多。只有积分项的控制器也是可能的,但是它会导致现金余额更大的波动。

投资组合模拟器现在将某个月发放的贷款列表分成 120 个随机批次(30 天内每天 4 个),每个批次中的贷款数量大致相等,但随机。同时,当月收到的付款被平均分成 120 份。然后,模拟器为每个批次运行控制回路和选择算法。

使用这种控制器的模拟投资组合产生的回报与使用早期方法模拟的投资组合的回报没有区别,早期方法可以获得在一个月内发放的所有贷款。

自动投资

要设置自动投资,有必要在列出新贷款时每天运行四次脚本。任务或 cron 作业在列表时间前几分钟启动脚本。

该脚本执行以下操作:

  1. 加载模型和 PI 控制器的状态。
  2. 确定下一批贷款上市的确切时间。
  3. 如果需要,在下一次列表时间前几秒钟睡眠。
  4. 查询当前现金余额,以确定投资贷款的最大数量。
  5. 将现金余额输入 PI 控制器,以计算新的选择阈值。
  6. 一直睡到准确的列表时间,或者一秒钟后考虑到时钟的差异。
  7. 检索贷款列表。
  8. 通过模型和评分算法运行列表,并根据分数对它们进行排序。
  9. 编制一份分数高于阈值的贷款清单。如果现金余额太低,无法投资所有这些贷款,那么就尽可能多地拿最高分。
  10. 订购这些贷款。
  11. 保存 PI 控制器的状态信息供下次使用。

还要避免多次投资同一笔贷款。当从 Lending Club 查询列表时,有一个选项只包括在最近的列表时间列出的贷款。只要脚本获得正确的时间,相同的贷款列表不会被检索超过一次。作为额外的预防措施,还可以验证作为每个贷款记录的一部分的上市时间是当前的和预期的。

例如,该脚本可以在本地运行,并由 Windows 任务计划程序触发。这有点不切实际,除非你有一台专用的电脑,在需要的时间开机并在线。

更好的解决方案是将脚本转移到云服务,让它在那里运行。有各种各样的选择适合网络托管,如谷歌云或 Heroku。迁移到这些服务可能有点棘手,因为他们期望应用程序是 web 服务,并且他们不提供持久的文件系统。因此,所有文件 IO 都需要被转换以使用远程文件系统或数据库。

最后,我使用了 PythonAnywhere ,它提供了一个基于云的环境,其行为就像 Linux 系统上的普通用户帐户,包括持久文件存储和调度任务的能力。

结论

虽然模拟结果看起来很有希望,自动投资脚本也在发挥作用,但对我的回报会有什么影响还有待观察。因此,最终分析将不得不推迟,直到有可能对违约率做出首次估计。

经济的变化会对结果产生影响。同样可以肯定的是,Lending Club 利用他们的贷款数据对贷款业绩做出了更好的预测,并改进了他们的算法来分配利率。这将减少甚至消除随机选择贷款的投资组合和使用我的模型的投资组合之间的相对表现差异。

Azure 中智能、实时和可扩展的视频处理

原文:https://towardsdatascience.com/intelligent-realtime-and-scalable-video-processing-in-azure-201f87104f03?source=collection_archive---------5-----------------------

1.介绍

在本教程中,创建了一个端到端项目,以便在 Azure 中进行智能、实时和可伸缩的视频处理。在这种情况下,可以利用火车的视频检测涂鸦和识别车皮号码。本项目的性质如下:

  • 检测涂鸦和识别车牌号的智能算法
  • 从边缘到云端实时可靠地处理视频
  • 可扩展以适应视频数量的指数级增长
  • 可以针对任何视频处理功能进行优化的功能项目

该项目的架构可描述如下:

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

1. Architecture overview

在这个博客中,这个架构是这样实现的:

  • 2a。检测火车上涂鸦的认知服务(自定义视觉)
  • 2b。识别货车编号的认知服务(计算机视觉 OCR)
  • 3.用于视频并行处理的 Azure 函数
  • 4.用于可视化的 Power BI(可选)
  • 5.用于数据自动分层的物联网边缘架构(可选)
  • 6.结论

在这个博客中,所有的视频处理都是在 Azure 中完成的。参考这个后续教程其中涂鸦检测是在摄像头(边缘)本身上完成的。下一章,将部署 Azure 认知服务。

2.Azure 认知服务

Azure 认知服务是一组可以注入你的应用的 API。它包含语音识别、图片中的对象识别和语言翻译的智能算法。这些模型大多是预先训练好的,可以集成到您的项目中。大多数模型也可以作为容器部署在边缘。在这个项目中,将使用两个 API:

  • 将用于检测火车上涂鸦的自定义视觉。这个模型需要有/没有涂鸦的火车的图片来学习。这一步可以被视为“在已经在 Azure Cognitive Services 中训练过的图像识别模型的神经网络中添加最后一个自定义层”
  • 将用于识别列车上车厢号计算机视觉 OCR。这种模式不需要培训,可以下架

在本章的剩余部分,将执行以下步骤:

  • 2a。培训和部署自定义视觉 API 来检测涂鸦
  • 2b。部署 OCR 计算机视觉 API

以及实现的架构的以下部分:

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

2. Cognitive services to detect graffiti and identif wagon number

2a。培训和部署自定义视觉 API 来检测涂鸦

转到自定义视觉网站并使用您的 Azure 广告凭证登录。登录后,选择创建具有属性“分类”和“多类(每个图像一个标签)”的自定义视觉项目,另请参见下文。

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

2a1. Create Custom Vision API project

然后将以下图像下载到以下 git 项目中的文件夹cognitive services/CustomVisionImages 中:

[https://github.com/rebremer/realtime_video_processing.git](https://github.com/rebremer/realtime_video_processing.git)

第一步,将带有涂鸦标签的涂鸦图片添加到您的项目中。其次,将带有标记涂鸦的 no_graffiti 图片添加到您的项目中,然后进行底片处理。然后使用快速通道训练模型,也见下文。

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

2a2. Train Custom Vision Api project

一旦您训练了模型,您可以通过点击“快速测试”来测试模型,然后使用之前下载的 git 项目从测试文件夹中选择一个图像。

2b。部署 OCR 计算机视觉 API

转到在步骤 2a 中创建的资源组,部署 OCR 计算机视觉 API。点击添加按钮,在搜索框中输入“计算机视觉”。选择 F0 作为定价层。部署计算机视觉 API 后,资源组将如下所示。

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

2b1. Resource group after Custom Vision API and Computer Vision for OCR is deployed

在下一章中,API 将用于检测视频中的涂鸦和货车号。

3.用于并行视频处理的 Azure 函数

一旦一个新的视频被上传(同步)到 Azure Blob 存储器中,它将立即被如下处理:

  • Azure Blob 存储有一个触发器,它执行一个简单的 Azure 函数,向 Azure 队列发送消息
  • Azure Queue 有一个执行高级 Azure 功能的触发器,该功能 1)从 blob 存储帐户检索视频,2)使用 OpenCV 每秒获取一帧视频,3)检测帧上的涂鸦,识别货车号并将结果写入 csv 文件

Azure 队列步骤是并行视频所必需的。在 blob 触发器直接触发高级 Azure 功能的情况下,视频仅被串行处理。并行视频处理架构如下所示。

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

3.1. Parallel video processing

在本章的剩余部分,将执行以下步骤:

  • 3a。用 docker 安装 Azure 函数的预备程序
  • 3b。使用 blob 容器和队列创建 Azure 存储帐户
  • 3c1。(可选)为 Azure 函数 Blob 触发器创建 docker 图像
  • 3c2。部署 Azure 函数 Blob 触发器
  • 3d1。(可选)为 Azure 函数队列触发器创建 docker 映像
  • 3d2。部署 Azure 函数队列触发器
  • 3e。用视频运行测试

以及实现的架构的以下部分:

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

3.2. Steps in blog plotted on Architecture. Parallel video processing in bold as next step

其中并行视频处理能力的细节可以在前面的图 3.1“并行视频处理”中找到。

3a。用 docker 安装 Azure 函数的预备程序

为了从视频创建帧,需要一个带有 OpenCV 的 Azure 函数。为此,使用了一个带有 Python 的 Azure 函数,该函数使用一个预装了 OpenCV 依赖项的 docker 映像。为此,需要安装以下预备程序:

  • 安装 Visual Studio 代码
  • 安装 Azure 核心工具版本 2.x
  • 安装 Azure CLI 。此博客需要 Azure CLI 版或更高版本。运行az --version找到您拥有的版本。
  • (可选,如果你想创建自己的图像)安装 Docker
  • (强烈推荐)在运行本教程中的命令之前,请先执行本教程中的命令

3b。使用 blob 容器和队列创建 Azure 存储帐户

需要 Azure 存储帐户来上传视频和运行 Azure 队列服务,Azure 功能将在这些服务上触发。打开 Visual Studio 代码,打开一个新的终端会话,并执行以下命令:

az loginaz group create -n blog-rtvideoproc-rg -l westeuropeaz storage account create -n <stor name> -g blog-rtvideoproc-rg --sku Standard_LRS
az storage container create -n videoblob --account-name <stor name>
az storage container create -n pics --account-name <stor name>
az storage container create -n logging --account-name <stor name>
az storage blob upload -f Storage/ImageTaggingLogging.csv -c logging -n ImageTaggingLogging.csv --account-name <stor name> --type appendaz storage queue create -n videoqueue --account-name <stor name>

确保将的全局唯一名称作为存储帐户名。

3c1。(可选)为 Azure 函数 Blob 触发器创建 docker 图像

在这一步中,创建了一个简单的 Azure 函数,当一个新的视频被添加到存储帐户时,该函数被触发。然后提取视频的名称,并将其添加到在步骤 3b 中创建的存储队列中。打开 Visual Studio 代码,创建一个新的终端会话并执行以下命令(出现提示时选择 python 作为运行时)

func init afpdblob_rtv --docker
cd afpdblob_rtv
func new --name BlobTrigger --template "Azure Blob Storage trigger"

随后,打开 Visual Studio 代码,选择“文件”,选择“打开文件夹”,然后选择在前面的命令中创建的目录 afpdblob_rtv,另请参见下文:

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

3c1. Azure Function Blob trigger

在此项目中,替换以下文件的内容

BlobTrigger/__init__.py
BlobTrigger/function.json
Dockerfile
requirements.txt

同 github 项目内容https://github . com/reb remer/real time _ video _ processing/tree/master/azure function/afpdblob _ RTV/。下一步是构建 docker 映像,并将 docker 映像发布到公共 Docker Hub。或者,也可以使用私有的 Azure 容器注册中心(ACR ),但是要确保设置了凭证。执行以下命令发布到 docker hub

docker login
docker build --tag <<your dockerid>>/afpdblob_rtv .
docker push <<your dockerid>>/afpdblob_rtv:latest

3c2。部署 Azure 函数 Blob 触发器

在这一步中,docker 映像被部署为 Azure 函数。如果您跳过了 3c1 部分来创建自己的 docker 映像,您可以用 bremerov 替换,即 bremerov/afpdblob_rtv:latest。执行以下命令:

az appservice plan create --name blog-rtvideoproc-plan2 --resource-group blog-rtvideoproc-rg --sku B1 --is-linuxaz functionapp create --resource-group blog-rtvideoproc-rg --os-type Linux --plan blog-rtvideoproc-plan --deployment-container-image-name <your dockerid>/afpdblob_rtv:latest --name blog-rtvideoproc-funblob --storage-account <stor name>az functionapp config appsettings set --name blog-rtvideoproc-funblob --resource-group blog-rtvideoproc-rg --settings remoteStorageInputContainer="videoblob" `
AzureQueueName="videoqueue" `
remoteStorageAccountName="<stor name>" `
remoteStorageAccountKey="<stor key>"az functionapp restart --name blog-rtvideoproc-funblob --resource-group blog-rtvideoproc-rg

当功能被正确部署后,在门户中创建的功能如下

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

3c2.1 Azure Function Blob trigger deployed correctly

当您在 Blob Trigger 上打卡时,您可以看到 docker 图像中的代码。最后一步,添加应用洞察(见截图)并按照向导进行操作。这使您能够在 Monitor 选项卡中查看日志记录。作为测试,找到视频 Video1_NoGraffiti_wagonnumber。MP4,并使用向导将其上传到 blob 存储容器视频博客,见下文

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

3c2.2 Upload blob

视频上传后,使用 blob 触发器触发 Azure 函数,一个 json 文件被添加到 Azure queue videoqueue,如下所示

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

3c2.3 Json file with video name added to queue

3d1。(可选)为 Azure 函数队列触发器创建图像

在这一步中,创建了一个 advancedAzure 函数,当消息被发送到在步骤 3c2 中部署的 Azure 队列时,该函数被触发。打开 Visual Studio 代码,创建一个新的终端会话并执行以下命令(出现提示时选择 python 作为运行时)

func init afpdqueue_rtv --docker
cd afpdqueue_rtv
func new --name QueueTrigger --template "Azure Queue Storage trigger"

随后,打开 Visual Studio 代码,选择“文件”,选择“打开文件夹”,然后选择在前面的命令中创建的目录 afpdblob,另请参见下文:

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

3d1.1 Azure Function Queue trigger

在此项目中,替换以下文件的内容

QueueTrigger/__init__.py
QueueTrigger/function.json
Dockerfile
requirements.txt

同 github 项目内容https://github . com/rebremer/real time _ video _ processing/tree/master/azure function/afpdqueue _ RTV/。下一步是构建 docker 映像,并将 docker 映像发布到公共 Docker Hub。或者,也可以使用私有的 Azure 容器注册中心(ACR ),但是要确保设置了凭证。执行以下命令发布到 docker hub

docker login
docker build --tag <<your dockerid>>/afpdqueue_rtv .
docker push <<your dockerid>>/afpdqueue_rtv:latest

3d2。部署 Azure 函数队列触发器

在这一步中,docker 映像被部署为 Azure 函数。如果您跳过了 3d1 部分来创建自己的 docker 映像,您可以用 bremerov 替换,即 bremerov/afpdqueue_rtv:latest。执行以下命令:

az functionapp create --resource-group blog-rtvideoproc-rg --os-type Linux --plan blog-rtvideoproc-plan --deployment-container-image-name **<your dockerid>**/afpdqueue_rtv:latest --name blog-rtvideoproc-funqueue --storage-account <stor name>az functionapp config appsettings set --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg --settings `
remoteStorageAccountName="<stor name>" `
remoteStorageAccountKey="<stor key>" `
remoteStorageConnectionString="<stor full connection string>" `
remoteStorageInputContainer="videoblob" `
AzureQueueName="videoqueue" `
remoteStorageOutputContainer="pics" `
region="westeurope" `
cognitiveServiceKey="<key of Computer vision>" `
numberOfPicturesPerSecond=1 `
loggingcsv="ImageTaggingLogging.csv" `
powerBIConnectionString=""az functionapp restart --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg

当正确部署了这些功能后,就会在门户中创建如下功能。

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

3d2.1 Azure Function Queue trigger deployed correctly

同样,选择添加 Applications Insights(参见顶部屏幕截图),您可以选择为 blob 触发器创建的相同 application Insights 资源。Application Insights 可用于查看 monitor 选项卡中 QueueTrigger 的日志记录。

如果 Azure 函数队列触发器成功运行,Azure 队列中的消息将被处理,图片日志可在 pics 目录中找到,见下文

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

3d2.2 Videos logging in frames

日志也可以在文件 logging/imagetaggingloging . CSV 中找到。在下一部分中,输出在 Power BI 中可视化。

4.用于可视化的 Power BI(可选)

Power BI 旨在提供交互式可视化和商业智能功能,其界面非常简单,最终用户可以创建自己的报告和仪表板。在这个博客中,它被用来创建一个流媒体仪表板,当检测到涂鸦伴随着车号时,它会发出警报。在本章的剩余部分,将执行以下步骤:

  • 4a。安装电源 BI 的准备工作
  • 4b。创建流式数据集
  • 4c。从磁贴创建仪表板
  • 4d。将 Power BI 链接添加到 Azure 函数

以及实现的架构的以下部分:

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

4. Steps in blog plotted on Architecture. Visualize output in bold as next step

请注意,完成博客物联网中心的最后一步并不需要可视化输出。

4a。安装电源 BI 的准备工作

在这篇博客中,所有数据集和仪表板将直接在 Power BI 中创建,因此没有必要安装 Power BI dashboard。转到以下链接创建帐户:

[## Power BI |交互式数据可视化 BI 工具

借助 Microsoft Power BI 的交互式数据可视化 BI 工具,以全新的方式查看您公司的数据。

powerbi.microsoft.com](https://powerbi.microsoft.com/en-us/)

4b。创建流数据集

登录后,转到您的工作区,选择创建,然后选择流式数据集。这个流数据集是从您的 Azure 函数队列触发器推送的。

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

4b1. Create streaming dataset

在向导中选择 API {},然后添加以下字段(字段也可以在 init 中)。publishPowerBI()方法中 Azure 函数队列触发器的 py

location (Text)
track (Text)
time (DateTime)
trainNumber (Text)
probGraffiti (Number)
caption (Text)
sasPictureTrainNumber (Text)
sasPictureGraffiti (Text)

4c。从磁贴创建仪表板

在下一步中,将基于流式数据集创建一个实时控制面板,一旦有新数据进入,该控制面板将自动刷新。首先,创建一个报表和一个可视化表格。只需将所有字段添加到该表格中。接下来,选择“锁定视觉对象”来创建视觉对象的活动 dasboard,也见下文。

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

4c1. Create streaming dataset

这样,可以在一个报告中创建多个视觉效果,并发布到同一个仪表板上。请参见下面的仪表板示例。

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

4c2. Example dashboard

4d。将 Power BI 链接添加到 Azure 函数

最后,需要将 Power BI push URL 添加到 Azure 函数队列触发器中,以便发布数据。单击您的流数据集的…,选择 API 信息并复制 URL,如下所示。

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

4d1. API info

随后,将 Power BI push URL 添加到您的 Azure 函数队列触发器,并重新启动该函数,见下文。

az functionapp config appsettings set --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg --settings `
powerBIConnectionString="<Power BI push URL"az functionapp restart --name blog-rtvideoproc-funqueue --resource-group blog-rtvideoproc-rg

删除视频 Video1_NoGraffiti_wagonnumber。MP4 并将其再次上传到您的 blob 存储帐户的 videoblob 容器中。这将把数据推送到您的 Power BI 仪表板。

5.用于数据自动分层的物联网边缘(可选)

物联网边缘上的 Azure Blob 存储是一个轻量级 Azure 一致模块,它提供本地块 Blob 存储。借助分层功能,数据会自动从本地 blob 存储上传到 Azure。这在以下情况下尤其有用:1)设备(如照相机)存储容量有限,2)要处理大量设备和数据,以及 3)互联网连接时断时续。在这篇博客中,一个相机在一个 Ubuntu 虚拟机上被模拟,这个虚拟机使用了 Blob on Edge。在本章的剩余部分,将执行以下步骤:

  • 5a。创建物联网中心和 Ubuntu 虚拟机作为边缘设备
  • 5b。将模块 Blob 存储添加到边缘设备
  • 5c。使用边缘设备模拟摄像机

以及实现的架构的以下部分:

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

5. Steps in blog plotted on Architecture. IoT Hub Edge in bold as next step

5a。在物联网边缘安装 Azure Blob 存储的准备工作

为了在 IoT Edge 上使用 Azure Blob 存储,需要运行以下命令(更多详细信息,请参见此处)。

az extension add --name azure-cli-iot-extaz vm create --resource-group blog-rtvideoproc-rg --name blog-rtvideoproc-edge --image microsoft_iot_edge:iot_edge_vm_ubuntu:ubuntu_1604_edgeruntimeonly:latest --admin-username azureuser --generate-ssh-keys --size Standard_DS1_v2az iot hub create --resource-group blog-rtvideoproc-rg --name blog-rtvideoproc-iothub --sku F1az iot hub device-identity create --hub-name blog-rtvideoproc-iothub --device-id blog-rtvideoproc-edge --edge-enabled

运行以下命令检索密钥

az iot hub device-identity show-connection-string --device-id blog-rtvideoproc-edge --hub-name blog-rtvideoproc-iothub

并使用以下命令将此密钥添加到您的虚拟机中

az vm run-command invoke -g blog-rtvideoproc-rg -n blog-rtvideoproc-edge --command-id RunShellScript --script "/etc/iotedge/configedge.sh '<device_connection_string from previous step>'"

正确创建物联网集线器和边缘设备后,您应该会在门户中看到以下内容

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

5b。将模块 Blob 存储添加到边缘设备

在该步骤中,Blob 存储模块被安装在边缘设备上。选择您的边缘设备,并使用 Azure 门户按照教程中的步骤进行操作

[## 将 Azure Blob 存储模块部署到设备- Azure IoT Edge

有几种方法可以将模块部署到物联网边缘设备,所有这些方法都适用于物联网边缘上的 Azure Blob 存储…

docs.microsoft.com](https://docs.microsoft.com/en-us/azure/iot-edge/how-to-deploy-blob)

在这种情况下,使用以下容器创建选项

{
  "Env":[
    "LOCAL_STORAGE_ACCOUNT_NAME=localvideostor",
    "LOCAL_STORAGE_ACCOUNT_KEY=xpCr7otbKOOPw4KBLxtQXdG5P7gpDrNHGcrdC/w4ByjMfN4WJvvIU2xICgY7Tm/rsZhms4Uy4FWOMTeCYyGmIA=="
  ],
  "HostConfig":{
    "Binds":[
        "/srv/containerdata:/blobroot"
    ],
  "PortBindings":{
    "11002/tcp":[{"HostPort":"11002"}]
    }
  }
}

以及下面的“设置模块 twin 的期望属性”:

{
  "properties.desired": {
    "deviceToCloudUploadProperties": {
      "uploadOn": true,
      "uploadOrder": "OldestFirst",
      "cloudStorageConnectionString": "<your stor conn string>",
      "storageContainersForUpload": {
        "localvideoblob": {
          "target": "videoblob"
        }
      },
      "deleteAfterUpload":false
    }
  }
}

如果一切都部署成功,门户中应该有以下内容

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

5b. Blob on Edge successfully deployed

此外,您可以从 CLI 运行以下命令,以查看是否一切安装正确。

ssh azureuser@<<public IP of your Ubuntu VM>>
sudo systemctl status iotedge 
journalctl -u iotedge
cd /srv/containerdata
ls -la

如果一切都部署成功,我们可以运行一个相机模拟器,上传一个文件到您的本地 blob 存储在下一部分。

5c。使用边缘设备模拟摄像机

在这篇博客的最后一部分,我们将使用一个相机模拟器,将一个文件放在边缘设备上。

首先,您需要打开 Ubuntu 虚拟机的入站端口 11002。找到虚拟机的网络安全组(NSG)并添加端口 11002,另请参见下文

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

5c1. Add port 11002 to NSG

从 CameraSimulator/CameraSimulator . py 中的 github 运行代码,在这个项目中,替换你的 UbuntuVM 的 IP 地址和你要上传的视频文件的位置。

该模拟器上传视频并触发本教程中完成的所有操作,即 1)将视频同步到存储帐户,因为自动分层已启用,2)触发处理视频的博客触发器和队列触发器功能,3)调用认知服务来检测涂鸦并识别货车编号,以及 4)将结果推送到 Power BI dashboard,另请参见下文。

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

5c2. End result project

6.结论

在这篇博客中,为了在 Azure 中进行智能、实时和可伸缩的视频处理,创建了一个端到端的项目。在这方面,创造了一种能力,可以检测涂鸦和识别车厢号码使用视频的火车。在这种情况下,使用了以下 Azure 函数

  • 认知服务被用作智能算法来检测火车上的涂鸦(自定义视觉 API)和 OCR 来识别货车编号(计算机视觉 API)
  • 使用 Python 和 docker 的 Azure 函数以可扩展的方式实时处理视频
  • Azure Blob 存储和边缘计算用于处理从边缘到云的可靠视频。
  • 使用仪表盘中的流数据增强 BI 的可视化输出

在这个博客中,所有的视频处理都是在 Azure 中完成的。在本博客的后续部分,涂鸦检测模型将被部署在摄像头(edge)上,这样可以节省数据传输,并且可以节省成本。已经看到本教程这是如何在不同的场景中完成的。最后,请参见下面描述的项目架构:

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

6. Intelligent, realtime and scalable video processing in Azure

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值