用 Python 下载历史股票价格
我们将寻找一种快速和自动化的方法来下载 Python 中的历史股票价格。本文将介绍如何创建分析数据集来帮助分析股票市场。
https://unsplash.com/@m_b_m在 unsplash 拍摄的照片
打开笔记本,跟着做:
**第一步:**下载需要的包。
我们需要的是pandas(python 中数据科学的面包和黄油) yfinance 用于从雅虎财经下载历史股票价格, datetime 和 time 提供操作日期和时间的函数, requests 用于发送 HTTP 请求, io
import pandas as pd
import yfinance as yf
import datetime
import time
import requests
import io
第二步:设置日期范围
接下来,我们希望提供开始和结束日期,在此期间,我们希望每天的股票价格。下面,我提供的开始日期为 2020 年 2 月 1 日(大约是今年痛苦的开始),结束日期为 2020 年 10 月 11 日,即我执行此代码的当前日期。你可以设置任何你喜欢的开始和结束日期——但是我试图分析的是从疫情时代之前到现在的价格波动。
start = datetime.datetime(2020,2,1)
end = datetime.datetime(2020,10,11)
第三步:获取股票代码
我们想获得纳斯达克上市的股票代码。如果你确切地知道你想要的公司的历史股价,你可以跳过这一步(例如:特斯拉-> 、TSLA 、脸书- > 、FB 等)。但这里的想法是超越流行的公司,发掘一些不太知名的公司有趣的价格变动。
下面的代码将访问包含带有公司名称和股票代码的 CSV 文件的 URL,并将其转换为 pandas 数据帧。
url="[https://pkgstore.datahub.io/core/nasdaq-listings/nasdaq-listed_csv/data/7665719fb51081ba0bd834fde71ce822/nasdaq-listed_csv.csv](https://pkgstore.datahub.io/core/nasdaq-listings/nasdaq-listed_csv/data/7665719fb51081ba0bd834fde71ce822/nasdaq-listed_csv.csv)"s = requests.get(url).contentcompanies = pd.read_csv(io.StringIO(s.decode('utf-8')))
该数据集中提供的一些公司可能已被除名或无法下载。
让我们来看看这个数据集是什么样子的:
包含公司符号和信息的数据帧
从这个数据集中,让我们只提取符号,并将它们转换成一个列表。
Symbols = companies['Symbol'].tolist()
显示前 10 个股票代号的列表
步骤 4:下载历史股票价格
迭代每个股票代码,使用 yahoo finance API,下载开始和结束日期之间的每日股票价格。
追加所有个股信息并创建分析数据集。另外,请注意,有些符号可能无法下载,为此我们添加了“try”和“except”子句来处理它们。
# create empty dataframe
stock_final = pd.DataFrame()# iterate over each symbol
for i in Symbols:
# print the symbol which is being downloaded
print( str(Symbols.index(i)) + str(' : ') + i, sep=',', end=',', flush=True)
try:
# download the stock price
stock = []
stock = yf.download(i,start=start, end=end, progress=False)
# append the individual stock prices
if len(stock) == 0:
None
else:
stock['Name']=i
stock_final = stock_final.append(stock,sort=False)
except Exception:
None
这是最终数据集的样子。
stock_final.head()
瞧啊。对于每个股票代码和日期,我们有开盘价、最高价、最低价、收盘价和调整后的收盘价,以及交易量。
本文涵盖了股票市场分析的第一步,即创建分析数据集。下一步将是通过探索性数据分析和机器学习模型,进一步深入这个数据集。
在 LinkedIn 上连接,在**Github上找到笔记本。**
使用 Colab 下载 Google Drive 中的 OpenImages 数据集
下载您的自定义数据集
https://storage.googleapis.com/openimages/web/index.html
想要在自定义数据集上训练您的计算机视觉模型,但不想在网上搜索图像。试试 OpenImages 吧,这是一个开源数据集,拥有约 900 万张不同的图像,有 600 个对象类别和谷歌提供的丰富注释。数据集包含图像级标签注释、对象边界框、对象分段、视觉关系、本地化叙述等。
您可以根据自己的兴趣下载特定的类别,而不是下载整个数据集。在本文中,我们将使用 google colab 下载一些选定的类/类别,并将数据保存在 Google Drive 中。您也可以在本地运行时使用 jupyter notebook。
对于这篇文章,你需要一个谷歌账户和谷歌硬盘空间来下载数据。
- 在 Colab 中安装您的 Google Drive。
2.创建一个存储数据的文件夹。在这里,我创建了一个名为 OpenImages 的目录。
!mkdir OpenImages
3.将工作目录更改为您刚刚创建的文件夹。使用“!pwd”命令。
cd OpenImages
4.运行以下命令,下载用于训练、测试和验证的注释文件以及类文件。
*# Download required meta-files*
*!wget https://storage.googleapis.com/openimages/2018_04/class-descriptions-boxable.csv*
*!wget https://storage.googleapis.com/openimages/2018_04/train/train-annotations-bbox.csv*
*!wget https://storage.googleapis.com/openimages/2018_04/validation/validation-annotations-bbox.csv*
*!wget https://storage.googleapis.com/openimages/2018_04/test/test-annotations-bbox.csv*
5.使用 GitHub 链接将 downloadOI.py 保存在您的工作目录中(https://GitHub . com/SPM lick/learnopencv/blob/master/download open images/download oi . py)或者复制链接中的代码并直接创建文件,如下所示。(感谢SATA ya mal lick/learnopencv提供了这个令人惊叹的代码库。如果你对计算机视觉和 OpenCV 感兴趣,一定要看看这个神奇的 Github 库。
#This magic function is used to create the files.downloadOI.py is the file name
%%writefile downloadOI.py#Author : Sunita Nayak, Big Vision LLC
#### Usage example: python3 downloadOI.py --classes 'Ice_cream,Cookie' --mode train
import argparse
import csv
import subprocess
import os
from tqdm import tqdm
import multiprocessing
from multiprocessing import Pool as thread_pool
cpu_count = multiprocessing.cpu_count()
parser = argparse.ArgumentParser(description='Download Class specific images from OpenImagesV4')
parser.add_argument("--mode", help="Dataset category - train, validation or test", required=True)
parser.add_argument("--classes", help="Names of object classes to be downloaded", required=True)
parser.add_argument("--nthreads", help="Number of threads to use", required=False, type=int, default=cpu_count*2)
parser.add_argument("--occluded", help="Include occluded images", required=False, type=int, default=1)
parser.add_argument("--truncated", help="Include truncated images", required=False, type=int, default=1)
parser.add_argument("--groupOf", help="Include groupOf images", required=False, type=int, default=1)
parser.add_argument("--depiction", help="Include depiction images", required=False, type=int, default=1)
parser.add_argument("--inside", help="Include inside images", required=False, type=int, default=1)
args = parser.parse_args()
run_mode = args.mode
threads = args.nthreads
classes = []
for class_name in args.classes.split(','):
classes.append(class_name)
with open('./class-descriptions-boxable.csv', mode='r') as infile:
reader = csv.reader(infile)
dict_list = {rows[1]:rows[0] for rows in reader}
subprocess.run(['rm', '-rf', run_mode])
subprocess.run([ 'mkdir', run_mode])
pool = thread_pool(threads)
commands = []
cnt = 0
for ind in range(0, len(classes)):
class_name = classes[ind]
print("Class "+str(ind) + " : " + class_name)
subprocess.run([ 'mkdir', run_mode+'/'+class_name])
command = "grep "+dict_list[class_name.replace('_', ' ')] + " ./" + run_mode + "-annotations-bbox.csv"
class_annotations = subprocess.run(command.split(), stdout=subprocess.PIPE).stdout.decode('utf-8')
class_annotations = class_annotations.splitlines()
for line in class_annotations:
line_parts = line.split(',')
#IsOccluded,IsTruncated,IsGroupOf,IsDepiction,IsInside
if (args.occluded==0 and int(line_parts[8])>0):
print("Skipped %s",line_parts[0])
continue
if (args.truncated==0 and int(line_parts[9])>0):
print("Skipped %s",line_parts[0])
continue
if (args.groupOf==0 and int(line_parts[10])>0):
print("Skipped %s",line_parts[0])
continue
if (args.depiction==0 and int(line_parts[11])>0):
print("Skipped %s",line_parts[0])
continue
if (args.inside==0 and int(line_parts[12])>0):
print("Skipped %s",line_parts[0])
continue
cnt = cnt + 1
command = 'aws s3 --no-sign-request --only-show-errors cp s3://open-images-dataset/'+run_mode+'/'+line_parts[0]+'.jpg '+ run_mode+'/'+class_name+'/'+line_parts[0]+'.jpg'
commands.append(command)
with open('%s/%s/%s.txt'%(run_mode,class_name,line_parts[0]),'a') as f:
f.write(','.join([class_name, line_parts[4], line_parts[5], line_parts[6], line_parts[7]])+'\n')
print("Annotation Count : "+str(cnt))
commands = list(set(commands))
print("Number of images to be downloaded : "+str(len(commands)))
list(tqdm(pool.imap(os.system, commands), total = len(commands) ))
pool.close()
pool.join()
6.目录 OpenImages 中的内容应该是这样的
目录的内容
7.运行以下命令以避免“AWS:not found sh:1:AWS:not found”错误。
!pip install awscli
8.下载特定数据。在这里我下载了 2 个类水槽和马桶。您可以尝试多个类并下载数据。你可以在“class-descriptions-box able . CSV*”中找到所有的类名。*
*# Download Sink and Toilet images for test*
!python3 downloadOI.py --classes "Sink,Toilet" --mode test*# Download Sink and Toilet images for train* !python3 downloadOI.py --classes "Sink,Toilet" --mode train*# Download Sink and Toilet images for validation* !python3 downloadOI.py --classes "Sink,Toilet" --mode validation
有 3 种模式可供选择
a) —模式训练 :下载训练数据
b) —模式测试 :下载测试数据
c) —模式验证 :下载验证数据
这是下载数据的外观
每个类别都有一个图像文件以及文本文件中的注释。
- 文件路径:
OpenImages/train/Sink/01681d52ad599ab4.jpg
- 图像文件:
01681d52ad599ab4.jpg
- 文本文件:
01681d52ad599ab4.txt
- 文本文件内容:
Sink,0.249529,0.420054,0.659844,0.682363
。txt 文件具有边界框的尺寸。如果图像有多个对象,它可以有多个条目。
注意:请记住,每次运行这个命令时,旧的数据都会被删除。因此,如果你想再次使用该命令,最好在其他文件夹中尝试,以避免删除之前下载的数据。
仅此而已。使用它并下载自定义数据来训练您的自定义计算机视觉模型。
Github 链接到代码https://github . com/mringup/Colab/blob/master/Downloading _ open images _ Custom _ dataset . ipynb
下载股票数据并直观地展示出来
使用 YFinance 和 Plotly 库进行股票数据分析
Alec Favale 在 Unsplash 上的照片
在本文中,我将向您解释如何使用 python 库 YFinance ,该库旨在通过提供一种可靠的、线程化的 python 方式从 Yahoo!下载历史市场数据,从而解决下载股票数据的问题金融。
在后面的部分中,我们将看到如何使用这些数据,通过使用 python 库来绘制不同的视觉上吸引人且高度互动的财务图表。plotly Python 库是一个交互式的开源绘图库,支持 40 多种独特的图表类型,涵盖了广泛的统计、金融、地理、科学和三维用例。
让我们开始吧。最初,我们将从安装 YFinace 库开始,我们将使用它来下载股票数据并查看它的一些特性。
安装 YFinance
在命令提示符下运行下面给出的命令,使用 pip 安装 yfinance。
pip install yfinance
在 Jupyter 笔记本中探索 YFinance 库
让我们从导入库和下载股票数据开始。这里我使用的股票代码是 HINDPETRO。这是印度斯坦石油公司,你可以选择任何股票进行分析,只需用你的股票代码替换股票代码。
#importing Library
import yfinance as yf#setting the ticker
hindpetro = yf.Ticker("HINDPETRO.NS")#Display stock information
hindpetro.info
这显示了与我们正在查看的公司相关的所有信息。
现在让我们探索一下 YFinance 库提供的一些功能。这只是一个小例子,还有更多,你可以在这里探索。
# Dsiplay all the actions taken in the lifetime of the stock i.e # dividends and splits with the dates when they are providedhindpetro.actions
显示股票行为,即股息和拆分以及各自的日期
类似地,你可以使用下面给出的命令来分别显示查看股票股利和股票分割。
#Display Dividends
hindpetro.dividends#Display Splits
hindpetro.splits
现在让我们将数据下载到数据框中并显示出来。
df = hindpetro.history(period="max")
df
HindPetro 从上市之日到今天的历史数据。
为了执行进一步的操作,我们需要重置数据帧的索引,并将相应的列转换为 float 数据类型。下面给出的命令将解决我们的目的。
#Reseting the index
df = df.reset_index()#Converting the datatype to float
for i in ['Open', 'High', 'Close', 'Low']:
df[i] = df[i].astype('float64')
在这之后,让我们从可视化部分开始。首先,我们需要安装 Plotly。
安装 Plotly
pip install plotly
使用带范围滑块和按钮的 Plotly Graph_objects 创建折线图
折线图常用于时间序列分析,用于查看一段时间内的股票趋势。在这里,我将向您解释如何使用 Plotly 创建交互式折线图。以下命令将创建在最大时间段内存储在数据框中的股票数据的折线图。
该代码还包括用于创建按钮的行,这些按钮可以被选择来显示特定时间段的折线图。
import plotly.graph_objects as go
import pandas as pdfig = go.Figure([go.Scatter(x=df['Date'], y=df['High'])])fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=1, label="1m", step="month",
stepmode="backward"),
dict(count=6, label="6m", step="month",
stepmode="backward"),
dict(count=1, label="YTD", step="year",
stepmode="todate"),
dict(count=1, label="1y", step="year",
stepmode="backward"),
dict(step="all")
])
)
)
fig.show()
带有范围选择器和范围选择按钮的股票数据折线图。
创建 OHLC(开盘、盘高、盘低、收盘)图
OHLC 图是一种棒线图,显示每个时期的开盘价、最高价、最低价和收盘价。 OHLC 图表很有用,因为它们显示了一段时间内的四个主要数据点,收盘价被许多交易者认为是最重要的。
下面给出的代码将创建一个带有范围选择器的 OHLC 图表。
带范围选择器的 OHLC 图表
使用范围滑块创建烛台图表
烛台图表被交易者用来根据过去的模式决定可能的价格变动。烛台在交易时很有用,因为它们在交易者指定的时间内显示四个价格点(开盘价、收盘价、最高价和最低价)。
带有范围滑块的烛台图表
创建面积图
面积图或面积图以图形方式显示定量数据。它基于折线图。轴和线之间的区域通常用颜色、纹理和影线来强调。
下面给出的代码将创建股票数据的面积图。
股票数据面积图
所有这些图表都是使用 Plotly 创建的,以便您可以与图表进行交互。上面提到的所有图表都是用于财务分析的主要图表。
结论
在本文中,我们从下载股票数据开始,并使用 YFinance 执行不同的操作/功能。之后,我们使用 Plotly 绘制了不同的财务图表,用于财务/股票数据分析。
对数据集应用数据分析以获得关于数据的见解。
towardsdatascience.com](/understanding-data-analysis-step-by-step-48e604cb882) [## 从头开始创建 Streamlit 仪表板。
Streamlit 是一个很棒的工具,可以轻松构建视觉上吸引人的仪表板。
towardsdatascience.com](/creating-streamlit-dashboard-from-scratch-59316a74fa1)
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。也可以在我的Github中查看我在这里使用过的代码和数据集。另外,请随意浏览 我的简介 并阅读我写的与数据科学相关的不同文章。
为深度学习中的人体动作识别下载动力学数据集
关于下载程序的学习、挑战和见解
如果你有兴趣对人类活动或动作识别进行深度学习,你一定会遇到由 deep mind 发布的动力学数据集。数据集有 3 个主要版本;动力学 400、动力学 600 和动力学 700 版本。在写这篇博客的时候,Kinetics 700 是最新的版本。
deep mind 网站上对 Kinetics 700 数据集的描述是:
这是一个大规模、高质量的 URL 数据集,链接到大约 650,000 个视频剪辑,涵盖 700 个人类动作类别,包括演奏乐器等人机交互,以及握手和拥抱等人机交互。每个动作类至少有 600 个视频剪辑。每个剪辑都由人类用一个动作类进行注释,持续大约 10 秒钟。
上述上下文中的 URL 链接指的是 YouTube URL 链接,因此,这些视频就是 YouTube 视频。
该数据集正在成为人类活动识别的标准,并越来越多地被用作几篇动作识别论文的基准,以及用于处理视频数据的深度学习架构的基线。Kinetics 数据集的主要愿景是成为视频数据的 ImageNet 等价物。
这篇博客将介绍从注释文件下载视频的步骤,以及面临的挑战和一些应对挑战的策略。它将突出显示一些关于数据的基本统计数据,如果您选择自己下载,这些数据有望帮助您做出明智的决定。然而,它不会进入关于注释数据集的太多细节,例如它是如何被收集的,不同类的分布等等。这些信息可以通过阅读以下文章找到:
- 人体运动视频数据集(https://arxiv.org/pdf/1705.06950.pdf)
- 关于 Kinetics-700 人体动作数据集(https://arxiv.org/pdf/1907.06987.pdf)的简短说明
创建了一个动力学数据集资源管理器,以便于可视化数据。探险家可以在http://kinetics-explorer.com/上找到
获取动力学注释数据集
相对于 ImageNet 或 COCO 等价物,处理动力学数据集时最大的难点是没有实际的视频可供下载。在适当的位置,提供一个注释文件,该文件包含 json 和 csv 格式的条目列表,这些条目包含 YouTube URL 链接、动作类别以及视频中动作类别的开始和结束时间。
这意味着你必须自己下载视频,并在正确的时间范围内进行裁剪。大约有 650,000 个视频,因此这不是一个容易的任务,因为我们将在后面讨论各种挑战。
注释文件可以从下面的链接下载。下面是你应该看到的截图。
动力学 700 是这个博客的焦点数据集。单击“下载数据集”链接,下载包含注释文件的 25 MB gzip 文件。提取 gzip 文件的内容后,有 3 个文件夹,其中包含两种文件格式(csv 和 json)的 train、val 和 test 数据集。csv 文件的结构是:
label,youtube_id,time_start,time_end,split
testifying,---QUuC4vJs,84,94,validate
washing feet,--GkrdYZ9Tc,0,10,validate
air drumming,--nQbRBEz2s,104,114,validate
.
.
.
CSV 文件中的项目可以细分如下:
label
表示在视频中发现了什么类型的人类活动,例如testifying
、washing feet
、air drumming
等。youtube_id
是 YouTube 为每个视频使用的唯一视频标识符。将youtube_id
替换成下面的字符串[https://www.youtube.com/watch?v=](https://www.youtube.com/watch?v=){youtube_id}
,可以下载完整的视频。time_start
和time_end
(以秒为单位)表示在视频中发现由label
表示的人类活动的部分。以标签为testifying
的 csv 样本的第一行为例,视频的长度为 95 秒(可以从https://www.youtube.com/watch?v=-屈科维兹中验证),因此感兴趣的标签将在 84-94 秒之间,这构成了时间范围。split
表示它是否属于训练、验证或测试数据集。
json 文件的结构如下,从 csv 上下文来看应该很容易理解:
{
"---QUuC4vJs": {
"annotations": {
"label": "testifying",
"segment": [
84.0,
94.0
]
},
"duration": 10.0,
"subset": "validate",
"url": "[https://www.youtube.com/watch?v=---QUuC4vJs](https://www.youtube.com/watch?v=---QUuC4vJs)"
},
"--GkrdYZ9Tc": {
"annotations": {
"label": "washing feet",
"segment": [
0.0,
10.0
]
},
"duration": 10.0,
"subset": "validate",
"url": "[https://www.youtube.com/watch?v=--GkrdYZ9Tc](https://www.youtube.com/watch?v=--GkrdYZ9Tc)"
},
.
.
.
.
}
json 文件比 csv 文件大得多,占用 197.5 MB 内存,而不是 24.5 MB,所以从 csv 文件读取数据可能比从 json 文件读取数据快一点。然而,大多数能够从注释文件下载动力学数据集的开源软件使用 json 格式,因此可能需要将 csv 数据预处理为正确的格式。就我个人而言,我选择了 JSON 格式,因为我最终使用了开源代码库。
技术环境
数据下载主要是在运行 Ubuntu 18.04 的台式电脑上进行的,该电脑具有稳定的互联网连接,下载速度约为 60 Mb/s,内存为 16 GB。然而,有些下载是在我不使用 MacBook Pro 的时候进行的。
我确实尝试过使用 AWS 和 Google Cloud,但是 YouTube 存在明显的节流问题,这将在错误部分解决。
下载数据的代码库
接下来要考虑的是下载数据的代码库。有两个主要选项:
- 自己写代码库。
- 找到一个现有的开源代码库,如有必要,根据需要修改它。
选择了第二个选项,选择的代码库是showmax/kinetics-downloader,它的一个分支是在dance Logue/kinetics-datasets-downloader中创建的。使用代码库的主要要求是python ≥ 3.4
、[ffmpeg](https://www.ffmpeg.org/)
和[youtube-dl](https://github.com/ytdl-org/youtube-dl)
。其中[youtube-dl](https://github.com/ytdl-org/youtube-dl)
用于进行实际下载,而[ffmpeg](https://www.ffmpeg.org/)
用于在所需的片段(即time_start
和time_end
时间)裁剪视频。
如何使用代码库包含在 README.md 文件中,因此我们不会深入研究代码。值得注意的是,它使用了 python 多重处理模块,我发现在下载如此大的数据集时这是必要的,我们将在这篇博客中解释原因。
根据下载数据集时遇到的问题进行了一些修改。对代码库的修改包括:
- 能够写入一个
stats.csv
文件,以跟踪每次下载花了多长时间,以及每个视频的 ffmpeg 裁剪时间的持续时间。不幸的是,创建这个功能的直觉只在数据集下载了一半之后才出现。因此,统计数据并没有覆盖整个样本,但应该足以深入了解下载过程。 - 能够写入一个
failed.csv
文件,以表明哪些视频有错误,以及返回的错误是什么。 - 一旦发生限制,能够暂停下载过程。
统计数据和失败日志用于生成关于数据的基本统计数据,如果您选择自己下载数据,它们有望帮助您做出明智的决策。
总体统计
YouTube 是一个动态的平台,这意味着视频会一直被添加和删除。因此,由于视频被删除,在不同时间下载动力学数据集将不会有一致的结果。下面的饼图显示了我的 kinetics 数据集中已下载和缺失的视频。
总下载视频数为 631604,而失败视频数为 15380,这意味着在总共 646984 个视频中,整个数据集的 2.37 %无法下载。假设这在可接受的误差范围内。
下载拆分
下面的饼图显示了在训练集、测试集和验证集之间下载的视频的划分。
正如所料,大多数视频由训练集数据组成,占数据集的 83.94 %。测试集占数据集的 10.13 %,而验证集占数据集的 5.93 %。
总下载持续时间
为了计算下载整个数据集需要多长时间,下载时间和生成裁剪视频所需的时间(FFMPEG 持续时间)以秒为单位进行记录。如前所述,仅记录了 298651 个视频的统计数据。下表显示了各个过程的平均值和最大值。
完整表示整个数据集,而 IQR 表示在四分位数范围内的数据。获取四分位数据对于防止极端异常值是必要的,如下载持续时间和 FFMPEG 持续时间的高最大值所示。按顺序下载 646984 个视频的理论时间是:
- 使用完整平均值,预计下载时间为 176.1 天。
- 根据 IQR 平均值,预计下载时间为 80.7 天。
这假设视频是同步下载的,没有任何中断。幸运的是,多重处理对我们有利。我使用 python multiprocessing
模块运行 16 个独立的进程。
下面的饼图显示了下载主导任务和 ffmpeg(裁剪)主导任务之间的主导过程。
可以看出,对于大部分下载过程,实际下载过程占主导地位,而 ffmpeg 过程仅占 1.67 %的时间占主导地位。因此,整个过程中的主要瓶颈实际上是从 YouTube 下载视频。
最佳化
我在下载动力学数据集时犯的第一个错误是下载了比必要质量更高的视频(这可能表明为什么会有非常极端的异常值)。
最终我选定了最大分辨率为 360p 的视频,毕竟这些视频是给机器看的,而不是给人看的。这种质量的视频包含足够的信息来训练相关的深度学习算法,并且下载和裁剪速度明显更快,在存储期间占用的磁盘空间更少。可以认为,也可以尝试较低的分辨率,即 240p 或 144p,这将在下载期间节省大量空间和时间,同时保持相同的基线/基准精度。
空间要求
我们进行了一次快速计算,以确定空间需求,结果发现整个裁剪数据集占用了 628.43 GB 的磁盘空间。为了下载数据集,您可能需要大约 20 GB 的额外空间(取决于并发下载的数量)来容纳需要临时存储的完整的未裁剪视频。
失败的视频下载
2.37 %的视频下载失败的原因被记录下来,并显示在下面的饼状图中。图例中描述旁边的数字是发生特定错误的实例总数。
大多数错误都是基于 YouTube 的错误消息,描述是一组错误的指示器。这些是:
- 视频不可用(10606) 错误是目前最大的失败原因,包括各种原因,如上传者删除了他们的 YouTube 帐户或他们的帐户被 YouTube 删除,视频仅在某些国家可用,视频被设为私有等。
- 内容警告(2451) 错误
- **HTTP 错误404**(943)错误可能是由于 Kinetics 视频
youtube_id
出错,因为 404 通常表示未找到页面错误代码。但是我没有时间去研究这个假设。 - Copyright (672) 错误是由于版权索赔而被删除的视频。
- 视频被用户删除(337) 错误顾名思义,用户删除了视频。
- 杂项(144) 错误可能是由于与正在使用的库有关的错误,或者无法确定错误原因。
- 违反 YouTube 条款(134) 错误通常是因为违反了关于垃圾邮件、种族主义、欺凌、裸体等的社区准则而被删除的视频。
- 重复视频(2) 错误似乎表明 YouTube 不允许重复视频。
- **HTTP 错误503**(1)错误仅出现一次,并且与服务未找到错误相关,不确定为什么会出现这种情况。
尽管下载视频存在问题,但失败的视频仅占整个数据集的 2.37 %,可以认为是在可接受的误差范围内。然而,值得注意的是,随着时间的推移,随着越来越多的视频被删除,失败视频的比例将会增加。
尽管这些是阻止视频下载的错误,但有一个错误被证明是下载 YouTube 视频时最令人沮丧的经历,那就是可怕的 429 太多请求错误。
HTTP 错误 429:请求太多
这是迄今为止下载动力学数据集的最大难点,这也是我在下载过程中的感受。
https://img flip . com/meme template/29364527/卢克-天行者-哭泣
这个错误的主要原因是由 YouTube 节流请求引起的,我认为这是通过将请求 ip 地址列入黑名单来实现的。YouTube 限制请求是有意义的,其中一些原因包括减少服务器的负载,防止恶意方访问数据等。但是下载 650 000 个视频剪辑是一件痛苦的事情。
尤其具有挑战性的是请求 ip 地址再次被允许所花费的时间,即“冷却”期。根据经验,这需要 12 小时到 5 天的时间。我找不到一个可辨别的模式来绕过它。在被限制之前,我在单个会话中能够下载的最大视频量是 136963,下面的饼状图显示了运行之间的分布(一些运行被手动终止,而不是被限制)。
节流问题已经在不同来源中被强调为从 YouTube 下载数据的主要障碍。
- https://github.com/activitynet/ActivityNet/issues/51
- https://github.com/activitynet/ActivityNet/issues/28
- https://stack overflow . com/questions/57488759/npmyoutube-dl-and-lamda-http-error-429-too-many-requests
- **【https://github.com/ytdl-org/youtube-dl/issues/21729 **
工作区
据我所知,一个 ip 地址被列入黑名单的标准还不清楚。在我的家庭桌面上,我可以在遇到 429 错误代码之前下载超过 50,0 00 个视频,然而,转移到 AWS 或 Google cloud,我可能会在遇到 429 错误之前下载 100 个视频。也许 YouTube 使用一些标准来立即将来自云虚拟机和个人机器的 ip 地址列入黑名单。
当遇到 HTTP 错误 429 时,最好停止下载,稍后重试或更改 IP 地址。
我能想到的主要可行方案是通过切换网络来改变 IP 地址。在同一台机器上运行两种不同的操作系统(例如 Windows 和 Ubuntu)已经有一段时间了。如果其他方法都失败了。,等待冷静期。
由于当时下载数据集并不是一个很重要的优先事项,当所有网络解决方案都遇到 HTTP 错误 429 状态时,数据集的下载就停止了,并在几天后进行了尝试。我没有探索其他选择,如使用 VPN 等。
伦理学
到目前为止还没有涉及的一个主要话题是道德,即抓取 YouTube 视频。一方面,视频的注释文件是存在的,并且是由谷歌的子公司 Deepmind 提供的,另一方面,下载数据集的规则是什么,特别是对于深度学习研究。有相当多的报纸利用数据显示人们正在下载它。感觉就像头埋在沙子里一样。
这可能是数据没有公开的原因,因此,任何对深度学习感兴趣的人都必须自己下载。这种方法有几个问题,我认为是:
- 首先,它阻碍了利用视频数据的深度学习研究,因为动力学数据集不是下载的微不足道的数据集。
- 由于缺少视频,两个不同研究人员之间的数据集可能不同,这意味着研究论文中报告的结果可能不完全可重复。
不知道在公开数据的过程中,关于道德状况的解决办法是什么,但希望 Deepmind 能够让视频数据很容易被非商业用途获得。
结论
希望这篇博客给了你一些关于下载动力学数据集的见解,以及你自己尝试时所面临的挑战。
动力学数据集是必要的,因为我在 2019 年全年开展了一个关于为舞蹈深度学习初创公司建立 Shazam 的个人项目。动力学数据用于预训练 dance 算法作为概念的证明。我将很快在博客上记录这个过程。
如果您有任何问题或任何需要澄清的事情,您可以在 https://mbele.io/mark和我预约时间
使用 Python 制作的 DPMO 海图
面向工业工程师的 Python
使用 Python 库创建质量控制图
图片由 chuttersnap 拍摄,可在 Unsplash 获得
质量控制图
质量控制图是工程师监控一个过程是否在统计控制下的重要工具。它们有助于可视化变化,发现并纠正出现的问题,预测预期的结果范围,并分析特殊或常见原因导致的流程变化模式。质量控制图常用于精益六适马项目和 DMAIC 项目的控制阶段,被认为是过程改进的七个基本质量工具之一。
DPMO 控制图
DPMO(每百万个机会的缺陷)图代表了一种较新的属性控制图,用于在缺陷机会远大于一个时跟踪 dpmo 值。DPMO 图是为电子制造环境开发的,作为评估生产多种高度复杂产品的过程的一种方法。
相关计算
从每个样品中获得缺陷总数后,需要进行以下计算来构建 DPMO 图:
- 每单位缺陷:每单位发现的缺陷总数。
- **每百万机会的缺陷数:**每百万机会的预期缺陷数。
控制线
以下控制线包含在 dpmo 图表中,有助于确定流程是否处于统计控制之下:
- 中心线:
- 控制上限:
- 控制下限:
在下面的例子中,让我们为一个微电子元件建立一个 dpmo 图表,其中获得了 40 个样本,每个样本 10 个单元,每个单元有 2,751 个缺陷机会。让我们来看看 Python 代码!
根据上面的 dpmo 图,该过程似乎处于统计控制之下,因为没有一个 dpmo 点超过控制上限。甚至对于 40 个样品中的 3 个(即样品 25、31 和 32)也没有发现缺陷。考虑到本例的 dpmo 平均值约为 115 dpmo,流程σ(即流程相对于客户要求的变化量,表示为正态分布的标准偏差数)接近 5.30。
总结想法
质量控制图是分析流程稳定性和获取重要统计信息的重要工具,可用于精益六适马和 DMAIC 项目的流程改进。质量和工业工程师必须能够准确地解释它们,以识别可能导致潜在不合格的不良趋势,从而采取预防措施而不是纠正措施,从而减少废料和浪费。
本指南涵盖了如何使用多个 Python 库从头构建 DPMO 图表的分步教程。考虑到 Python 在专业人士和学者中的高受欢迎程度,Python 是一个很好的工具,能够为统计目的构建质量控制图表。虽然也有其他程序和软件可以构建它们(例如 Minitab、R、Microsoft Excel),但质量和工业工程师应根据他们的编码和分析技能决定使用哪一种,同时符合组织的目标和客户的规格。
—
如果你觉得这篇文章有用,欢迎在 GitHub 上下载我的个人代码。你也可以直接在 rsalaza4@binghamton.edu 给我发邮件,在LinkedIn上找到我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的媒体 简介 来探索我以前的文章。感谢阅读。
——罗伯特
机器学习管道的拖放工具——值得一试吗?
比较机器学习的 6 个免费可视化编程工具的免费版本限制、互操作性和模型动物园。
拖放式机器学习管道与数据科学工具
几周前,我会说拖放式机器学习工具永远不会比开源编程语言的灵活性更好,如果必要的话,结合笔记本。
像许多数据科学家一样,我一直在用 Python 和 R 进行机器学习:从数据探索到可视化、模型拟合和比较等。
最近,我看到我周围有多个人在使用拖放式机器学习工具,这让我很好奇。考虑了一下,我认为如果我能找到一个免费的拖放式机器学习工具,拥有所有重要的模型,并且可以很容易地将拟合的模型导出到其他语言,那么至少值得一试。
我花了一些时间列出这项工作的现有工具,并验证它们是否满足这些基本要求。我在这篇文章中分享我的基准。
基准测试的拖放工具(来源:dataiku.com,mljar.com,orange.biolab.si,cs.waikato.ac.nz/ml/weka/, knime.com,rapidminer.com)
拖放式机器学习管道—基准
我对这种工具的使用是模型比较。
最低要求:
- 机器学习管道的拖放基准测试。
- 比 Jupyter 笔记本更容易使用(相当有挑战性)。
- AutoML 工具被排除在基准测试之外(因为这不是我们的目标)
除此之外,我将在以下几点测试产品:
- 免费或者至少有一个合理的免费版本 因为如果我看不到免费版本的附加价值,我不会考虑购买它。
- 可与其他编程语言互操作
因为我显然不想强迫任何人使用该产品,所以需要一种简单的方法将我所做的导出到另一种语言。 - **好的模型动物园,**那包括深度学习
用于拖放机器学习管道的现有工具
浏览互联网,我发现了一些工具。其中一些人提议免费版本,而另一些人则没有。目前我真的在寻找一个免费的工具,所以我没有深入研究付费工具。
提出免费版本的:
- RapidMiner 工作室:https://rapidminer.com/products/studio/
- 大台库:https://www.dataiku.com/product/features/machine-learning/
- 韦卡:https://www.cs.waikato.ac.nz/ml/weka/
- https://mljar.com/
- https://www.knime.com/knime-analytics-platform
- 橙色:https://orange.biolab.si/
那些不推荐免费版本的(试用期不被认为是免费版本):
- SPSS Modeler(https://www.ibm.com/products/spss-modeler)
- SAS 企业矿工(https://www.sas.com/en_us/software/enterprise-miner.html)
- IBM Watson Studio 结合 SPSS Modeler(https://www.ibm.com/cloud/watson-studio)
- Alteryx 预测分析(https://www.alteryx.com/products/apa-platform)
RapidMiner 标志(来源:rapidminer.com)
回顾 1 — RapidMiner 工作室
链接:https://rapidminer.com/products/studio/
RapidMiner 定价或免费版本
- 免费版:10,000 个数据行,1 个逻辑处理器,社区支持,30 天企业试用
- 专业版:每用户每年 7,500 美元:100,000 个数据行,2 个逻辑处理器,企业支持,Turbo Prep,自动模式
- 企业版:每用户每年 15,000 美元:无限数据行、无限逻辑处理器、企业支持、Turbo Prep、自动模型、自动化模型操作、后台流程执行
RapidMiner 互操作性/导出模型
根据他们网站上的支持页面,RapidMiner 似乎支持 PMML 的一些型号,但不是全部。
RapidMiner 模型动物园
RapidMiner 模型动物园好像挺不错的。有人支持使用 H2O 进行深度学习。
RapidMiner 结论
RapidMiner 的免费版本只支持 10000 个数据行和 1 个逻辑处理器。这是如此有限,以至于对我来说,不值得测试他们的解决方案。
达泰库标志(来源:dataiku.com)
审查 2 —大台库
链接:https://www.dataiku.com/product/features/machine-learning/
大台库定价或免费版
Dataiku 的免费版有两种可能:
- 安装它永远免费:无限的数据处理,数据在您的基础设施,多达 3 个用户
- 或者,让 Dataiku 托管它:有限的处理能力,只有文件,单用户
这个免费版我好像可以接受,那就来下一点吧。
Dataiku 互操作性/导出模型
有几个导出模型的选项:
- 使用 Dataiku API 进行实时评分。
很酷的功能,但是免费版当然没有。 - 使用 PMML
对我来说很有趣,但不幸的是这需要一个“第二层支持级别”,我在免费版本中不会有。 - 导出到 Python 笔记本
Dataiku 的警告通知让我有点害怕*“这个特性并不支持所有算法”和“这个生成的笔记本仅用于教育和解释目的。特别是,本笔记本没有再现 DSS 的所有预处理功能,而只是 DSS 中训练的模型的最佳近似值。”*
大台库模型动物园
Dataiku 可以使用 Python 的 scikitlearn 作为建模引擎。车型数量比较好。还有对深度学习的支持。
达泰库结论
Dataiku 似乎是一个很好的检查工具。如果我继续做下去,Dataiku 的互操作性将是第一个要测试的东西,但现在它还不是一个障碍。
Weka 标志(来源:https://www.cs.waikato.ac.nz/ml/weka/)
回顾 3 — Weka
链接:https://www.cs.waikato.ac.nz/ml/weka/
Weka 定价或免费版
Weka 的 GUI 不如 RapidMiner 和 Dataik 流畅。它似乎介于 GUI 工具和代码的 GUI 包装器之间,所以我不确定它是否比使用 Python 笔记本有优势。
但是 Weka 是免费和开源的:这太棒了,这也是我把它放在列表中的原因。
Weka 互操作性/导出模型
我没有发现 Weka 是否提出了一个按钮点击选项来导出模型。Weka 使用来自 scikit learn 的模型,因此使用 Weka 建立模型并使用 Scikit Learn 重新拟合模型会很容易。
3.3 Weka 模型动物园
如前一点所述,Weka 用的是 Scikit Learn 的模型,对我来说不错。还支持用 deaplearning4j 进行 deap 学习。
3.4 Weka 结论
Weka 似乎是一个可以接受的工具:最大的问题是,与使用 Jupyter 笔记本相比,它是否有附加值。我需要测试一下才能确定。
MLjar 标志(来源:mljar.com)
回顾 4 — MLjar
MLjar 定价或免费版本
MLjar 有一个免费版本,数据集限制为 0.25 GB,30 天的项目历史和 5 个积分。1 个信用是 1 个计算小时,所以只有 5 个小时的使用是完全免费的。这远远不足以做一些严肃的事情。
MLjar 互操作性/导出模型
我没有找到从 MLjar 导出模型的方法。他们似乎有一个 API,但不清楚是仅用于模型构建还是也用于预测。
MLjar 模型动物园
MLjar 模型动物园的分类模型只有二元分类。这个对我来说太局限了。
MLjar 结论
MLjar 似乎开始了一些有趣的事情,但就目前而言,他们的解决方案对于价格和非常有限的免费版本来说似乎不够好。
Knime 标志(来源:knime.com)
回顾 5 — Knime 分析平台
链接:https://www.knime.com/knime-analytics-platform
Knime 定价或免费版本
Knime 有一个免费的开源版本,看起来相当强大:太棒了!
Knime 互操作性/导出模型
Knime 有可能与 PMML 一起出口模型。在付费版本中构建 API 是可能的。
克尼梅模型动物园
Knime model zoo 看起来相对不错,还包括深度学习。
Knime 结论
Knime 给我留下了非常好的印象,因为他们有一个非常精致的免费版本,良好的互操作性,以及一个很好的模型列表。GUI 看起来也很流畅。而且开源!这值得一查。
橙色标志(来源:orange.biolab.si)
审查 6—橙色
链接:【https://orange.biolab.si/getting-started/
橙色定价或免费版本
Orange 完全免费开源:牛逼!
橙色互操作性/导出模型
将模型保存为泡菜是可能的。然后这个泡菜就可以用 orange 导入 Python 了。使用 Pickle 似乎不是满足我需求的最佳解决方案:我希望存储模型并能够用另一个框架打开它。
橙色模型动物园
橘子模型动物园看起来可以接受,但是不支持深度学习。
橙色结论
橙色有一些很好的特点。它是开源的,看起来相当流畅。不幸的是,Orange 的互操作性部分非常糟糕。
获胜者是……Knime!
有两个工具我会考虑更详细地测试:
- Knime 似乎是最好的选择,因为我真的很喜欢它是开源的。Knime 给我留下了非常好的印象,因为他们有一个非常精致的免费版本,良好的互操作性,以及一个很好的模型列表。GUI 看起来也很流畅。而且开源!这值得一查。
- Dataiku 似乎是一个很好的检查工具。它的付费版本似乎没有太多的限制,它似乎很强大。
其他工具各有其特定的缺点:
- RapidMiner 的免费版本只支持 10000 个数据行和 1 个逻辑处理器。这是如此有限,以至于对我来说,不值得测试他们的解决方案。
- Weka 似乎是一个很好的产品:最大的问题是,与使用 Jupyter 笔记本相比,它是否有附加值。
- MLjar 似乎开始了一些有趣的事情,但就目前而言,他们的解决方案对于所要求的价格和非常有限的免费版本来说似乎不够好。
- 橙色有一些很好的特点。它是开源的,看起来相当流畅。不幸的是,Orange 的互操作性部分非常糟糕。
感谢你阅读我的文章,希望对你有用。不要犹豫,继续关注更多!
用 R 画一个雷达/蜘蛛图
工具
奥兰多泡沫中的 NBA 季后赛联盟老大是谁?
斯蒂芬·瓦伦丁在 Unsplash 上拍摄的照片
我在我的读者群中尝试了几种不同类型的 NBA 分析文章,他们是一群真正的篮球迷。我发现最受欢迎的文章是而不是那些具有最先进的机器学习技术的文章,而是那些带有直观而有意义的图表的文章。
在我作为数据科学家的职业生涯的某个阶段,我意识到传递信息比展示花哨的模型更重要。也许这就是为什么线性回归仍然是金融界最流行的模型之一。
在这篇文章中,我将谈论一个简单的话题。如何绘制蜘蛛图,或雷达图是比较分析中最重要的图形之一。我正在用 r 实现代码。
数据
2019–2020 NBA 季后赛 NBA 球员场均基本统计和高级统计。(来自篮球参考)
密码
让我们首先在蜘蛛图中可视化詹姆斯·哈登的统计数据。我们只关注五个数据:得分,TRB,助攻,抢断和 BLK。
df = read.csv("playoff_stats.csv")
maxxx = apply(df[,c("PTS.","TRB","AST","STL","BLK")],2,max)
minnn = apply(df[,c("PTS.","TRB","AST","STL","BLK")],2,min)
在这个块的代码中,数据被读取到数据帧“df”中。并且计算每列的最大值和最小值,因为这些值对于定义蜘蛛图中数据的边界是有用的。
例如,我提取了詹姆斯·哈登和勒布朗的数据进行分析。
df_sel = df[c(3,10),c("PTS.","TRB","AST","STL","BLK")]
rownames(df_sel) = c("Harden","Lebron")
要定义蜘蛛图的功能,我们需要加载fmsb包。
comp_plot = function(data,maxxx,minnn){
library(fmsb)
data = rbind(maxxx, minnn, data)
colors_border=c( rgb(0.2,0.5,0.5,0.9), rgb(0.8,0.2,0.5,0.9) , rgb(0.7,0.5,0.1,0.9) )
colors_in=c( rgb(0.2,0.5,0.5,0.4), rgb(0.8,0.2,0.5,0.4) , rgb(0.7,0.5,0.1,0.4) )
radarchart( data, axistype=1 , pcol=colors_border , pfcol=colors_in , plwd=4 , plty=1, cglcol="grey", cglty=1, axislabcol="grey", caxislabels=rep("",5), cglwd=0.8, vlcex=0.8)
legend(x=0.5, y=1.2, legend = rownames(data[-c(1,2),]), bty = "n", pch=20 , col=colors_in , text.col = "black", cex=1, pt.cex=3)
}
在函数中,“radarchart”将绘制蜘蛛图,下面将解释其中的一些参数。
pcol 和 pfcol 分别定义线条颜色和填充颜色。 plwd 和 plty 分别给出了蜘蛛图的线宽和类型。网格线(或网)具有由 cglcol 和 cglty 定义的颜色和类型。我不想在蜘蛛图的中心放置任何标签,所以将 caxislabels 赋予空字符串(rep(",5))。
我们来看看哈登的统计怎么样。
comp_plot(df_sel[1,],maxxx,minnn)
詹姆斯·哈登季后赛数据的蜘蛛图
从上面的剧情可以看出,哈登不仅是一个优秀的得分手(高分),还是一个组织者(高助攻)。这些解释与我们所知的詹姆斯·哈登完全一致。
为了比较詹姆斯·哈登和勒布朗的数据,让我们将两个球员的数据输入到函数中。
comp_plot(df_sel,maxxx,minnn)
詹姆斯·哈登和勒布朗·詹姆斯的蜘蛛图比较
我们可以看到,与哈登相比,勒布朗在数据上有更好的篮板和助攻数据,尽管他的得分不如哈登。
很直接,对吧?
让我们在扬尼斯·阿德托昆博和科怀·伦纳德的高级统计数据中做一个类似的比较,包括进攻框加减(OBPM),防守框加减(DBPM),进攻获胜份额(OWS),防守获胜份额(DWS),和真实投篮命中率(TS)。
df = read.csv("playoff_stats_adv.csv")
maxxx = apply(df[,c("OBPM","DBPM","OWS","DWS","TS.")],2,max)
minnn = apply(df[,c("OBPM","DBPM","OWS","DWS","TS.")],2,min)
df_sel = df[c(1,3),c("OBPM","DBPM","OWS","DWS","TS.")]
rownames(df_sel) = c("Giannis","Kawhi")
先来看看詹尼斯的统计。
comp_plot(df_sel[1,],maxxx,minnn)
扬尼斯·阿德托昆博季后赛先进数据的蜘蛛图
我们可以发现詹尼斯是一名全能球星,因为他几乎在各个方面都有不错的统计。难怪他赢得了 2019-2020 常规赛的第二个 MVP。
接下来,让我们比较一下詹尼斯和科怀·伦纳德的高级统计数据。
comp_plot(df_sel,maxxx,minnn)
扬尼斯·阿德托昆博与科怀·伦纳德的蜘蛛图比较
我们可以看到詹尼斯在高级统计的各个方面都超过了科怀。
你可以用这个简单的函数来比较任意数量的玩家,然而,我不建议使用蜘蛛图来比较超过 3 个人。
如果你确实需要比较一大群对象,那么热图可能是可视化的更好选择。这里是我以前在 r 中最好的热图函数的一个帖子。
一个关于如何在 r 中用 pheatmap 生成漂亮的热图的教程。
towardsdatascience.com](/pheatmap-draws-pretty-heatmaps-483dab9a3cc)
作为一名数据科学家,我希望这篇短文能对您的工具箱有所帮助!
参考资料:
使用 Python 中的散景绘制漂亮的交互式折线图
作者使用散景拍摄的图片
数据分析师/科学家必须了解的 Python 可视化库
折线图可能是展示两个维度之间关系的最基本但最有用的图表。通常用于连续显示变量y
在时间轴x
上的方差,其中 x 轴必须排序。
很容易从折线图中获得洞察力,如变量是增加、减少还是波动,以及获得其周期模式、峰值和尖峰。此外,我们可以在折线图上绘制多条线,以比较它们在同一时间窗口内的不同趋势,有时甚至可以了解它们如何相互影响。
在这篇文章中,我将演示如何使用 Bokeh,Python 中最流行的可视化库之一,来绘制一个漂亮的交互式折线图。
什么是散景?
Benjamin Wong 在 Unsplash 上的照片
官网对散景的定义非常好,如下。
Bokeh 是一个用于现代网络浏览器的交互式可视化库。它提供了优雅、简洁的通用图形结构,并在大型或流式数据集上提供了高性能的交互性。散景可以帮助任何人快速方便地制作交互式绘图、仪表盘和数据应用程序。
基本上,散景可以帮助我们在网页中生成可视化效果,可以用任何流行的浏览器查看。不过需要强调的是,它还支持 Jupyter 笔记本。因此,您不必每次都在浏览器上的单独选项卡中生成图表。它就像 Matplotlib 一样,可以把你笔记本上直接渲染的数据绘制出来。
安装和导入
照片由 K . I . I . A . N 拍摄📷 on Unsplash
安装散景非常容易。只需在命令行中运行pip
就可以获得它。
pip install bokeh
大多数时候,我会如下导入散景,这只是将被利用的基本包。当然,当有一些定制的需求时,我们可能需要导入更多的功能。
from bokeh.plotting import figure, output_notebook, show
figure
包是我们用来绘制数据的主要包。show
包将在单独的网页中或者直接在笔记本上呈现图表。只有当我们想要在笔记本中渲染图表时,才需要output_notebook
,所以在本教程中我们需要它。
一旦我们导入了output_notebook
,我们只需要运行这个函数来启用“笔记本模式”。
现在我们应该开始了。
基本折线图
照片由 Serghei Trofimov 在 Unsplash 上拍摄
让我们从一些基本的开始。虽然 Matplotlib 也能很好地完成这项工作,但 Bokeh 让事情变得更直观,也更容易获得漂亮的效果。
首先,我们需要生成一些随机数据。
import numpy as np# Generate random data
x = np.arange(1, 11)
y = np.random.rand(10)
然后,初始化图形的“画布”。
# Generate canvas
fig = figure(title='Line Chart Example',
x_axis_label='x',
y_axis_label='y',
width=800,
height=400)
这里的width
和height
是实际像素,与 Matplotlib 不同。事实上,我喜欢使用这些像素,这对任何有一些 web 前端体验的人来说都更友好。
之后,让我们划清界限。
# Draw the line
fig.line(x, y,
line_alpha=0.8,
legend_label='example value',
line_width=2)
如代码所示,我们可以使用line_alpha
设置线条的透明度,设置图例标签以及线条宽度。
最后,我们需要调用show(fig)
函数来渲染这个折线图。如果您正确运行了output_notebook()
,图表应该绘制如下。
多行
萨姆·普林在 Unsplash 拍摄的照片
如果我们有多条线呢?散景提供了一个非常方便的功能multi_line()
,可以一次绘制多条线。
我们可以继续使用x
系列,但是生成两个不同的y
系列。
# Generate two data series
y1 = np.random.rand(10)
y2 = np.random.rand(10) + 1
这里我只是在第二个y2
数据上加 1,使其高于y1
,没什么神奇的。
然后,让我们创建图形并绘制两条线。不要忘记“显示()”它。
# Multiple Lines
fig = figure(title='Multi-Line Chart Example', width=800, height=400)# Draw two lines
fig.multi_line([x, x], [y1, y2],
color=['blue', 'red'],
alpha=[1, 0.3],
line_width=2)# Show the figure
show(fig)
互动功能
到目前为止,与 Matplotlib 相比没有太大的不同,除了散景更漂亮。但是等等,你有没有注意到图表右边有一个工具栏。默认工具包括
- 平移手势
- 框放大
- 鼠标滚轮放大/缩小
- 将图形保存为 PNG 图像
- 重置位置和缩放级别
- 帮助
生成图表时,可以启用更多支持的交互式功能。你可以参考官方文档来获得更多的细节,但是我相信这些默认工具对于大多数场景来说已经足够了。
高级定制
JESHOOTS.COM在 Unsplash 上的照片
有时,出于某种原因,我们可能需要定制我们的折线图。在这一节中,我将提供一些例子。
比方说,我们想比较一些数学函数,以了解它们在 x 变大时的趋势。这些功能如下:
- y=x
- y=x
- y=logx
- y=10^x
- y=e^x
让我们先生成数据。
# Generate functions and data
x = np.arange(0, 3, 0.1)
y1 = np.power(x, 2)
y2 = np.log(x)
y3 = np.power(10, x)
y4 = np.exp(x)
会有一些警告,因为 log0 是未定义的,但是不用担心,它将是 Numpy 数组中的一个-inf
。此外,Bokeh 足够聪明,可以在渲染数据时忽略该值。
y 轴刻度和数据点形状
现在,我们可以再次使用multi_line()
函数来一次绘制所有的函数。但是,我想一个一个地做这件事,因为我认为把线和它们的配置分开会更清楚。当然,选择哪种方式取决于你。
fig = figure(title='Compare the Trends of Different Functions', width=800, height=400)
fig.line(x, x, legend_label='y=x', color='blue')
fig.line(x, y1, legend_label='y=x^2', color='red')
fig.line(x, y2, legend_label='y=logx', color='green')
fig.line(x, y3, legend_label='y=10^x', color='purple')
fig.line(x, y4, legend_label='y=e^x', color='brown')
show(fig)
嗯,它已经被正确地绘制出来了,但是它是不可用的。除了y=10^x
这个功能,其他都挤在一起了。所以,用这个折线图,我们实际上不能比较趋势。
解决方法是修改 y 轴的比例。如果我们可以使 y 轴不是线性的,它应该能够更清楚地区分功能。通过将y_axis_type
设置为log
,散景可以非常容易地做到这一点。
# Generate figure object
fig = figure(title='Compare the Trends of Different Functions', width=800, height=600, y_axis_type='log')
还有一个问题。即使我们为这些功能使用了不同的颜色,仍然不容易区分它们。让我们也为不同函数的数据点添加不同的形状。
# Use blue colour and circle for y=x
fig.line(x, x, legend_label='y=x', color='blue', line_width=2)
fig.circle(x, x, legend_label='y=x', color='blue', fill_color='white', size=5)# Use red colour and triangle for y=x^2
fig.line(x, y1, legend_label='y1=x^2', color='red', line_width=2)
fig.triangle(x, y1, legend_label='y1=x^2', color='red', fill_color='white', size=5)# Use green colour and square for y=logx
fig.line(x, y2, legend_label='y2=logx', color='green', line_width=2)
fig.square(x, y2, legend_label='y2=logx', color='green', fill_color='white', size=5)# Use purple colour and diamond for y=10^x
fig.line(x, y3, legend_label='y3=10^x', color='purple', line_width=2)
fig.diamond(x, y3, legend_label='y3=10^x', color='purple', fill_color='white', size=5)# Use brown colour and hexgon for y=e^x
fig.line(x, y4, legend_label='y4=e^x', color='brown', line_width=2)
fig.hex(x, y4, legend_label='y4=e^x', color='brown', fill_color='white', size=5)
酷!现在,我们可以很容易地确定这些函数及其趋势。
图例位置和隐藏
这个图形现在看起来不错,但是如果我们能够将图例重新定位到左上角,那就更好了,因为那里什么也没有。此外,该图中仍然有太多的线条,我们可能希望隐藏其中的一些线条,以便我们可以一次只比较其中的几条。
是的,散景很容易做到这一点。实际上,我们甚至不需要再次生成那个数字。因为我们有了图形对象fig
,我们可以直接修改它的属性来实现这些。
# Relocate Legend
fig.legend.location = 'top_left'
# Click to hide/show lines
fig.legend.click_policy = 'hide'
带工具提示悬停
现在,假设我们希望将鼠标悬停在这些线上以获取数据点的值。我们也可以在散景中轻松实现这一点。此外,我们不需要重新生成图形,因为我们可以向图形对象添加“工具提示”。
from bokeh.models.tools import HoverToolfig.add_tools(HoverTool(
tooltips=[
('(x, y)', '([@x](http://twitter.com/x), [@y](http://twitter.com/y))')
]
))
我们需要导入HoverTool
类,以便将其作为“工具”添加到 figure 对象中。请注意,散景使得自定义工具提示变得非常灵活。具体来说,我们可以将每行文本定义为一个元组。对于元组的第二个值,我们可以使用@
符号来指代数据字段。在这个例子中,我只定义了一个元组。如果您用不同的格式和/或数据字段定义了多个元组,工具提示将显示它们。
用 HTML 模板定制工具提示
如果我们有更具体的要求呢?散景使得工具提示更加灵活,我们甚至可以使用 HTML 模板来定制工具提示。
fig.add_tools(HoverTool(
tooltips='<font face="Arial" size="3">When x is [@x](http://twitter.com/x){0.0}, y is [@y](http://twitter.com/y){0.00}</font>',
mode='vline'
))
请注意,我这次还加了mode='vline'
。这将在相同的垂直 x 轴位置显示所有行的工具提示。因此,它将显示所有不同y
的相同x
的值,这样更便于比较。
洛伦兹吸引子
让我们用一个来自官方图库的花式折线图来完成这篇文章。散景确实很美。
from scipy.integrate import odeintsigma = 10
rho = 28
beta = 8.0/3
theta = 3 * np.pi / 4def lorenz(xyz, t):
x, y, z = xyz
x_dot = sigma * (y - x)
y_dot = x * rho - x * z - y
z_dot = x * y - beta* z
return [x_dot, y_dot, z_dot]initial = (-10, -7, 35)
t = np.arange(0, 100, 0.006)solution = odeint(lorenz, initial, t)x = solution[:, 0]
y = solution[:, 1]
z = solution[:, 2]
xprime = np.cos(theta) * x - np.sin(theta) * ycolors = ["#C6DBEF", "#9ECAE1", "#6BAED6", "#4292C6", "#2171B5", "#08519C", "#08306B",]fig = figure(title="Lorenz attractor example", background_fill_color="#fafafa")fig.multi_line(np.array_split(xprime, 7), np.array_split(z, 7),
line_color=colors, line_alpha=0.8, line_width=1.5)show(fig)
摘要
在这篇文章中,我介绍了如何使用散景来绘制美丽的折线图。作为 Python 中最流行的可视化库之一,Bokeh 提供了许多开箱即用的可视化特性,如交互式工具集。当涉及到较低的水平,它也提供了非常灵活的功能,让我们自定义我们的数字。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
参考
[1]散景最新文档,https://docs.bokeh.org/en/latest/index.html
[2]散景画廊,洛伦兹吸引子,【https://docs.bokeh.org/en/latest/docs/gallery/lorenz.html
在 VS 代码中绘制 UML 图
在 VS 代码中使用 PlantUML 扩展
在 VSCode 中编辑 PlantUML 序列图(作者)
在数据科学项目中,UML 图对于用组件图或类图说明问题领域的概念模型是非常重要的;或者展示你的机器和算法如何与序列图或活动图一起工作。你们中的一些人可能会定期在纸上画这个,或者使用一些软件,如 PWP 或 Adobe AI,如果你不是专家,这有时会让你头疼。
许多在线工具如 https://www.diagrams.net/的 T4 也允许你画图表,但有时会让你花很多时间去画一个复杂的图表。因此,这篇短文介绍了一种替代手工绘制的方法,展示了如何使用 plant UML(https://plantuml.com/)的纯文本(易于理解的脚本)来绘制图表。它是一个用于创建 UML 图的开源工具和语法。使用这个工具,您可以创建各种各样的 UML,从简单的流程图到复杂的图表。通过将 PlantUML 安装为 VS 代码扩展,您可以直接在 VS Code 软件中编辑它,如下面的 gif 动画示例所示。
在 VSCode 中创建一个简单的序列图(作者提供)
要求
- 安装 VS 代码
- 安装 PlantUML 扩展
PlantUML 扩展(作者截图自 VS 代码)
开始画你的第一张图
要开始绘制 UML 图,请检查来自https://plantuml.com/的语法文档。在主 PlantUML 主站点上有很多很好的语法例子,很容易理解。
在您了解 PlantUML 的语法之后,只需在 VS 代码中打开您的项目文件夹,并使用创建一个文件。puml 文件类型,并开始编写您的 uml 代码。您还可以通过右键单击 VS 代码脚本窗口并选择“预览当前图”或点击“Alt + D”来查看更新的实时变化(此选项在您编辑时可用)。puml 文件)。
编辑 PlantUML 图时预览实时变化。(作者)
导出您的图表
完成编辑后,您可以通过右键单击 VS 代码脚本窗口并选择“Export Current Diagram”来导出图表。然后会提示您选择所需的文件类型。如果你不确定选择哪一个,我建议你生成一个矢量文件类型。svg ,。 eps )总是给你最大的分辨率。
导出 PlantUML 图。(作者)
差不多就是这样!我希望您喜欢这篇文章,并且能够在您的数据科学或编程项目中应用这个 UML 工具。如果您有任何问题或意见,请随时告诉我。
我希望你喜欢它,并发现它对你的日常工作或项目有用。如果你有任何问题,请随时联系我。
关于我&查看我所有的博客内容:链接
平安健康!
感谢阅读。👋😄
用 OpenGL 绘制金融股票行情图
利用 GPU 核心通过 GLSL 卸载 CPU
OpenGL 图表图像。来源:维基共享资源。
介绍
我一直致力于将 OpenGL 作为显示图形的终极方式。在本文中,我将描述如何将数据从 CPU 转移到 GPU。虽然这是正常的方法,但我发现的所有信息都专注于提供与 3D 渲染过程直接相关的数据(位置、颜色、法线),我花了很长时间来理解和定位关于如何将更高抽象数据移动到 GPU 的信息,比传统的 3D 模型点更远。在这种情况下,OpenGL 社区和可用的信息也没有多大帮助,因为大多数活跃在论坛中的人通常都参与 3D 引擎。
说白了,我正试图让 GPU 从与图形无关的数据中完成实际的图形模型,这似乎是一个不太常见的 OpenGL 任务。这可以认为是做纯渲染(OpenGL)和做纯计算(OpenCL)的中间步骤。我们正在将计算过程卸载到 GPU 中,但它仍然是与渲染相关的代码。
在我的例子中,我正在处理 2D 股票市场数据,我希望 GPU 负责处理所有的金融数据,以显示一切。对于那些不熟悉财务图表的人来说,举一个可能更容易理解的例子,假设您正在绘制一个有许多树的森林场景。您可能传递给 GPU 的信息包括树的位置、树的类型的整数(我们可能有不同类型的树要渲染)、树的高度和宽度。GPU 可以从这些简单的信息中为每棵树构建数百个图元。通过这样做,CPU 不需要将我们高度抽象的木材模型(位置、树的类型、宽度和高度)转换成可绘制的模型。性能的提升是巨大的,因为我们利用了 GPU 的大量内核。另一个好处是,我们还将图形部分从应用程序中分离出来,将所有的渲染和图形模型构建例程转移到 GLSL。
GPU 拥有强大的能力。由于我目前正在开发要求不那么高的 2D 应用程序,我已经使用旧的廉价 NVIDIA Quadro 卡在旧的 OpenGL 标准(3.3)中稳定了我的开发,这些卡在旧的交易工作站中很常见。我这样做是为了确保我的应用程序可以在遗留硬件中使用。我正在处理的卡有 16 个内核,这并不令人印象深刻,但现代卡现在有数百个内核(在撰写本文时,Nvidia GeForce RTX 2080 Ti 代表了 4352 个内核的最先进水平)。在一台经济实惠的电脑上搭载 4000 多枚内核简直太棒了。然而,与使用 CPU 在应用程序级别实现图形的传统方法相比,即使是普通的传统卡也能大大提高图形性能。作为一种权衡,编程 GLSL 并将图形卸载到 GPU 会使编程变得更加复杂:调试 GLSL 具有挑战性,有时甚至令人沮丧。
在这篇文章中,我将描述我遇到问题的地方,主要是因为我没有做非常传统的事情(比如将整数传递给顶点着色器)和理解步幅和偏移。我把注意力集中在令我烦恼的特定概念和代码部分。
顶点数据涉及任意数据
尽管顾名思义,你是在表示顶点(顺便提一下,这是最常见的用例),但顶点只是你移入 GPU 的缓冲数据,特别是移入顶点着色器。这些数据可以包含绘制实际模型所需的任意信息。通常这将包括关于位置的某些信息,但是它可能意味着更高的抽象模型,其中位置由该抽象模型隐式地定义。
在我们的例子中,我们将制作一张简单的蜡烛图。因此,我们的输入数据将是:
open price, high price, low price, close price, volume, timestamp
除此之外,我们希望 GLSL 画出:
OpenGL 中绘制蜡烛的“hello world”
所以我们的顶点信息不包含传统意义上的 x/y 位置。并且它绝对不涉及图形元素(点/线/三角形)。我们只需将蜡烛信息移入 GPU,并让卡片完成所有绘图。通过这样做:
- 应用程序现在更容易编码,因为它管理实际的现实生活数据(所有应用程序都应该尝试这样做),绘制实际蜡烛的问题缩小到 GPU。
- 性能的提升是巨大的,因为我们利用我们的 GPU 核心来执行构建图元时涉及的简单操作。
- 我们已经在模型层和表示层之间做了最好的解耦——软件开发中的解耦是少数几个几乎总是有意义的建议之一——。
GLSL 数据类型
与传统编程相比,使用 GLSL 编程 GPU 有一定的局限性。最后,我们正在处理为渲染而优化的小内核。GLSL 深受 C 语言的影响,所以它继承了一些 C 类型,但同时,它有特殊的类型用于处理多达 4 个元素的向量和矩阵。我仍然在研究可变大小的数组是否可以被移入 GPU,但目前我使用的是基本类型:
bool - boolean type (true/false)
float - 4 bytes
double - 8 bytes
int - 4 bytes signed integer
uint - 4 bytes unsigned integer
vec2 - 2 float vector (vec2.x, vec2.y)
vec3 - 3 float vector (vec3.x, vec3.y, vec3.z)
vec4 - 4 float vector (vec4.x, vec4.y, vec4.z, vec4.w)
ivec2 - 2 int vector (ivec2.x, ivec2.y)
ivec3 - 3 int vector (ivec3.x, ivec3.y, ivec3.z)
ivec4 - 4 int vector (ivec4.x, ivec4.y, ivec4.z, ivec4.w)
关于 GLSL 数据类型的全面而简明的指南可以在这里找到。
这意味着在我们的例子中,我们有 6 个整数值(我使用整数而不是双精度浮点数来表示价格,以保持精确值),我们不能使用类似于ivec6
的东西,因为它不存在。
我们的“Hello World”示例绘制了三根蜡烛
源代码(在 Java 中使用 JOGL,但在 C++中类似)创建了一个包含所有信息和三个 vbo(顶点缓冲对象)的数组。
这个数组将被用来为每个缓冲区提供数据。我们需要处理的信息是stride
和offset
,这样 OpenGL 顶点着色器可以稍后定位数据。使用的具体glVertexAttribPointers
有:
我们的“Hello World”示例定义了顶点属性,包括每个数据的步幅和偏移
注意我们是如何使用glVertexAttribIPointer
而不是glVertexAttribPointer
的,因为我们处理的是整数数据。出于某种原因,我没有能够传递负整数,即使使用了GL_INT
而不是GL_UNSIGNED_INT
。
Vertex 如何工作的一个很好的定义可以在这里找到,它对我理解相关概念很有用。
顶点和几何体着色器
顶点着色器现在可以拾取全部数据:
顶点着色器代码
对于输入数据,位置布局属性定义了我们正在收集的具体属性,数字必须与glVertexAttribIPointer
中使用的数字相匹配。该信息是使用变量gs_ohlc
、gs_volume
和gs_timestamp
从几何着色器收集的。请注意顶点着色器中的输出变量名必须与几何着色器中的输入变量名相匹配。还要注意我们没有使用gl_Position
,因为我们还没有处理任何位置,只是高级抽象数据。没有必要,您仍然可以将任意数据从顶点传递到几何着色器。
几何着色器收集高级数据并构建图元。它甚至根据蜡烛线是看涨还是看跌来给它们上色:
几何着色器代码
我们基于 OHLC 和时间戳数据构建原语(在本例中为 line_strips)。这个例子很粗糙,缺少绘制整个图表所需的所有额外细节。但是它说明了如何将抽象数据移入 GPU 来实现图形原语。
摘要
在本文中,我回顾了一些在 OpenGL 教程或文档中不常讨论的概念;不是因为它们没有被记录,而是因为它们不属于传递浮动顶点信息来执行 3D 渲染的最常见用例。
虽然代码并不完整,但对于那些已经在 OpenGL 中运行了第一个教程并希望更好地理解如何将数据移动到着色器的人来说,它是有用的。它也缺少绘制整个图表所需的其他方面,但它代表了令我感到麻烦的方面和 OpenGL 语法。
我仍在研究整个数据是否可以作为 6 个元素的数组传递,以包括可能的其他情况,我们可能希望将更大的数据块移动到 GPU。我还需要涵盖的东西,如滚动,缩放和缩放。GLSL 被证明是一个深思熟虑的从零开始学习的迷人话题。如前所述,我仍然有一些简单的问题,比如将负整数传入顶点着色器。这是一个明显的迹象,表明 GLSL 不像其他技术那样直观。事实上,大多数学习材料都集中在 3D 上,而我使用的是 Java JOGL(大多数材料使用 C++),这也不利于这个过程。
GPU 的能力是惊人的,我也有动力在未来学习如何通过 OpenCL 或 CUDA 将这种能力用于一般计算。对于数据工程、回溯测试软件和 ML 等活动来说,这是一个非常好的选择。
在真实环境中使用 GauGAN 绘制故事的内心世界
艾夫纳·佩莱德 和我正在分享骨髓发育阶段的经验教训。这篇文章着眼于我们如何在 360°环境中实时使用GauGan。
人工智能和交互式讲故事都是复杂和不可预测的系统。随着我们深入骨髓的设计过程,将这两个系统结合成一个连贯的体验的挑战变得明显。一方面,作为作者,我们开发了人工智能系统和实时交互来引导体验的流动。另一方面,我们希望讲述一个能激发参与者想象力和情感的故事。
Avner Peled 在测试我们的 GauGan 系统时拍摄的截图;一瓶水换成了花
《骨髓》是一个关于机器学习模型中精神疾病可能性的故事,主要关注生成性对抗网络(甘)。我们质疑在高级人工智能中会出现什么样的精神障碍,并邀请参与者在由甘操作的互动剧场场景中进行表演。他们一起扮演一个功能失调的人工智能家庭。由于我们正在处理非常抽象和复杂的概念,我们想探索多种方式来传达这个故事,而不仅仅是通过家庭成员之间的对话。我们的策略是让房间更加“生动”,反映出模特的精神状态。我们想消除参与者和环境之间的障碍;让他们慢慢沉浸在房间里不熟悉的魔法体验中。房间和晚餐的场景是一个邀请,让我们放手,沉迷于与其他三个陌生人的情感事件。
Andre Bendahan 在 NFB 实验室拍摄的照片 2020 版权所有
在实践中,这意味着我们必须实施经常与环境和参与者交互的 GAN 网络。由于 GAN 的训练过程不是实时发生的,这就变成了一个挑战,即操纵预训练 GAN 网络的输出以响应环境的实时变化。为了解释我们的解决方案,我们首先需要看看标准 GANs 和条件 GANs 之间的区别。
标准与有条件的 GANs
在其基本形式中,GAN 被训练产生视觉上类似于训练集的新图像。如果我们使用人脸数据集,它会生成新的人脸。如果我们把它用在猫身上,它会产生新的猫。它可以通过采用输入“噪声”向量(本质上是一系列随机数)并使用它们作为输出图像的基础来保持可变性(不是每次都产生相同的图像)。因此,如果我们想要将 GAN 的输出与环境变化联系起来,我们需要根据这些变化来控制噪声矢量。然而,正如我们在之前的文章中所展示的,对于改变噪声向量会产生什么样的变化,几乎没有任何控制。
2020 年 1 月,我们完成了骨髓的开发阶段。我和 Shirin Anlen 正在分享在…
towardsdatascience.com](/a-tool-for-collaborating-over-gans-latent-space-b7ea92ad63d8)
我们可以将物理房间中的不同变量(如参与者的位置、物体的位置和参与者的情绪分析)与生成的输出联系起来,但缺乏对输出的精确控制导致了与环境的脆弱联系。
作者演示了标准 GAN 和条件 GAN 之间的差异
这就是有条件的 GANs 进入画面的地方。我们不是在一组图像上训练,而是在由一个图像和一个标签(数字输入)组成的对上训练网络,当呈现特定种类的标签时,该网络被调整为生成一种类型的图像。这使得用户可以完全控制 GAN 如何针对特定输入产生输出。与原始 GAN 一样,结果仍会随着噪声矢量的变化而变化。然而,现在作者可以创造与环境有意义的互动。最著名的条件 gan 之一是 Pix2Pix 。
图片 fromhttps://phillipi.github.io/pix2pix/
这是一个通用的图像到图像转换器。它可以根据任何类型的图像生成另一个图像。它分析两幅图像中的像素,学习如何从一种颜色转换到另一种颜色。Pix2Pix 的使用方式多种多样,比如将草图转化为画作,将色彩映射表转化为照片。我们还在我们的原型中使用它来将一个人的彩色姿势分析转换成一个从家庭照片中生成的人。
2018 年 11 月,我们呈现了《骨髓》的序幕:我一直在 IDFA 嫉妒别人的家庭…
沉浸.新闻](https://immerse.news/family2family-first-steps-5f085dc75666)
高根
Pix2Pix 找到了自己的优势,作为一个从任何图像到任何图像的通用翻译器,它也有自己的弱点。仅仅依靠颜色会错过可以输入网络的元数据。该算法只查看形状和颜色。如果餐盘和飞碟在照片上看起来相似,它就无法区分它们。这就是 NVIDIA 的研究人员在创造 GauGAN 时所解决的问题。以后印象派画家保罗·高更的名字命名,GauGAN 也用彩色地图创作现实主义的图像。但是,它不是学习像素值,而是学习图像的语义*数据。该项目也被称为 SPADE : 具有空间自适应归一化的语义图像合成。GauGAN 学习哪里有草地和天空,而不是学习图片中绿色和蓝色的位置。*这是可能的,因为训练集中使用的图像,如通用数据库 COCO-Stuff ,包含图片中不同元素的语义分类。然后,研究人员能够通过制作一种交互式绘画工具来展示 GauGAN 的能力,在这种工具中,颜色不仅仅是颜色,而且还有意义。当你在源草图上画绿色时,你是在告诉 GauGAN 这里有草。在这里自己试试。
图片来自*https://www.nvidia.com/en-us/research/ai-playground/*
将 GauGAN 连接到实时 360°环境
GauGAN 可以从手绘草图中生成真实感图像。我们的目标是让它与实时物理环境互动。解决这个问题就像拼拼图一样:
- 我们知道 NVIDIA 对 GauGAN 进行了语义数据方面的培训:他们使用 DeepLab v2 网络来分析 COCO-Stuff 数据库并产生标签。
- 我们知道 DeepLab V2 可以实时分割相机流。
- 1+2:如果我们将 DeepLab 的相机流输出直接馈送给 GauGAN,我们应该会得到它的真实镜像状态。
代码本身相对简单,主要与两个网络之间的格式转换有关。我们还升级了 DeepLab 的网络摄像头代码,以从我们的 360°摄像头传输:理光 THETA Z1 。分割网络是如此强大,以至于我们可以将加宽的拼接图像直接馈送给分割和生成。结果出奇的准确。
GauGAN 系统流程的作者插图
操纵甘的现实
我们现在有一个生成的镜像,描绘了甘(可可的东西)的版本,无论相机在房间里看到什么。但是我们想要更多;我们想要一个能根据故事变化的空间,并能模拟角色的精神状态。我们寻找产生与故事世界相联系的视觉效果的方法。为了找到单词之间的含义并吸引用户继续行动,四处移动物体,看到倒影,并想知道这是怎么回事。
我们意识到我们可以干预感知和生成的过程。就在 DeepLab 分析了相机流中的标签之后,为什么不用其他东西替换它们呢?例如,让我们将任何公认的碗映射到海洋。
Avner Peled 在测试我们的 GauGan 系统时拍摄的截图;一个碗被替换为海洋纹理
我们开始寻找我们的角色的故事可以浮出水面的模式,以及物理空间可以支持整个视觉形式的模式:一张脸,一幅风景,一个物体,一朵花。故事是可识别的模式,在这些模式中,我们找到了意义。它们是噪音中的信号。
当我们最终到达实验室进行测试时,我们发现了物理环境的影响。我们通过排列(和重新排列)奇怪的元素和探索我们能达到的结果开始玩。我们开发了一个脚本平台,让我们可以轻松地将对象映射到其他对象。我们可以从场景中屏蔽某些对象,一次选择多个对象,或者反转选择来映射除指定对象之外的所有对象。例如:“餐桌”、“桌子”、“书桌”、“书桌用品”、“地板”、“床”、“汽车”——突然变成了同一个项目,并被映射成一片海洋,而其他所有东西都被丢弃了。虽然我们没有汽车,没有塑料,也没有床。或者“飞盘”、“纸”、“老鼠”、“金属”、“岩石”、“碗”、“酒杯”、“瓶子”——都映射到“岩石”。同样,有趣的是,我们在真实场景中没有鼠标、飞盘、金属、石头或纸张,但是网络检测到了它们。因此,我们也需要考虑它们。
来自髓的 GitHub 的截图
如果这还不够,我们发现灯光、阴影和相机角度的变化每次都会产生不同的标签,这打乱了我们的贴图。在一个互动的讲故事框架中,这感觉既不可思议又可怕。在开幕之前,我们有不到十天的时间来完善空间和调试技术,同时了解我们刚刚开发的产品可以创造的各种可能性。
作者照片。第一个实验——左侧:我们如何排列物品。右侧:高根人是如何绘制和投射图像的。
作者的照片展示了布景的原型:碗和瓶子变成了船,桌子变成了海洋。
我们和我们的网络一起玩,很少控制视觉效果,我们希望形象化我们角色的内心世界。
慢慢地,我们开始学习这个系统——什么可行,什么不可行,如何清理场景,如何稳定灯光。我们还决定投影这个过程的两个阶段,DeepLab 的彩色分段分析和 GAN 生成的输出。渐渐地,物理环境变得更加身临其境,可以与故事的文字联系起来。
Andre Bendahan 在 NFB 实验室拍摄的照片 2020 版权所有
倒影
- 预训练的 SPADE/GauGan 网络的分辨率以较低的 256x256 分辨率生成图像。很难让人们参与到这种视觉中,并让他们理解他们所看到的。实现更高的分辨率需要我们在培训中投入更多的资源,这在当时是不可能的。
- 因为 GauGAN 具有语义意识,所以图像的上下文非常重要。例如,将一张桌子映射到大海,而将混凝土墙留在背景中,会生成一个昏暗的湖泊或池塘。但是把墙映射成蓝天,现在海看起来更像海洋了。
- 由于这种上下文感知,也很难用孤立的对象来传达意思。当我们完整地展示这些图像时,它们通常看起来是最好的。
Andre Bendahan 在 NFB 实验室拍摄的照片 2020 版权所有
虽然我们仍然觉得围绕我们的故事还有很多实验和润色的空间,但这些结果让我们第一次看到了甘的“意识”,作为一个产生其内心世界的感知实体。这样的过程与人类意识的哲学产生共鸣。
伊曼纽尔·康德的先验哲学谈到了综合的行为:我们的表象一起行动,塑造一个统一的意识。在现代神经科学中,我们谈到了意识的神经关联,它描述了意识所需的神经活动,不是作为物体识别的离散前馈机制,而是统一体验的长期持续反馈波。这也是我们希望在髓室设计的体验类型,最终的“编辑”发生在参与者的头脑中。
有一件事我们确信不会给这项创造性的工作带来伤害——那就是让更多的人使用它。除非你做了很多次,否则你不会知道你在做什么,尤其是在这种复杂的项目中。只是制造制造制造。
*这里是项目的 开源 GitHub 库 **。*请和我们分享你的制作和想法!
从头开始绘制变压器网络(第 1 部分)
以有趣的方式获得变形金刚的心智模型
(图片由作者提供)
变形金刚神经网络——通常被称为“变形金刚”——是由谷歌领导的团队在 2017 年发表的一篇题为“注意力是你所需要的一切”的论文中介绍的。在接下来的工作中被很多人提炼推广。
像在它之前发明的许多模型一样,变压器有一个编码器-解码器架构。在这篇文章中,我们把重点放在编码器部分。我们将以自下而上的方式连续绘制它的所有部分。这样做有望让读者轻松地开发出变压器的“心智模型”。
下面的动画以快动作展示了我们将在本文中涉及的内容:
(图片由作者提供)
投入
转换器将单词序列作为输入,作为向量呈现给网络。在 NLP 任务中,通常使用一个词汇表(也称为字典),其中每个单词被分配一个唯一的索引。该索引可以被表示为所谓的独热向量,其主要由 0 组成,在正确的位置具有单个“1”值。下图显示了一个简单的十个单词的词汇编码:
请注意,独热编码向量的大小与词汇表中的字数相同,在实际应用中至少为 10.000。此外,所有独热编码彼此之间具有相同的欧几里德距离√2。
单词嵌入
接下来,我们通过将独热编码向量乘以所谓的“嵌入矩阵”来降低它们的维数。由此产生的向量被称为单词嵌入。原始论文中单词嵌入的大小是 512。
单词嵌入的巨大好处是意思相似的单词被放在一起,例如单词“cat”和“kitty”最终具有相似的嵌入向量。
请注意,“嵌入矩阵”是一个普通的矩阵,只是有一个花哨的名字。
位置编码
所有的单词同时呈现给变压器。这与递归神经网络(例如 LSTMs)有很大的不同,在 lst ms 中,单词是连续输入的。然而,这意味着单词在输入序列中出现的顺序丢失了。为了解决这个问题,转换器向每个输入嵌入添加一个向量,从而注入一些关于相对或绝对位置的信息。
键和查询
最后,我们将单词嵌入乘以矩阵 WQ 和 WK,以获得“查询向量”和“关键向量”,每个向量的大小为 64。
到目前为止提到的所有组件都绘制在下面的动画中:
输入序列、单词嵌入、位置编码、键和查询(作者图片)
请注意,我们绘制单个元素的顺序与计算元素的顺序无关。
并行化
在我们继续之前,有一点需要强调,那就是 Transformer 适合并行化的方式。请注意,所有的单词嵌入都可以并行计算。一旦我们得到了嵌入,我们还可以同时计算所有嵌入的查询向量和关键向量。这种模式将贯穿整个架构。请注意。
点积
我们计算“查询向量”和“关键向量”的所有可能组合的点积。点积的结果是一个单一的数字,在后面的步骤中将用作权重因子。权重因子告诉我们,在输入句子的不同位置的两个单词相互依赖的程度。这在原论文里叫自我关注。自我关注的机制允许变压器学习困难的依赖性,即使在遥远的位置之间。
“查询向量”和“关键向量”的点积(图片由作者提供)
缩放比例
随后,所有权重因子除以 8(关键向量 64 的维数的平方根)。作者假设在训练期间,点积的大小可以变大,从而将 softmax 函数推到梯度极小的区域。除以 8 会产生更稳定的梯度。
Softmax
缩放后的因子通过 softmax 函数进行归一化,因此它们都是正的,总和为 1。
在下面的动画中,我们对句子中第一个单词“the”的权重因子进行了缩放。请记住,属于第一个词的权重因子是点积:q1k1,q1k2,q1k3,q1k4。
属于第一个单词“the”的权重因子的缩放和 softmax(图片由作者提供)
类似地,对于输入序列中的其他单词“car”、“is”和“blue ”,我们得到:
属于剩余单词“汽车”、“是”和“蓝色”的权重的缩放和 softmax(图片由作者提供)
这就完成了权重因子的计算。
价值观念
与“关键向量”和“查询向量”的计算相同,我们通过将单词嵌入乘以矩阵 WV 来获得“值向量”。值向量的大小也是 64。
额外的
现在,我们将每个“价值向量”乘以其对应的“权重因子”。如前所述,这样我们只保留我们想要关注的单词,而不相关的单词通过用像 0.001 这样的小数字加权来抑制
总和
现在我们将属于一个单词的所有加权“值向量”相加。这就在这个位置产生了自我关注层的输出。
在下一个动画中,我们将描述“值向量”的计算以及随后对输入序列中的第一个单词进行的加权和求和。
第一个单词“the”的值、权重和总和(图片由作者提供)
类似地,对于我们输入序列中的其他单词“汽车”、“是”、“蓝色”,我们得到:
剩余单词“汽车”、“是”和“蓝色”的值、权重和总和(图片由作者提供)
自我关注的计算到此结束。自我关注层的输出可以被认为是上下文丰富的单词嵌入。根据上下文,一个词可能有不同的含义:
- 我喜欢清爽的秋天天气。
- 不要在去电车的路上摔倒。
请注意,底部的嵌入矩阵只对单个单词进行操作。因此,对于两个句子,我们会错误地获得相同的嵌入向量。自我关注层考虑到了这一点。
较短的句子
输入序列的长度应该是固定的,基本上是训练数据集中最长句子的长度。因此,参数定义了转换器可以接受的序列的最大长度。长度更长的序列会被截断。较短的序列用零填充。然而,填充词不应该有助于自我注意的计算。这可以通过在自我关注计算中的 softmax 步骤之前屏蔽相应的单词(将它们设置为-inf)来避免。这实际上将它们的权重因子设置为零。
遮蔽未使用的位置(作者图片)
多头自我关注
不是执行单一的自我注意功能,作者使用了多个自我注意头,每个都有不同的权重矩阵。多头注意力允许模型在不同位置共同注意来自不同表征子空间的信息。原论文中的变压器使用了八个平行的注意头。注意头的输出被连接并再次乘以附加的权重矩阵 WO。
多头自我关注用 3 个头,原创论文用 8 个头(图片由作者提供)
添加并正常化
刚刚讲到的多头自关注机制是编码器的第一个子模块。它周围有一个剩余连接,然后是图层规范化步骤。图层标准化只是减去每个矢量的平均值,然后除以其标准偏差。
剩余连接,图层归一化(作者提供的图片)
正向输送
自我关注层的输出被馈送到完全连接的前馈网络。这由两个线性转换组成,中间有一个 ReLU 激活。输入和输出的维数是 512,内层的维数是 2048。完全相同的前馈网络独立地应用于每个位置,即输入序列中的每个单词。
接下来,我们再次在完全连接的前馈层周围采用剩余连接,然后进行层归一化。
完全连接的前馈网络、剩余连接、层归一化(图片由作者提供)
编码器堆栈
整个编码组件是六个编码器的堆栈。这些编码器在结构上都是一样的,但它们不共享重量。
六个编码器的堆栈(图片由作者提供)
在下一篇文章中,我们将讨论变压器的解码器部分。这应该是非常直接的,因为大多数需要的概念已经在这篇文章中介绍过了。
参考
梦想成为大数据工程师?发现我们与软件工程师的不同之处
我们做的不是同一件事
工程是所有公司的基本要素。没有它,公司就无法创造、维护和升级他们的产品。技术企业依靠他们的工程部门在竞争激烈的世界中生存。
即便如此,并不是所有的工程师都执行相同的任务。在重技术型公司中,软件工程师是最关键的资源之一。他们构建程序,创建软件,并维护系统的功能。许多其他职业道路与软件工程不同。他们专攻某一特定学科。
在数据领域,企业面临着数据量的巨大增长。我们需要有人站出来承担管理这些数据的责任。这开启了大数据工程师的曙光。大数据工程师可以从数据库管理员、数据架构师或数据分析师发展而来。
为巴黎的一家广告技术巨头工作
towardsdatascience.com](/a-day-in-the-life-of-a-big-data-engineer-a286e4a5ae29)
大数据工程师和软件工程师的技能不同。尽管如此,许多公司倾向于将它们视为相同的实体。他们误用了工作描述中的术语。此外,他们在技术面试中会做出错误的假设。
在大多数情况下,软件工程师处理大数据工程师的工作。因此,他的职责变得复杂、模糊和多种多样。
作为一名大数据工程师,我强烈渴望巩固我们在公司层级中的地位。人们不得不把我们的职业视为一条与众不同的职业道路。要做到这一点,我们首先要定义我们是谁,以及我们与其他工程师有何不同。作为一个经常从事软件工作的人,我想指出我们与软件工程师不同的地方。
建模数据集
当需要数据的时候,就需要数据建模。这是我们定义表关系、命名列和测试查询的地方。
任何软件工程师都可以用少量的表创建一个数据库。大数据工程师可以管理数百个相互链接的表。解决各种问题需要一定的专业知识。我们如何连接表?这些栏目将采用什么格式?我们应该复制多少数据?
一切都来自经验,数据建模也是如此。大数据工程师需要在构建数据集之前采取预防措施。一个错误就可能导致严重的性能问题或冗余数据存储。
大数据工程师不时处理数据建模请求。一个请求可以是简单的添加一列,也可以是复杂的为整个管道创建一个数据库。无论哪种情况,大数据工程师都需要首先评估变更对当前系统的影响。然后,他提出了一些优化来减轻这种影响。另一位熟练的大数据工程师将密切关注这一点,以保持一切符合标准。
数据建模中使用的 ERD-实体关系图的示例。来源: Lucidchart
典型的数据建模过程始于设计阶段。大数据工程师收集所有业务和技术规范。这些因素包括可用收入、预期结果和一些限制因素。后续数据的一些草图将会派上用场。它可以向涉众展示我们将如何从源中检索数据,并组合它们以获得结果。
接下来是实施阶段。大数据工程师执行大量查询来验证其设计的可行性。我们会在合理的执行时间内完成查询吗?结果会包含想要的结果吗?一个严格、彻底和全面的设计阶段导致一个简单的实现。
如果现实与他的设计不符,大数据工程师会后退一步,审查他的解决方案。前前后后的评测需要几次迭代,直到正式发布。
典型的数据建模过程。作者署名
此阶段的成功允许大数据工程师进入验证阶段。这是数据集建模的关键步骤。利益相关者一起评估他的模型产生的数据的完整性。
该值必须与系统的其余部分一致。命名约定应该遵循内部标准,以避免混淆。数据结构应该是全面的。验证阶段需要对业务需求和技术用途有深刻的理解。
数据建模过程的其余部分包括文档、监控和维护。大数据工程师构建持久的数据系统,因此他应该照顾好自己的遗产。他的初衷对他的继任者来说一定非常清楚。他通过文档、操作说明和适当定义的监控指标进行交流。他渴望他的数据模型能够经受住许多系统性的变化。
***Key takeaways:***- To become a big data engineer, you need to know how to create databases first.
- Data modeling is a continuous process with many iterations
- A big data engineer must comprehend how his data interacts.
大数据执行编程
大数据执行由许多操作组成。这些包括数据操作,如 ETL——提取、转换和加载。如今,有许多工具可以自动化这些操作。剩下的就是编写指令了。
写大数据执行没什么复杂的。关键概念在于使用流行框架的能力。
Apache Hadoop 生态系统是首个成为行业主流的大数据框架。它的作业调度系统由 MapReduce 操作和一个资源协商器— YARN 组成。Hadoop 生态系统为我们提供了一个最小的 UI。它跟踪作业进度以及所使用的每个节点的系统日志。
好奇的头脑永远不知道自己的极限
towardsdatascience.com](/explain-hadoop-mapreduce-to-a-six-year-old-d338937c7f4b)
另一个基于 MapReduce 作业操作的流行框架是 Apache Spark。由于其稀疏性和灵活性,它在大数据公司中越来越受欢迎。Spark 架构由一个主节点和几个工作节点组成。 RDD 或弹性分布式数据集是与原点的核心区别。
编写大数据执行属于大数据工程师的日常活动。构建新的数据集、构建新的数据管道或处理来自源的数据。在完成对执行的编程后,他会将作业提交给数据调度程序。
数据调度器是一个执行作业的计时器。您可以为作业设置频率,定义重试次数,或者创建作业之间的依赖关系。一个著名的开源数据调度器是 Airbnb 工程师开发的 Apache Airflow 。
Apache Airflow 的核心概念之一是 DAG — 有向无环图。 Airflow creators 将 DAG 解释为一种简单的表示工作流程的方式。工作流由一组任务及其依赖关系组成。一个 DAG 包含有限数量的元素。顶点代表一组任务,边对应于它们的交互。DAG 中的一个简单约束是它在工作流中不存在任何循环。这意味着我们不能在同一个上下文中执行一个任务两次。
下面是一个使用 Apache Airflow 的作业调度示例
阿帕奇气流作业的一个例子。作者署名
***Key takeaways:***- A big data engineer spends most of his time on ETL-Extract, Transformation, and Load operations.
- Big data engineers leverage open-source tools to automize data processing
优化数据存储
企业在数据存储方面必须精打细算。它不仅是一种有限的资源,而且会成为数据操作的瓶颈。使用基于云的架构,建立数据存储系统变得越来越便宜。但是维护一个从来都不是简单的事情。
我们需要一个由一名数据库管理员、两三名数据架构师和一些数据分析师组成的团队。大数据工程师可以扮演这三个角色。
优化数据存储归结于对数据的理解。它从哪里来?它的本质是什么?我们将以何种格式存储它们?在将数据注入数据存储系统之前,分析数据从来都不是浪费时间。
大数据工程师已经掌握了预优化工具,但他需要更多。他承诺确保尽可能优化他的系统。他关心数据录取中的三件事:
- 数据格式: 数据可以是文本、图像、图形。Hadoop 生态系统倾向于将 拼花 作为一种高效的格式。其他传统的基于 MySQL 的系统支持日志文件系统。例如,镶木地板以紧凑而闻名,但在结构改变方面缺乏灵活性。
- 数据类型&压缩: 在 int 和 tinyint 下存储有四倍的 I/O 开销。即使是同一类型,值的范围也会影响一个列在存储系统中占用的空间。具有连续相同值的列最适合基于列的数据存储。其他因素包括垂直/水平分区、压缩算法和基于行或基于列的数据库。
- 数据留存: 有些数据在我们的系统中是无法永恒存在的。旧的、不相关的和不合适的数据不应保留在存储中。我们通过保留策略来定义数据的生命周期。这取决于技术限制和业务需求来决定时间框架。不用说,存储中的冗余数据等于金钱损失。
公司经常忽视数据存储优化,因为它令人望而生畏且单调乏味。但是数据驱动的企业最好把数据当成他们的产品来对待。大数据工程师有助于保持健康的存储系统,并尽可能获取最大利润。
***Key takeaways:***- Data storage optimization equals to saving money
- Most of data storage engine are pre-optimized, but it requires another layer of comprehension to save more space.
创建数据管道
一个数据管道是一个数据流。数据通常从一个地方移动到另一个地方以服务于不同的目的。输出数据用于报告、机器学习模型培训和商业决策。
稳定、不间断和准确的数据传输是必不可少的。我们需要确保整个流程的一致性。我们不能容忍任何信息丢失。
要创建数据管道,大数据工程师需要将上述所有活动结合起来。数据管道是许多数据所有者实体之间的协作。他们可能没有相同的标准。因此,大数据工程师应该对他的输入和输出数据了如指掌。
大规模建立端到端系统
towardsdatascience.com](/how-to-build-a-scalable-big-data-analytics-pipeline-7de18f8be848)
数据块是典型数据管道的最小可行元素。它包含数据库、存储/分析引擎和许多输入/输出连接器。这种模块化架构有助于打造一个灵活、稳健的数据管道。我们可以随意添加、删除、修改任何块,而不会严重影响整个系统。
一个数据块的例子。作者署名
大数据工程师构建持久的数据管道。维护和建设一样重要。我们能做些什么来创造一份持久的遗产呢?记录业务需求,跟踪查询执行情况,并省去事故手册。数据管道生命周期从产品规格开始,到报告仪表板,以及之后很长一段时间。
***Key takeaways:***- Data pipelines are the spine of a data system
- A modular-based architecture enables big data engineers to efficiently construct data pipelines
结论
我们了解了将大数据工程师与软件工程师区分开来的活动。尽管如此,他们还是有很多共同点。大数据工程师必须知道如何使用软件,正如软件工程师必须知道如何处理数据一样。
我叫 Nam Nguyen,我写关于大数据的文章。享受你的阅读?请在 Medium 和 Twitter 上关注我,了解更多更新。
做梦超过文字!
把深梦的想法延伸到文字资料!
“DeepDream 是一项将神经网络学习的模式可视化的实验。类似于当一个孩子观看云并试图解释随机形状时,DeepDream 过度解释并增强了它在图像中看到的模式。
它通过网络转发图像,然后计算图像相对于特定层激活的梯度。然后图像被修改以增加这些激活,增强网络看到的模式,并产生一个梦一样的图像。这个过程被称为“创意主义”(指的是创意网和电影盗梦空间)。"
【https://www.tensorflow.org/tutorials/generative/dee】T4 警梦
让我给你分析一下。考虑一个卷积神经网络。
假设我们想要检查当我们增加突出显示的神经元激活 h_{i,j} **,**时会发生什么,并且我们想要在增加这些激活时将这些变化反映到输入图像上。
换句话说,我们正在优化图像,以便神经元 h_{i,j }发出更多的信号。
我们可以把这个优化问题表述为:
作者图片
也就是说,我们需要通过改变图像来最大化 h_{i,j} 的平方范数(简单来说就是幅度)。
当我们按照上面所说的去做时,会发生这样的事情。
(左图片由 Von.grzanka | ( 右)图片由 Tensorflow 教程
这里的原因是,当 CNN 被训练时,中间层的神经元学会了看到一些模式(这里是狗脸)。当我们增加这些激活时,输入图像开始包含越来越多的狗脸,以最大化激活。
在文本上实现深度梦背后的直觉。
就像图像中的 deep dream,如果我们把任何一个隐藏层激活,并试图增加它的范数,文本输入会发生什么?
为了回答这个问题,采用了文本分类模型,并设置了损失函数来增加隐藏层的激活程度。我们希望看到这个隐藏层学习到的模式/表现。
嵌入层
作者图像|计算句子嵌入的图像显示方法。
神经网络模型不能理解单词。为了将单词作为输入,这些单词被转换成一个称为嵌入的 n 维数组。每个单词转换成特定的 n 维数组。为了得到句子嵌入,我们简单地取句子的平均值,然后这个数组被作为输入馈送给模型。这种方法解决了句子长度可变的问题,可以与香草人工 神经网络协同工作。
模型
作者图片
使用了一个经过训练的模型来对 IMDB 评论进行分类。模型验证准确率达到 80.10% 。
设置该实验是为了捕捉由全连接层 2 或 FC2 给出的表示,简而言之,具有 512 尺寸。
使用的成本函数是 fc2 输出的标准。
**注意:**因为“单词序列”是*长张量,*它们不能被反向传播优化。相反,句子的嵌入表示被优化。
程序概要
步骤 1:将句子转换成张量。
第二步:获得句子嵌入。
第三步:通过 fc2 层,得到 fc2 输出。
第四步:优化语句嵌入到增加 fc2 层输出。
步骤 5:对于给定的迭代次数,用当前的句子嵌入重复步骤 2 到步骤 4。
作者图片
结果
实验 1
简单句用于获取我们保存的分类结果及其对应的句子嵌入。
比如: “我讨厌这样。”,“我爱这个节目。”,我们用来分类。这些句子非常简单,分别传达了一种消极和积极的情绪。
对这些嵌入进行了梦想或优化,并记录了迭代激活图。
作者图片
这里可以观察到几件事情。
- 对于这两个句子,隐藏层表征的激活几乎是线性增加的
- 这些句子的激活是不同的,这意味着模型可以很容易地区分这两个句子。
对于句子:“我爱这个节目。”。 模型正确地将此预测为**。**
相似词测验
作者图片|基于相似度的词云。大字体意味着更相似。
最初,句子嵌入更类似于中性词,如“this,it,even same ”,但随着我们增加 fc2 激活的幅度,句子嵌入变得类似于积极的词,如“great,unique ”,这是有意义的,因为模型预测它是一个积极的句子。可视化迭代中的嵌入。
图片作者|动画展示了嵌入是如何从负面词汇走向正面词汇的。
作者视频|我们将肯定句的嵌入可视化。观察句子嵌入如何随步骤变化。
试嵌入此处 在 Tensorflow 投影仪上
观察句子嵌入如何从 step_1 开始并移动到 step_21。句子嵌入开始于肯定词和否定词之间,随着算法的梦想,嵌入向肯定词移动。
试试这些东西。
观察 3d 中的嵌入。
找到类似 step_1 的词。
找到类似 step_21 的单词。
对于句子:“我讨厌这样”* *。模型正确预测此为 负 。
相似词测验
首先,我们观察做梦前后与句子嵌入相似(余弦相似)的词有哪些。
作者图片|基于相似度的词云。大字体意味着更相似。
最初,句子嵌入更类似于中性词,如“ this,it,even,same ”,但随着我们增加 fc2 激活的幅度,句子嵌入变得类似于单词“ bad,nothing,bad”,这传达了否定的意思,这是有意义的,因为模型预测它是否定句子。
可视化迭代中的嵌入。
为了可视化迭代中的嵌入,使用 TSNE 算法将嵌入维数从 100 减少到 2 。这些嵌入被绘制在一个 2d 地图上,用红点作为负面词(如一个坏的、更坏的、卑鄙的、错误的词语),用绿点作为正面词(如伟大的、著名的、美妙的词语)。
灰点是句子嵌入的中间位置,黑点是句子嵌入的最终位置。
作者图片| 2d 空间上的 100 维嵌入
试嵌入此处 在 Tensorflow 投影仪上
该图清楚地显示了嵌入远离正面单词并接近负面单词,这与模型预测一致。而且最后的句子嵌入现在更像红点(否定词)而不是绿点(肯定词)。
这里的关键观察是,最初,句子嵌入在正面和负面单词之间,但是随着做梦的进行,嵌入被推离负面单词。
结论
做梦后的单词嵌入变得与“模型预测”中的单词相似,尽管如果我们观察初始嵌入的相似单词,它们对于两个句子或多或少是相同的,即使它们表达非常不同的意思,最终的句子嵌入显示出一些有趣的模式。
例如
1.否定预测被推近到像 错误、肮脏、恶劣 这样的词语
2.正面的预言被推近到像**的词语独特的、伟大的、享有盛名的****
实验二
我们现在将使用难句。前半句表达一种情感,后半句改变情感的句子。
像这样的句子
- 这部剧很长很无聊,但是导演很棒。
- 我讨厌这部剧,因为里面有裸体,但表演很经典。
人类很难判断这些句子表达了什么样的情感。
我们将再次优化句子嵌入,以最大化 fc2 层的激活。
作者图片|作为迭代函数的 fc2 层激活标准
不像第一种情况。两个句子的激活差异不大,即这些句子的激活或多或少相似,这意味着模型对这些句子没有分类能力。
我们来看看这些句子做梦前后的近义词。
“这部戏很长很无聊,但是导演真的很棒。”,模型预测为正
相似词测试
我们会发现类似于句首 vs 句尾嵌入的词。
作者图片
嗯,即使这个句子被归类为积极的,类似于最后一句嵌入的词并没有反映任何积极的情绪。
“我讨厌这部剧,因为它的裸露,但它的表演真的很棒。”,*模型预测为负***
相似词测试
作者图片
*这个句子被归类为**否定句,*梦后的嵌入反映了消极情绪。
结论
由于模型对这些句子没有清晰的理解,所以做梦后这两个句子的句子嵌入几乎是相似的(做梦后看相似的单词)。这是因为模型在其隐藏层中没有这些句子的丰富表示。**
我们从研究图像上的深度梦如何工作开始,然后我们提出了如何在文本上实现深度梦。最后,我们展示了如何正确解释结果。这种方法可以用来理解语言模型已经学习了什么样的隐藏表示。
像这样的实验帮助我们更好地理解这些黑盒。
您可以在本笔记本中尝试一个演示。
所有相关代码可在 my Github Repo 获得。
参考
- 基于梯度的学习应用于文档
识别 - https://ai . Google blog . com/2015/06/in ception ism-going-deep-into-neural . html
- 【https://www.tensorflow.org/tutorials/generative/deepdream】
- https://youtu.be/YHAIrwRVvWg?list = plyqspqzte 6m 9 gcgajvqbc 68 hk _ JKGBAYT
- https://py torch . org/tutorials/初学者/text _ 情操 _ ngrams _ 教程. html
dream scape——利用人工智能创造虚拟现实环境
人工智能能让我们梦想另一个现实吗?
Dreamscape 是一个探索数字城市的工具。基于对机器学习在建筑、城市化和游戏设计的虚拟空间中的生成能力的研究和调查。
摘要
随着人工智能(AI)越来越普及,它所带来的机会也越来越多。本文探索了机器学习工具,如生成性对抗网络,以及它们利用现实世界的数据推测新梦境的能力。我利用创造性的人工智能作为生成代理来推测城市景观,并在沉浸式虚拟现实( VR)环境中可视化它们。导致了建筑调查工具“梦景”的产生。最后,我探索了未来视频游戏的设计是如何自我生成的,它们的图形是如何由用户驱动的。
介绍
2010 年,街机大火乐队为他们的歌曲 【我们曾经等待 】推出了一个互动音乐视频。他们与谷歌合作,通过观众的过去精心制作了一个独特的情感之旅。在线体验首先要求观众在文本框中输入他们童年的地址,然后音乐视频开始播放,观众被神奇地传送到所述位置。通过展示空中和透视镜头,以富有节奏的歌曲为背景,这一街区变得栩栩如生。这个进入受试者生活的情感门户是谷歌地图技术的一个广受好评的创造性应用,让人们一瞥隐藏在收集和生成的大量数据中的创造性潜力。
图 1:仍然来自“市中心的荒野”,展示了用户童年家园的场景|来源:谷歌公司+街机火灾
随着最近遥感技术的进步,相机和用于将相机发射到太空的技术变得更加容易获得,导致数百个传感器被部署来点击来自太空的图片。而一队配备有 360 度视角相机的人、汽车和飞机帮助勘测所有七大洲的街道和岩层。谷歌地图和街景已经获得了前所未有的大量图片。街景平台已经成功捕捉到真实世界,并将其转化为数字化的虚拟空间。只需点击几下鼠标和一个人形图标,我们就能被传送到地球的任何一个地方。通过这一过程,谷歌科技试图将现实数字化。利用绘图和投影技术,我们的世界被抽象成数字世界。用户已经很好地适应了这个数字领域,在其中自如地导航,就好像它是真实的一样。在本文中,我将探索这些数据中潜在的创造性潜力,将其与生成工具结合起来,探索新的空间和形式。从图像失真开始,我们将把 AI 带入 VR 空间,以帮助推测游戏设计和架构。最后,通过这次探索,我创造了一个名为 Dreamscape 的工具,这是一种在虚拟现实环境中可视化城市景观的方法,将谷歌街景的数字化现实与 StyleGAN 的潜在空间融合在一起。在我们深入实验之前,我将提供一些关于网格、投影和风格转换的基本背景。如果您已经掌握了这些主题,请直接跳到方法。
图 2:谷歌地球三维视图|来源:作者
背景
谷歌通过从捕获的图像中提取数据来数字化我们的现实。他们使用一种叫做深度图分析和摄影测量的技术(从不同角度将同一物体的图像拼接在一起的过程)来生成一个三维网格。这个三维网格然后被纹理化,并在其上映射图像,使其看起来更真实。这类似于动画师为游戏和电影创造角色所使用的技术(见下面的图 3)。
图 3:左起:展开的 UV 纹理贴图、网格对象和纹理贴图网格|来源:作者
当一个纹理贴图被包裹到基础窗体上时,它的视觉质量会改变。如果不操作三维网格,可以通过扭曲基本纹理来改变外观。这是一个机会,可以将这项技术与人工智能图像生成技术的进步结合起来,使用卷积神经网络 (CNN)和生成对抗网络 (GAN) 。
图 4:风格转换示例,来自使用卷积神经网络的图像风格转换|来源: Leon A. Gatys
使用 CNN 的物体识别和表示语义信息(允许从风格中分离图像上下文)的进步成为导致创造性人工智能代理发明的不可或缺的过程。创造性人工智能中最早和最流行的自生成图像工具之一是神经风格转移。2016 年,Leon A. Gatys 写了一篇论文,概述了使用 CNN 计算图像到图像风格转换的框架。用最简单的话来说,它使用图像 A 的风格(纹理、颜色等)并将其嫁接到图像 b 上。这导致了一些工具来复制著名艺术家如毕加索的绘画的外观和感觉,这在风格转移实验中很受欢迎。通过训练 AI 来识别图像 A 的图案和纹理,同时将其与图像 b 中识别的对象和特征混合来存档。例如,在下面的示例中,中间一组图像描绘了猫图像的风格转移过程。标记为输出的图像显示了样式图像的纹理和色调如何转移到内容图像的结构上。结果是一种混合,其中猫的轮廓是可见的,而颜色,色调和纹理是显着不同的。
图 5:使用样式转换的三维纹理操作|来源:作者
在上述风格转换和纹理映射原理中发现的过程的基础上,图 5 中的实验试图通过操纵基础图像来扭曲 3D 形式。通过在基础纹理图像上运行风格转换,并将其映射回胸部。与原始半身像相比,生成的网格在特征和分辨率方面有所损失,同时创建了新的细节和折痕。在我制作 Dreamscape 的早期,我试图在这个基本测试的基础上,探索风格转换如何被用来扭曲来自谷歌街景的数据。
方法:创造性人工智能中的实验
虚构的世界和景观作为建筑投机和游戏的背景。在某些情况下,精心设计的世界被忽略了,通常是为其他行为和交互提供和创建沉浸式环境。在某些情况下,它们设计得如此之好,以至于它们看起来和感觉上都像我们自己的环境,通过用户的动作成为无缝集成虚拟和现实的空间载体。随着大量数据被收集并输出到公共领域,我们探索其潜力;从二维图像平面,扩展到使用人工智能的第四维模拟。
等等,他是说第四维吗?这是真的吗?
—本实验中的第四维指的是时间、空间、生长和/或运动。
在过去的几年里,人工智能研究的快速发展导致了新平台的出现,这些平台提供了用户友好的机器学习工具。像谷歌 Colab 这样的平台和像 RunwayML 这样的预包装软件解决方案,使得探索人工智能创造性方面的能力变得简单得多。在这项调查中,我探索了展示创造性人工智能潜力的四种方法:
(1)探索图像生成的风格;
(2)梦境生成器——虚拟现实中的人工智能测试
(3)虚拟现实中的潜在空间探索
(4)从可视化中提取三维数据的工作流程。
1)使用 StyleGAN 探索二维空间。
在这一节中,我测试了 StyleGAN 来生成独特的、虚构的地图、风景和城市图像。StyleGAN 是一个生成性的对抗网络,它基于在训练图像中发现的特征来构造新的图像
图 RunwayML 上的 style gan |来源:作者
数据集。这是 NVIDIA 团队在 2018 年末创造的一种方法。例如,在来自闪烁的人脸数据集上训练的 StyleGAN 将开始从训练数据集生成具有相似特征的新人脸。然而,来自 GAN 的每个结果都是唯一的,并且与原始数据集中的任何图像都不相同。根据训练数据集的大小,GAN 模型可以产生极其相似和令人信服的结果。目前,在公共领域有许多预先训练的模型,从星云到卧室内部。图 6(上图)显示了一个运行 StyleGAN 的示例,它形成了一个对 10,000 幅风景图像进行训练的模型,从而产生了独特的虚拟世界。一旦经过训练,GAN 就能够在几分钟内创建具有不同相似度的图像(当被赋予所需的处理能力时)。图 6 中 35 幅图像的网格花了 92 秒生成。把新的能力交给数字艺术家,作为探索的工具。
图 RunwayML 上生成的城市景观图片来源:作者
对于观察者来说,GAN 的每个输出都是一幅图像,但是对于机器来说,它只不过是一系列数字,范围从负 1 到 1。这串数字可以保存为一个 JSON 文件。如果我再次通过 StyleGAN 模型反馈相同的字符串,我们将得到相同的图像。当我们编辑字符串并把它放回模型时,我们得到不同的图像。这是通过访问保存在经过训练的 GAN 模型的潜在空间中的信息来完成的(我将在下面进一步解释潜在空间)。因此,如果组成我们图像的这串数字以小步骤递增地编辑并反馈到系统中,那么结果图像将与原始输出相似,而如果我们显著地改变变量串,则输出将完全不同。我们可以使用 P5 (处理的的在线版本)自动调整变量字符串,并在 RunwayML 中运行它。逐步改变变量将有助于生成具有相似特征但仍然独特的图像,当输出以视频格式排列在一起时,它为我们提供了一系列连续的视觉效果。一幅图像与另一幅图像融合在一起,形成了一个无缝而美丽的转变。这种形式的输出基于对潜在空间的插值过程。
插值,那是什么?
源自数学,插值是两个数据点之间的一种估计,并在它们之间创建一个平均数据点。在计算机图形中,这被用作在两个关键帧之间创建填充帧的一种方式。通常用于提高帧速率,使用半自动处理。
图 8:潜在空间的插值。来源:黑客月潜在空间可视化
潜伏空间 ,那是什么?
潜在的定义意味着隐藏。潜在空间压缩数据的可视化。压缩的可视化发生在神经网络的各层内,在学习过程中提取维数减少的表示作为特征。我把它想象成 GAN 的记忆库,我们通过编码和解码来访问它。它是“空间”的想法很有趣也很重要,正如在上面的实验中所看到的,具有潜在空间的相似物品被放置得更近,而不相似的物品被放置得更远。重要的是要记住(不)相似性是 GAN 从训练数据集中学习到的结果,对我们来说似乎显而易见的东西对训练的模型来说可能不是。
图 9:卷积神经网络的描述。来源:Hackernoon 潜在空间可视化。
回到实验,图 10(下图)中的结果显示了插值是如何帮助探索潜在空间的。随着视频的播放,新的形式从旧的形式中涌现出来,并随着时间逐渐变化。最终的架构建立在自身之上。这个场景有一种统一和发展的感觉,随着逻辑的建立而扩展开来。新的空间从空间中出现,展示了过多的构造可能性。从白天到夜晚,从亮到暗,从行驶的汽车的窗户里,景色不断变化。奇异的图像被赋予生命,不再是一次性的;而是一个超越静止的连续体,进入一个具有多重空间可能性的新的维度领域。坚持维度的想法,下一个测试通过在 3d 环境中测试 StyleGAN 来进一步探索前景。
图 10:城市景观生成|来源:作者
2)将人工智能带入虚拟现实——梦境创造
利用 StyleGAN 和潜在空间,项目的下一阶段导致了使用可用的人工智能工具创建沉浸式体验的探索。像虚幻引擎和 Unity 这样的软件是为虚拟现实生成和可视化空间而设计的。作为起点,原始数据来自谷歌街景,下载 360 度的图像,这些图像将构成可视化的基础。该图像通过 StyleGAN 进行处理,旨在在 Oculus、HTC Vive 或谷歌 DayDream 等沉浸式浏览器中体验。我们将使用上面讨论的沉浸式组件作为一种方式来测试如何使用潜在空间的插值来模拟运动的假设。
图 11:曼哈顿上的球形图像|来源:作者
为了探索在沉浸式环境中查看这些图像这一看似简单的任务。当我们开始实验时,一些挑战出现了。首先,球形图像的纵横比是 2∶1。而大多数预训练模型的比例为 1:1(通常为 512 X 512 像素或 1024 X 1024),或 4:3(高清比例)。重要的是要注意,当一个人训练新模型时,它们是建立在现有模型之上的。这个过程被称为迁移学习。它有助于节省时间和处理能力,与训练一个全新的数据集相比,它减少了四分之一。图像上的鱼眼失真也是一个挑战,对用户来说不是很大,因为我们知道这是一个展开的图像,但对机器来说更是如此。与深度学习的内在逻辑——模式识别与特征提取*——*不懂失真。这限制了工具集的当前功能。然而,通过一些变通办法,我们可以回到手头的任务,在虚拟现实中探索 StyleGAN。
dreamscape——一个导航谷歌街景数字化现实的工具,可以选择不同的风格来变形和改变背景。
图 12:梦景演示:曼哈顿|来源:作者
我们使用一种被称为盒子投影的技术,一种打破我们特殊图像的过程。用最简单的话来说,想象你(观众)在一个盒子里,如果一个图像被投射到盒子的所有侧面,在角落里是无缝和不间断的,我们可以想象整个空间是连续的。使用这种盒子投影技术,我们能够继续并检验假设。使用这个工作流程,我为 Dreamscape 创建了原型。一个导航谷歌街景的数字化现实的工具,能够选择风格来变形和改变上下文。在上面的演示中,(图 12)观众从投射的现实进入一个虚构的世界。他们轻松地从一个地方移到另一个地方。在下一个实验中,我们将前两种技术结合起来,创造一个能够动态变化的梦境。
图 13: Dreamscape 工作流程
图 14:植物生长时间周期|来源: Tarninabarn
3)虚拟现实中的潜在空间
本节探讨在 VR 中使用插值的潜力。这样做的潜力是将身临其境的环境带入生活。它可以用来模拟时间的维度和/或模拟运动。通过改变我们看到的图像来改变视觉空间。这方面的一个简单例子可以在左边的延时 gif 中看到。植物的生长赋予我们所看到的形象以生命。
为了开始测试这个假设,我们首先创建我们的盒子投影图像。我们训练 styleGAN,并从所述图像开始创建插值,并对它们进行操作。有了合适的设备和实时渲染功能,我们可以使用 Unity 构建一个系统,并指定触发器(如头部的移动)来开始和暂停插值。一个有待未来实验检验的概念。但是现在,下面的下一个方法将探索从这个维度空间中提取正式数据的能力。
4)从维度空间提取三维数据。
到目前为止的探索集中在与背景相关的问题上。这个实验试图使背景生动起来,并利用产生的数据。为了占据这些数据并在游戏空间和建筑设计中探索它,下面的实验推测了从潜在空间提取 3-D 信息的方法。如果掌握了,这将是在短时间内创造大量虚拟空间的强大工具。使用像边缘检测、分割和特征识别(如下所述)这样的工具,我形成了操纵基本三维几何图形所需的输入。我推测一个工作流程,将导致从潜在空间的三维形式的创作。
图 15:3d 数据提取的 Dreamscape 工作流程
深度分析:
在 3-D 计算机视觉中,深度图是一个图像或图像通道,它包含与场景对象的表面离视点的距离相关的信息。深度分析成为一个使用 AI 投射到图像中收集信息并从中创建深度图的过程。对于包括场景理解和重建在内的许多应用来说,这是一个基本的过程。在这个实验中,它帮助创建一个给定图像的空间层次。分割出前景和背景,有助于创建过程中的第一步。
图 16:左起—原始图像,深度分析,边缘提取|来源:作者
细分:
分割是识别给定图像中不同元素的过程。例如,检测建筑物、狗、人类,在它们周围创建轮廓,并将其分离出来。它是对象检测和边缘分析的结合,帮助我们分解图像的组成部分。
图 17: DeepLab V3 图像分割|来源:谷歌公司。
特征识别:
与分割类似,特征识别分解并识别图像中的元素。在这种特殊情况下,它进一步分解了已识别的元素,例如在建筑物分离出窗户、门和墙的情况下,为我们提供有关特征的形式和位置的特定信息。
图 18:立面提取|来源: Wolff,Collins &刘
结合这些过程,我们可以收集数据来开始操作基本表单。使用 unity 中的脚本,可以在 3D 空间中重新创建可视化的场景。这对于建筑设计师来说是一个有用的工具,是推进设计的投机过程之后的下一步。
结果
上述实验有助于分解从 2D 图像移动到人工智能工具生成的潜在空间的方法,特别是 StyleGAN。超越平坦的 2D 平面有助于打开使用这项技术可以实现的新的可能性。利用框映射技术,在 VR 中实现 StyleGAN 的沉浸式体验是可能的。它有助于产生我称之为梦境的东西,一个从现实世界数据中诞生的看不见的世界。
这些实验确实暴露了一些限制,首先也是最关键的限制是处理能力。为了实时运行这样的梦境*,需要巨大的处理能力,但随着技术的进步,这将变得更加可行。输出的分辨率和清晰度将是第二个障碍,但这也与处理能力和预训练数据的处理有关。这就把我们带到了策展的第三个问题,一个更容易解决的问题,策展在这种情况下也与我们可以接触到的风格数量有关。如果你有 10,000 张以上的图片,就有可能创造新的风格和训练一个 GAN。这是可能的,但是需要处理时间和大量的精选训练数据。也就是说,这项技术的可能实现范围很广。他们从讲故事的新的创造性形式到建筑思考,以及游戏图形仅仅是个开始。在下一节中,我将讨论这些可能性,同时思考当前的趋势和已经在使用类似技术的例子。*
结论和未来的可能性
2016 年,一个程序团队创造了一款名为 无人天空 的游戏,这是一款程序生成的游戏,诞生于 60 万行编造行星、宇宙和星系的代码。玩家被丢到其中一个星球上,那里有 18,446,744,073,709,551,616 个独特的星球可供探索。玩家在游戏中的唯一目的就是探索那些植物。
图 19:无人区|来源:Hello Games
无论玩家在哪里,他们总是在中心,即使有大约 18 万亿个行星;游戏只渲染玩家的周围环境,因此除非有人类见证,否则什么都不存在。无人的天空的强大之处在于,它不仅是一个生成性的人工智能,而且突出了用户/观察者/观众的重要性。
人工智能是一种工具,有可能在我们的一生中彻底改变设计和艺术的过程,然而,它也可以只是作为一种代理人来帮助我们进行思考和创造。Dreamscape 是一个工具,让用户能够根据个人喜好控制图形——增强游戏和其他数字化现实的体验*。在论文的最后一部分,我探索了作为游戏设计师和建筑师代理人的梦境的含义。*
“人工智能是一种工具,有可能在我们的一生中彻底改变设计和艺术的过程,然而,它也可以被用作一种代理,帮助我们进行推测和创造。”
游戏设计:
人工智能在游戏设计中的应用非常丰富,从机器生成的世界到通过前卫渲染模块可视化的新故事体验。使用计算机视觉中的深度学习将运动数据从物理模型移植到虚拟模型上得到很好的研究。而甘的探索则让游戏角色的开发利用了迁移学习(比如甘生成了动漫人物)。现在,深度学习的新领域显示了在完整的游戏环境中风格转移的潜力。其示例见 Chintan Trivedi 的演示,用于将堡垒之夜转换为 PUBG 。为游戏提供不同的图形包供用户选择,并赋予用户自己定制的能力。
图 20:将堡垒之夜变成 PUBG |来源: Chintan Trivedi
人工智能的另一种可能性是作为一种手段,从现实世界中产生新的看似熟悉的背景。如果我们在 Dreamscape,的第一次实验中切换输入和输出,我们可以开始将游戏中的背景变成用户已知的设置/位置。例如,想象一下玩一个类似 GTA 的游戏——你体验的不是洛斯桑托斯,而是达拉斯、迈阿密或纽约。把的潜在空间插值成的组合的自有一套可能性。它们可以成为创造不断变化的背景的一个不可或缺的工具,从而产生永无止境的自我生成游戏的可能性。游戏中的背景可能会变得动态——根据玩游戏的用户的行为和性格而变化、学习和发展。在虚拟现实中,插值提供了模拟成长的可能性,甚至可能是时间和运动的元素。这些例子指向了对视频游戏中渲染模块的重新评估,我们可能会脱离传统方式,进入一个人工智能作为渲染代理的世界,根据用户的需求和心情召唤出实时渲染。
图 21:梦境|来源:作者
建筑和城市化:
在建筑和城市规划中,GANs 的使用为思考和实践开辟了新的方法。他们正在变成设计的创意代理人和助手。使用预先训练的 GAN 模型,人们能够快速呈现出数百个具有特定风格和类型的选项。并且通过在潜在空间上的插值,可以进一步开发和探索那些方案。这并不局限于城市景观或门面。例如,图 22(如下所示)描述了一个 GAN 改造现有平面图的可视化。机器通过各种可能性运行,而设计师则被留下来管理输入并选择最成功的迭代。**
图 22:甘生成的平面布置图|来源:作者
在这篇论文的前面,人工智能的其他建筑机会被回避使用 Dreamscape 。梦景、(顾名思义)、的最初应用是帮助人们梦想新现实的可能性。它的目的是帮助想象和推测超越当前的世界和条件。梦想或想象是走向改变的第一步。梦想和想象变化是一种奢侈,大多数人都没有,但一旦他们可以想象,它就进入了可能性的领域。Dreamscape 是一个工具,让人们、社区和设计师能够推测新的可能性,想象现有环境之外的变化,希望能够想象出不同的未来。随着 VR + ML 的出现,建筑师和人们将能够参与完全沉浸式的设计可视化,这将快速生成并实现。他们将能够提供与类型和风格相对应的输入,同时能够在 VR 环境中以一对一的比例可视化结果。
这项调查让我进一步探索人工智能创造新世界的能力。在创造性人工智能的可能性领域,我们仅仅触及了表面。使用插值作为工具探索潜在空间的研究似乎很有希望。GAN 的隐藏层和压缩的潜在空间是如何被进一步访问和创造性地使用的,这将是令人着迷的。以及虚拟现实在未来为创造性人工智能打开的大门。
文献学
提及次数:
达纳·卡沃斯(Dana Karwas)耶鲁大学艺术与媒体合作中心主任
鲍比·贝里耶鲁大学艺术与媒体合作中心 (CCAM)创新研究员
耶鲁大学数字人文实验室的实验室经理凯瑟琳德罗斯 。
道格拉斯·杜海姆 ,耶鲁大学数字人文实验室的全栈开发者。
同学们,机械神器——2020 年春天,耶鲁大学