80 行环游世界
使用 Python 和 Shapely 进行全球地理空间分析
处理穿过反子午线(又名 180 度经线或国际日期变更线)的有问题的现实世界几何图形(多边形)
得益于物联网、运输、物流和气候/地球科学领域新发展的激增,越来越多的数据分析师/科学家(通常熟悉 Python 生态系统)正在将地理空间分析纳入他们的问题和工作流程。
虽然流行的 Python 库,如 Shapely 或 GeoPandas,通常都是开箱即用的,但我现在遇到了几个例子,人们在使用笛卡尔坐标系时经常会遇到问题。特别是,如果一个多边形穿过反子午线(又名 180 度经线) :
- “我的多边形在我的可视化/地图上看起来像一团乱麻!”
- “我的地理空间谓词/操作(例如包含、交集等。)失败"
- “我不知道怎么/懒得把这个吓人的多边形分割开来”
棘手的多边形[Image by pawa rit Laosunthara]:甚至可能在视觉上看起来很好,但进一步的地理空间操作很可能会向南***(双关语)***
你并不孤单。事实上,即使是官方的 GeoJSON 标准也认识到了这个问题,并提倡沿着反子午线分割几何图形。虽然分割一个线串应该足够简单,但对于挑战多边形来说,这可能并不简单:
- 多次来回穿越反子午线
- 包含孔或内环(即不只是简单的实心形状)
- 会分裂成两个以上的组成部分
放心吧——确实有几种工具可以解决这个问题。然而,我将介绍一个精简的、可访问的 Python 实现,它只需要 80 行代码…不包括文档字符串😅
TL;DR — 这是我对多边形反子午线分裂的实现(最后的片段也在文章的最后提供)。
让我们来看物理
正如本文标题中提到的,我们将利用 Shapely 来解决这个问题最核心的方面。因此,任何几何构造最终都应符合 Shapely Polygon API 规范。
下面是一个输入 GeoJSON(作为一个 Python 字典)的例子,它将被提供给最终的split_polygon
函数(参见本文底部):
我们还应该提出一些实际的假设:
- 如果两个连续点之间的纵向距离超过 180 度,那么我们假设反子午线被穿过。
- 我们假设两个连续点之间的纵向距离总是最小的。例如,[-179,0]到[179,0]表示纵向距离为 2 度,而不是 358 度。
- 我们假设感兴趣的多边形的跨度小于 360 度(即不会环绕整个地球)。这个要求是由于对 Shapely 的分割操作的可接受类型的约束。
步骤 1:检测反子午线交叉
根据上面的假设 1,我们可以编写一个超短函数来检测反子午线是否交叉。该功能将应用于 每个多边形环的连续坐标对。
步骤 2:将顶点移动到笛卡尔空间⬅️ ➡️
对于每个环的每个坐标:如果检测到交叉,我们现在基于假设 2 执行 移位以确保连续顶点之间的纵向距离总是最小。在这个新的移位空间中,我们可以设置范围[-180,+180]之外的 x 坐标(即移位经度)。下面是基本的,* 不完整的* 骨架:
小心,小心:如果一个多边形的边界(外壳)穿过反子午线并因此移动,但是任何内环不包含任何交叉点,那么移动后的几何体可能会以损坏或无效而告终。
理想的视觉表现[ 我法师由帕瓦里·劳孙塔拉]使用:https://geojson.io/
如果在没有任何修正的情况下执行移位,则会导致损坏
为了解决这个问题,我们需要跟踪外壳的边界。在对每个内环执行步骤 2 后,如果相应环的任何坐标仍然位于外壳的边界之外,则必须首先对整个环应用+/- 360 度的 x 分量校正。随后,我们现在可以注意到**(移位)环是否与线x = -180
或x = 180
重叠。本质上,这一行将作为我们的。**
第三步:拆分✂️并翻译🔙至经度、纬度
在所有这些转变之后,我们现在可以:
- 用我们的移位环在笛卡尔空间中实例化一个形状优美的多边形
- 让刀来做工作 : Shapely 会自动用对应于反子午线的适当线串来分割我们的良好成形的多边形。注意: Shapely 的分割器只能使用笛卡尔几何进行插值,不能使用测地线。
- 将生成的几何图形转换回有效的地理空间坐标
…我们完成了!(代码见下面的要点)
成功分割后的示例结果[Ipawa rit Lao sunthara 的法师]
裹住-起来
希望本演练和下面的实现对您有所帮助。如果您有任何疑问、反馈或问题,请随时通过 LinkedIn 与我联系。感谢您的宝贵时间!
Python 的最终实现
常见问题/议题
- https://github.com/Toblerity/Shapely/issues/495
- https://GIS . stack exchange . com/questions/226605/shapely-polygons-crossing-the-anti meridian
- https://GIS . stack exchange . com/questions/95990/split-a-polygon-that-crossed-international-date-line-arcpy
替代工具/实施
- https://www.gplates.org/docs/pygplates/generated/pygplates.DateLineWrapper.html
- https://github.com/briannaAndCo/Leaflet.Antimeridian
在 MATLAB/Octave 中高效循环
作者图片
数组顺序和 permute()函数
在 MATLAB/Octave 中循环数据时,数组顺序是一个重要的考虑因素。选择循环哪个维度实际上会对计算效率产生重大影响。在本教程中,我介绍并说明了数组顺序的概念,创建了一个简单的实验来演示循环时数组顺序的影响,并解释了如何使用 MATLAB 中的 permute() 命令来编写高效的循环。
所有例子的源代码都可以在 GitHub 库中找到。
数组顺序
在处理多维或 N 维(ND)数组时,了解数据在内存中的存储方式非常重要。这被称为数组排序。有两种通用约定:行优先和列优先排序。这两种不同的方法仅仅是指 ND 数组中的哪些元素在内存中是连续的,以及如何对这些数组进行线性索引。在列优先顺序中,列的元素在内存中是连续的。按照行优先的顺序,行的元素在内存中是连续的。所以基本上,我们对列主要的元素按列计数,对行主要的元素按行计数。
下面的代码片段显示了一个 3 x 3 矩阵的示例,其中每个元素都显示了线性索引是什么。同样,你可以把矩阵中的数字看作数据在内存中的顺序(例如 1 是第一个内存地址,2 是第二个内存地址,等等)。
colMaj = [ 1, 4, 7; 2, 5, 8; 3, 6, 9 ];
disp( colMaj )
1 4 7
2 5 8
3 6 9
rowMaj = [ 1:3; 4:6; 7:9 ];
1 2 3
4 5 6
7 8 9
disp( rowMaj )
通过使用“:”操作符,我们可以很容易地看到 MATLAB 是如何存储数据的,这个操作符将打开数据。由于 MATLAB 是以列为主的,您可以看到 colMaj 矩阵以正确的顺序返回索引,但是 rowMaj 矩阵以无序的顺序返回元素。
disp( colMaj(:) )1
2
3
4
5
6
7
8
9disp( rowMaj(:) )1
4
7
2
5
8
3
6
9
为了使这一点更清楚,我们可以建立一个简单的动画。动画展示了如何使用这两种惯例展开矩阵。底部的线性索引显示了各个元素在内存中的实际存储方式。
作者图片
数据循环
那么为什么数组顺序很重要呢?当你在数据上循环时,数组顺序实际上对运行时间有很大的影响。访问内存中连续的数据要高效得多。因此,了解我们的数据在内存中是如何组织的,也可以帮助我们编写计算效率更高的代码。
让我们用一个简单的例子来说明这一点。假设我们有一组想要操作的图像。这些图像的大小为( nX , nY )像素,我们的数据集中有 nI 个图像。这些图像在内存中可能有两种排列方式:[ nX , nY , nI 或[ nI , nX , nY 。在第一方向中,图像将在存储器中连续排列,而在第二方向中则不是这样。
为了了解数组顺序会产生什么样的差异,我们可以编写下面的测试代码。注意, tic() 和 toc() 函数允许我们对部分代码执行进行计时。如果您不熟悉此功能, tic() 实际上启动了一个定时器,而 toc() 记录了自您启动定时器以来已经过了多长时间。您可以在 MATLAB 帮助中找到更多文档。
% Arrange images at the first two dimension
imageData = randn( nX, nY, nI );
a = tic();
for ix1=1 : nI
thisImg = imageData( :, :, ix1 );
end
et1 = toc( a );% Arrange images at the last two dimensions
imageData = randn( nI, nX, nY );
a = tic();
for ix1=1 : nI
thisImg = imageData( ix1, :, : );
end
et2 = toc( a );% Plot the results
fprintf( 'Looping over the last dimension: %0.4f seconds\n', et1 );
fprintf( 'Looping over the first dimension: %0.4f seconds\n', et2 );
fprintf( '%0.1f factor increase\n', et2/et1 );
为了说明数组顺序的影响,代码运行时使用了 nX = nY = 128 和 nI 取值 1000、10000 和 50000。鼓励勇敢和好奇的人下载源代码,尝试更多有趣的组合!
从 1,000 幅图像开始,我们可以看到数组顺序似乎没有太大的影响,但是,运行时间仍然有大约 10%的增加。
Looping over the last dimension: 0.8328 seconds
Looping over the first dimension: 0.9570 seconds
1.1 factor increase
将图像的数量增加到 10,000,我们开始看到运行时间有了很大的不同。当图像不是连续存储在内存中时,运行时间会增加 2.4 倍。
Looping over the last dimension: 0.9039 seconds
Looping over the first dimension: 2.1613 seconds
2.4 factor increase
进一步将图像数量增加到 50,000,我们继续看到运行时间的更大增长。现在运行时间增加了 8 倍!
Looping over the last dimension: 1.2299 seconds
Looping over the first dimension: 10.3527 seconds
8.4 factor increase
需要注意的是,这是一个简单的例子,只有一个循环和三个维度。对于多维数组或者嵌套多个循环时,这种影响实际上会更糟。有时,在代码中添加一些 tic() / toc() 调用,或者运行 Profiler 来更新代码是值得的。
MATLAB 中的 Permute()
MATLAB 包括一个名为 permute() 的函数,它是转置函数的一个推广,但用于 ND 数组。 Permute() 接受一个 ND 数组和所需的数组顺序,然后返回重新排列的数据。语法是这样的: newArray = permute( oldArray,[oldDim1,oldDim2,oldIm3 等…] )。在该语法中,变量 oldDim# 表示旧数组的数组顺序索引,函数输入中的位置表示新数组顺序位置。
例如,假设我们有一个形状为[200,450,120,680]的 ND 数组, A ,我们这样调用 permute()函数: B = permute( A,[3,1,4,2])。数组 B 的最终形状将是[120,200,680,450]。这里,我们将维度 3 移至维度 1,维度 1 移至维度 2,维度 4 移至维度 3,维度 2 移至维度 4。
使用 permute() 函数,我们可以根据我们想要循环的维度重新排列任意的 ND 数组。回到我们之前的图像示例,我们可以使用形状为[ nI,nX,nY ]的数组 imageData ,并通过使用以下命令将其重新排列为形状为[ nI,nX,nY ]的数组。
imageData = permute( imageData, [ 2, 3, 1 ] );
这将允许我们在最后一个维度上循环,我们刚刚展示了它的计算效率。将这一简单的行添加到我们之前的示例中,我们可以重新运行我们的测试。更新后的代码将如下所示。
% Arrange images at the first two dimension
imageData = randn( nX, nY, nI );
a = tic();
for ix1=1 : nI
thisImg = imageData( :, :, ix1 );
end
et1 = toc( a );% Permute data before looping
imageData = randn( nI, nX, nY );
imageData = permute( imageData, [ 2, 3, 1 ] ); % loop over the last dim
a = tic();
for ix1=1 : nI
thisImg = imageData( :, :, ix1 );
end
et2 = toc( a );% Plot the results
fprintf( 'Looping over the last dimension: %0.4f seconds\n', et1 );
fprintf( 'Permute and loop over the last dimension: %0.4f seconds\n', et2 );
fprintf( '%0.1f factor increase\n', et2/et1 );
使用 nI = 50,000 运行该实验,会产生以下输出。
Looping over the last dimension: 1.0844 seconds
Permute and loop over the last dimension: 1.1350 seconds
1.0 factor increase
使用 permute() 命令大大减少了循环时间。当然,使用 permute 函数会有一点点开销,但是在几乎所有的实际情况下,最好包含它。正如我前面提到的,对于高维数组和嵌套多个循环时尤其如此。
摘要
在本教程中,我们讨论了在 MATLAB/Octave 中循环 ND 数组时数组顺序的重要性。使用一些简单的 MATLAB 代码,我们展示了循环访问内存中连续数据的好处。我们进一步展示了 permute() 命令允许我们在循环之前重新排列数组的维数,这样我们就可以始终确保循环是高效的。
以下是需要记住的几点:
- 在 MATLAB 中,数据是按列主顺序排列的
- 我们应该总是在最外层的维度上循环,以使我们的循环尽可能高效。
- 可以在任何循环之前(和之后)使用 Permute() 来确保我们高效地循环 ND-数组。
- 对于嵌套循环,最里面的循环应该在最外面的维度上循环。
编码快乐!
用 Python NumPy 进行面向数组的编程
再见平原,老 For-loops!你好 Numpy 数组!
NumPy 简介
NumPy 是最受欢迎的用于高性能数组实现的 Python 库:数组上的操作比列表上的操作快得多,这在大数据世界中可以放大运行时差异。根据 libraries.io (截至 2020 年 4 月)4K 的图书馆依赖 NumPy,包括最流行的数据科学包,Pandas 和 SciPy。
NumPy 的美妙之处在于它提供了面向数组的编程风格。也就是说,它提供了带有内部迭代的函数式、矢量化操作,而不是使用条件 for 循环(或 n 维时的嵌套 for 循环)来处理数组元素,这使得数组操作更简单、更简洁。
在本教程中,你将发现从初级到高级的所有你需要知道的东西,超过 10 个综合主题。但是如果你是已经进阶的人,不要害怕!您可以 直接跳到最后两个部分(高级 & 专家),在那里将解决数组定向的“症结”以及基本的性能技巧。最后,您将能够将您的过程化编程风格转变为优雅、快速、无循环、基于数组的风格。
我们开始吧。。。
➊ —阵列创建
导入 NumPy import numpy as np
后,我们准备滚动:
一维
我们可以通过传递元素列表来创建数组;本例中的整数:
array = np.array([1, 2, 3, 5, 8, 13, 21])
📌您能在输出中注意到一些有趣的东西吗?
所有逗号分隔的值宽度相同,并且右对齐。由于最大数字 21 占据 2 个位置,所有其他值都被格式化为两个字符的字段。现在你知道为什么在[和 1 之间有一个前导空格了。😏
多维度
我们将创建一个 2 行 3 列的数组,传递两个嵌套的列表,每个列表包含三个元素:
array2x3 = np.array([[1, 2, 3], [10, 20, 30]])
输出的格式基于维度的数量,对齐每行中的列:正如我们看到的,1 和 10 对齐,2 和 20 对齐,等等。
阵列形状
我们可以用shape
属性确定数组的形状,该属性返回一个具有维度的元组:
以及带有ndim
属性的维数(即数组的秩),如下所示:
ndim
与数组形状输出的轴数或长度(len
相同:
元素数量
使用属性size
我们可以得到数组的元素总数:
元素类型和元素大小
由于 NumPy 是用 C 编写的,所以它使用它的数据类型。因此,整数被存储为int64
值——在 c #中对应于 64 位(即 8 字节)整数。
通过访问dtype
属性,确定数组的元素类型很容易:
以及存储每个元素所需的字节数,通过访问itemsize
:
存储容量
内存占用(nbytes
)是元素数乘以字节数。
常见数组
为了用特定的值填充数组,NumPy 提供了三个特殊的函数:zeros
、ones
和full
,分别创建包含 0、1 或特定值的数组。请注意,零和一包含float64
值,但是我们显然可以定制元素类型。
- 0 的 1D 数组:
zeros = np.zeros(5)
- 整数类型的 0 的 1D 数组:
zeros_int = np.zeros(5, dtype = int)
- 1 的 2D 数组(2x 5):
ones = np.ones((2, 5))
- 7 的 2D 阵列(2x 5):
full = np.full((2, 5), 7)
均匀分布的范围
NumPy 为从范围创建数组提供了优化的函数。创建均匀间隔范围的两个最重要的函数是arange
和linspace
,分别用于整数和浮点。
◼️整数:给定区间 np.arange(start, stop, step)
:在半开区间[start, stop)
内产生值,即包括启动但不包括停止的区间。默认start
值为 0,默认step
大小为 1。
- 范围从 0 到 4,增量为 1:
T21 - 范围从 5 到 9,增量为 1:
np.arange(5, 10)
- 范围从 2 到 8,增量为 2:
np.arange(2, 10, 2)
- 范围从 8 到 2,增量为-2:
np.arange(8, 0, -2)
◼️浮点数:给定元素的个数 np.linspace(start, stop, num, endpoint)
:返回num
个间隔均匀的样本,在间隔[start, stop]
内计算。间隔的endpoint
可以选择排除。默认num
值为 50,默认endpoint
为真。
- 5 从 1.0 到 2.0(不包括 2.0)的等间距元素:
np.linspace(1, 2, num = 5, endpoint = False)
- 5 从 1.0 到 2.0(包括 2.0)的等间距元素:
np.linspace(1, 2, num = 5, endpoint = True)
💡虽然我们可以通过将范围作为参数传递来创建数组,但我们总是更喜欢内置函数,因为它们可以优化性能。
随机范围
为了生成随机范围,NumPy 提供了一些选项,但以下是最常用的:
来自[0,1) np.random.rand(d0, d1, ...)
上的均匀分布的◼️随机样本,其中dn
是数组维数:
- 具有 5 个随机样本的 1D 阵列:
np.random.rand(5)
- 2 行 5 个随机样本的 2D 阵列:
np.random.rand(2, 5)
◼️随机整数 np.random.randint(low, high, size)
:返回从low
(含)到high
(不含)的随机整数。如果high
为无(默认),则结果来自[0, low)
。
- 从 1 到 99 的 10 个随机整数:
np.random.randint(low = 1, high = 100, size = 10)
➋ —索引
一维
我们可以使用方括号中的从零开始的索引来引用数组元素,例如在一个五元素数组中,第一个元素由[0]
访问,最后一个由[4]
访问。
也可以通过使用负的索引从末尾访问数组,从最后一个元素的-1 开始。所以在前面的例子中,最后一个元素([4]
)可以用[-1]
访问,它的第一个元素([0]
)可以用[-5]
访问:
所以在这个阵中:
array1D = np.array([0, 1, 2, 3, 4])
我们可以选择第三个元素:array1D[2]
或者从结尾开始:array1D[-3]
多维度
2D 数组可以用这个符号来访问:[row_index, column_index]
。
所以在这个实例中:
array2D = np.array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
我们可以通过array2D[1, 2]
选择第 2 行第 3 列的元素
➌ —切片
使用[first:last]
符号将数组分割成原始元素的子集,这将返回一个包含从索引first
到last-1
的元素的子数组。
→如果省略first
,则假设为 0,因此返回从开始到last-1
的元素。
→如果省略last
,则假定数组的长度,因此返回从first
到末尾的元素。
→如果first
和last
都省略,则返回整个数组。
一维
延续之前的array1D
示例:
- 具有第 2 和第 3 个元素的子数组(从索引 1 到 2):
array1D[1:3]
- 具有前 3 个元素的子数组(从开始到索引 2):
array1D[:3]
- 具有最后 3 个元素的子数组(从第 2 个索引到结尾):
array1D[2:]
- 包含所有元素的子数组:
array1D[:]
多维度
类似的原理也适用于 2D 数组,所以切片使用这个符号:
[row_first:row_last, column_first:column_last]
。
→要选择多行,我们使用:[row_first:row_last, :]
。
→要选择多个列,我们使用:[:, column_first:column_last]
。
承接前面array2D
的例子:
- 从行索引 0 到 1 和列索引 1 到 2 的子 2D 数组
array2D[0:2, 1:3]
- 从开始到索引 2 有多列的子 2D 数组:
array2D[:, :3]
- 从索引 1 到结尾有多行的子 2D 数组:
array2D[1:, :]
- 包含所有元素的子数组:
array2D[:, :]
下一节我们将解释为什么 Numpy 子数组只是视图!
➍ —复印
浅薄的文案/观点
切片不会修改原始数组。新创建的数组使原始元素的 浅 副本(或 视图 )这意味着它复制元素的引用,但不复制它们所指向的对象。
换句话说,对新创建的数组的任何修改也将反映在原始数组中。
这里是一个新创建的有 10 个元素的数组:
originalArray = np.arange(0, 10)
我们通过选择最后 5 个元素来分割它:
subArray = originalArray[5:]
我们通过使用内置的id
函数:
display(id(originalArray))
和display(id(subArray))
,观察到原始数组和切片数组确实是两个不同的对象。
为了证明subArray
与originalArray
查看相同的数据,我们将修改subArray
的第一个元素:
subArray[0] = subArray[0] * 10
然后显示两个数组—原始值也发生了变化:
深层拷贝
尽管浅层副本在共享数据时节省了内存,但有时还是有必要创建原始数据的独立副本。这个操作被称为 深度 复制,在多线程编程中非常有用,在多线程编程中,程序的不同部分可能会试图同时修改数据,这可能会破坏数据。
NumPy 提供了方法copy
,该方法返回一个新的数组对象,其中包含原始数组对象数据的深层副本。
重复前面的示例,我们可以看到,修改子数组时,原始数组没有受到影响。
我们先把originalArray
复制到newArray
:
newArray = originalArray.copy()
然后我们修改第 6 个元素:
newArray[5] = newArray[5] * 10
最后,我们显示两个数组——看看原始数组的值是如何保持不变的?
➎ —元素式操作
NumPy 提供了许多操作符,使我们能够编写简单的表达式来对整个数组执行操作。这是我们以后变得更高级和消除程序中 for 循环的垫脚石!
带标量
我们可以用数组和标量执行基于元素的算术运算。在这些操作中,标量被应用于每个数组元素,所以这个代码片段给每个元素加 5:array + 5
。
每个操作返回一个包含结果的新数组(即不修改原始数组)。
增强赋值修改左操作数中的每个元素。在这个例子中:array += 1
,原始数组的元素现在增加 1。与前面的情况相反,这里没有发生内存分配,因为这种就地操作是首选的。
乘、减、除、取幂和前面的加法一样简单。
📌标量操作是我们将在下一节讨论的最简单的广播形式。
数组之间
我们可以在相同形状的数组之间执行逐元素的算术运算。结果是两个数组的元素组合成一个新的数组。
在本例中,我们有两个数组,每个数组有 5 个元素:
arrayA = np.arange(2, 12, 2)
arrayB = np.arange(0, 5) + 1
当我们添加它们:arrayA + arrayB
时,我们可以看到新的组合数组:
📌请注意,数组乘法不是矩阵乘法。这些元素只是按分量相乘。利用前面的数组,我们可以通过使用dot
函数
np.dot(arrayA, arrayB)
来计算矩阵乘法
比较
当比较两个数组时,我们得到一个布尔数组,其中每个元素为真或假,表示各自的比较结果。
给定两个随机整数数组:
compA = np.random.randint(low = 1, high = 10, size = 5)
compB = np.random.randint(low = 1, high = 10, size = 5)
我们可以检查第一个数组的元素是否大于第二个数组的元素:compA > compB
。
📌为了比较完整的数组是否相等,我们使用了array_equal
函数,如果两个数组具有相同的形状和相同的元素 :
np.array_equal(compA, compB)
,则该函数返回 True
逻辑运算
此外,我们可以通过分别使用logical_or
和logical_and
函数,对数组元素应用逻辑 OR 和 and。
给定两个布尔数组:
logA = np.array([True, True, False, False])
logB = np.array([True, False, True, False])
我们得到:
np.logical_or(logA, logB)
和np.logical_and(logA, logB)
。
通用函数
此外,NumPy 提供了许多独立的通用函数(或ufuncs
)来执行各种元素操作。每个都返回一个包含结果的新数组。
官方文档列出了五个类别——数学、三角学、位操作、比较和浮点。建议快速浏览,这样你就知道什么是可用的。
干得好!你晋级了!
➏ —广播
到目前为止,这些操作需要两个大小和形状相同的数组作为操作数。当阵列的形状与兼容时,广播就放松了这些限制,实现了一些简洁而强大的操作。
较小的阵列在较大的阵列中“广播”。它可以让我们避免循环,也可以创建不必要的数据副本。
基于官方文件:
在两个数组上操作时,NumPy 按元素比较它们的形状。它从 尾随尺寸 开始,一直向前。
两个维度兼容当: 它们相等,或者 其中一个为 1
如果不满足这些条件,抛出*ValueError: operands could not be broadcast together*
异常。
我们将通过几个循序渐进的乘法示例来演示广播的操作原理。很大程度上,较小的数组会“伸展”,以便与较大数组的每一行相乘。
它在内存中不是字面意义上的拉伸;重复的是计算。
说明 1
在本例中,我们有一个 3x3 的表格和一个 1x3 的表格。
ex1A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ex1B = np.array([2, 5, 10])
我们可以观察到广播条件得到满足,并且两个维度是兼容的:
行维度:虽然它们不同(即 3 对 1),但其中一个是 1。
列尺寸:两者相同(即 3)
所以相乘的结果(ex1A * ex1B
)是:
说明 2
在第二个示例中,我们有一个 3x3 的表和一个 3x1 的表。
ex2A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ex2B = np.array([[2], [5], [10]])
同样,阵列是兼容的:
所以相乘的结果(ex2A * ex2B
)是:
说明 3
在第三个示例中,我们有一个 1x3 的表和一个 3x1 的表。
ex3A = np.array([1, 2, 3])
ex3B = np.array([[2], [5], [10]])
同样,阵列是兼容的:
所以相乘的结果(ex3A * ex3B
)是:
不相容尺寸
在本例中,行数不同(即 3 对 2),并且都不是 1。
同样,倒数第二个尺寸不匹配:
➐——塑造操纵
了解播音之后,另一个重要的概念就是操控造型。让我们来看看一些技巧:
使再成形
通常的做法是创建一个 NumPy 数组作为 1D,然后再将其整形为 multiD,反之亦然,保持元素总数不变。
📌reshape
返回一个新数组,它是原数组的浅副本。
这是一个有 9 个元素的 1D 数组:array09 = np.arange(1, 10)
。
我们可以将其重塑为一个 3x3 的数组:array09.reshape(3, 3)
。
或者作为 9x1 数组:array09.reshape(9, 1)
。
调整大小
如果我们需要改变元素的总数,那么我们需要调整数组的大小。如果我们扩大它,它将添加尾随零,直到它达到新的大小。否则,它将被截断为新的大小。
📌resize
修改了原来的阵列。
继续这个例子,我们可以将 9 元素数组扩大到 15 元素:
array09.resize(15, refcheck = False)
。
或者我们可以将其截断为 5 个元素:
array09.resize(5, refcheck = False)
。
📌扩大数组的另一个期望行为是让它重复自己,直到它达到新的大小。在这种情况下,我们可以使用resize
的“静态”版本,它将原始数组作为输入:
np.resize(array09, 10)
新维度
在数组中插入一个新轴会增加数组的维数。newaxis
通常用于使阵列兼容广播。
在本例中,我们将了解如何将一个单行表格转置为一个单列表格:
array1x4 = np.array([1, 2, 3, 4])
print(array1x4)
print(np.shape(array1x4))array4x1 = array1x4[:, np.newaxis]
print(array4x1)
print(np.shape(array4x1))
很整洁,对吧?
变平与变松
展平是整形的逆操作。我们可以用方法flatten
和ravel
将多维数组展平成一维。方法flatten
deep 复制原始数组的数据,而ravel
shallow 复制它,[这样展平比较慢]。
下面是一个 2x2 的数组:array2x2 = np.arange(1, 5).reshape(2, 2)
。
我们将它展平—深度复制:array2x2.flatten()
然后迅速重新设置为 2x2: array2x2 = array2x2.reshape(2, 2)
然后再解开——浅抄:array2x2.ravel()
移项
转置一个数组,也就是改变它的维度(意味着把它的形状从(X,Y)
变成(Y,X)
)也非常简单。
📌transpose
返回一个新数组,它是原数组的浅副本。
下面是一个数组:
toBeTransposed = np.arange(1, 5).reshape(2, 2)
这里是它的转置副本:
toBeTransposed.transpose()
加入
连接或串联意味着将两个或多个数组的内容放在一个数组中,沿着指定的轴,将它们“堆叠”在(axis = 1
)下面或(axis = 0
)旁边。有几个选项可以做到这一点,但concatenate
功能是最受欢迎的。
这里有两个 3x3 数组,arr1
和arr2
:
arr1 = np.arange(9).reshape(3, 3)
arr2 = arr1 * 2
◼️垂直拼接【行式|轴= 0】 np.concatenate((arr1, arr2))
◼️水平串联【列式|轴= 1】 np.concatenate((arr1, arr2), axis = 1)
裂开
拆分是连接的反向操作,即我们将一个数组的内容沿着指定的轴拆分成多个子数组。
我们可以将它们拆分成相同形状的数组,或者指示位置,在此之后应该进行拆分。
使用这个九元素数组(arr3
),我们将看到这两种变化(在axis = 0
上):
◼️均匀分割 np.split(arr3, 3)
将产生 3 个大小相等的子阵列:
◼️不均匀分割,基于一维数组 np.split(arr3, [2, 7]))
中指示的位置,将产生 3 个子数组,在第 2 个和第 7 个元素之后分割:
'Map, Filter and Reduce' are paradigms of functional programming. They allow us to write simpler, shorter code, without needing to bother about for-loops or if-else branching. Even if they are powerful on their own, 'the cherry on top' is that they can be chained together.The next three sections will cover **exactly that**, when it comes to NumPy arrays.
➑ —制图
为了将转换应用到 NumPy 数组中,我们将使用vectorize
函数。返回一个新数组,映射生效。
下面是一个简单的数组:
toBeMapped = np.arange(0, 10)
我们现在将通过传递一个 lambda 匿名函数使数组的所有元素加倍:
np.vectorize(lambda x: x * 2)(toBeMapped)
如果我们有一个更复杂的计算(有许多行代码),我们可以传递一个函数来代替。
📌根据文档,“提供[vectorize](https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html#numpy.vectorize)
功能主要是为了方便,而不是为了提高性能。该实现本质上是一个 for 循环。然而可读性是这里的关键,所以尽管它使用了 for 循环,但我们的代码没有!
➒滤波
Filter,用一元谓词测试每个元素。NumPy 为此提供了extract
函数。满足谓词的元素被保留;不符合的将被删除。返回一个新数组;过滤器不会修改原始数组。
下面是我们的示例数组:
toBeFiltered = np.arange(0, 9).reshape(3, 3)
我们要选择奇数:
np.extract(toBeFiltered % 2 == 1, toBeFiltered)
实现相同结果的等效方式如下:
toBeFiltered[toBeFiltered % 2 == 1]
➓——还原
当面对大量数据时,期望的步骤是通过在整个阵列或其一个轴上应用计算来减少维度。
下面是一个 2x3 的数组:
toBeReduced = np.arange(1, 7).reshape(2, 3)
总和
整个数组 toBeReduced.sum()
上的◼️将产生一个代表所有元素之和的标量:
◼️按列[axis = 0] toBeReduced.sum(axis = 0)
将产生一个 1x3 数组,其中每个元素是各自列的总和:
◼️按行[axis = 1] toBeReduced.sum(axis = 1)
将产生一个 3x1 的数组,其中每个元素是各自行的总和:
其他削减
他们都以同样的方式工作。例如:
◼️最小/最大值 toBeReduced.min()
和toBeReduced.max()
◼️其他
t27】另外两个重要的类别包括:
我建议你浏览一下,然后边走边学。
我的赞美!你已经准备好为一个骰子叫牌了!
NumPy 性能提示和技巧
为了优化程序的性能,我们要做的第一件事就是将计算或内存分配移到 for 循环之外。我们已经介绍了很多关于 NumPy 技术的材料,但是让我们提炼这些技巧和诀窍,并使它们变得清晰,以帮助您编写更高性能的代码。
1️⃣ —矢量化
矢量化是以元素方式处理整个数组的操作。它们将 Python 的显式 for 循环转化为隐式、低级、优化和编译的 C 实现,因此您应该更喜欢它们。
2️⃣ —副本
你应该避免不必要的深层拷贝;尽可能使用浅层副本(或视图)和就地操作。
3️⃣ —广播
在组合数组之前,应该使用广播对尽可能小的数组进行操作;最小的维度在内部被拉伸以匹配另一个维度,但是这个操作不涉及任何内存复制。
4️⃣——记忆
Numpy 数组按行优先顺序存储,即展平的内存是逐行表示的。因此,将数据存储在连续的内存块中可以确保现代 CPU 的架构在内存访问模式和 CPU 缓存方面得到最佳利用。因此,以连续的方式访问或遍历一个数组比随机访问要快得多,所以你应该明智地选择如何在 n 维中表示数据。作为一个说明性的例子,沿行对元素求和比沿列快。
5️⃣ —函数阵列编程
你应该使用 Map、Filter、Reduce 来避免 for 循环和条件编程。
精彩!你坚持到了最后!
推荐阅读
- 100 Numpy 演习
- 真正的 Python:用 NumPy 进行数组编程
- NumPy 数组:高效数值计算的结构
**** ****必读 ******** - 科学讲座:高级数字
- 美丽的代码【论文 19:‘Numpy 中的多维迭代器’】
收场白
我希望 NumPy 的强大和它所带来的灵活性能让你有所启发。现在,您已经具备了帮助您优化代码性能并尽可能消除 for 循环所需的知识和技能。你需要做的就是:
练习——练习——练习!
感谢阅读!
我经常在媒体上写关于领导力、技术&的数据——如果你想阅读我未来的帖子,请‘关注’我 !
(艺术)智力。新的创造性人工智能。
人类的创造力是唯一永不停止创造事物的机器。但是人工智能会变得“有创造力”吗?
“你能想象的一切都是真实的”——巴勃罗·毕加索
一个人工智能能做很多事情,但它能成为“**创意”**吗?很明显,人类使用人工智能来提高和增强他们作为人类的创造力,然而我问自己的问题是,这种“人机合作”是否有必要存在,以创造真正有价值的令人兴奋的东西。
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
如果你想了解更多,请访问oscargarciaramos.com
如今,认为人工智能完全取代人类创造力是没有意义的。拥有两台如此强大的“机器”而避开其中一台,将是一个绝对的错误。相反,我们应该利用两者所提供的 200%的潜力,这是一个不可替代的可怕组合。
让我们谈谈艺术、音乐、舞蹈、写作……“有创造力意味着热爱生活”,能够自发地产生新的想法或概念。
AI 是否发生在这些领域?还是应该只留给人类?
艺术
《爱德蒙·德·贝拉米的肖像》,一幅人工智能画作,已经以 43.2 万美元的价格售出。它的创造者?一种算法,特别是一种生成敌对网络(GAN ),它被输入覆盖六个世纪的 15,000 个肖像的数据集,以通知其输出。
如果我们谈论爱达呢?“世界上第一个超现实的人形人工智能机器人艺术家”。它配备了眼睛摄像头和机械臂,能够绘画或说话,这要归功于一个名为人在回路或 HITL 的仿真模型。
关于……
音乐
在过去的几年里,人工智能音乐领域的进展迅速加快。
如果我们回到过去,1951 年,艾伦·图灵是第一个用几乎占满整个实验室的机器录制计算机生成音乐的人。
今天使用最多的技术之一是 强化学习 ,这是一种学习歌曲中发现的特征和模式的算法,以复制或模拟某种音乐流派的新歌曲。 谷歌的 Magenta 项目 就是一个例子,一个制作歌曲的开源平台,编写并生成感谢 AI,或者也是 IBM 的索尼 WatsonFlow Machine解决方案。事实上,格莱美提名制作人亚历克斯·达吉德在他的“创作”过程中就依靠了这个工具。
你听说过 AIVA 吗?“人工智能创作情感配乐音乐”被称为“创意人的创意助手”,它允许你根据不同的风格或影响创作音乐:现代电影,电子,流行,摇滚,幻想,等等。
跳舞
在 Peltarion ,一位人工智能(AI)专家兼舞蹈编导是 AI 在舞蹈中应用的一个明显例子。该团队设法创造了一个解决方案,不仅基于学习某种风格的舞蹈,而且专注于创造自己的编舞。它是如何工作的?它由一个名为“chor-rnn”的循环神经网络组成,从 5 个小时的当代舞蹈中获得+1350 万个不同的位置。仅在 48 小时内,他们就取得了第一批成果。
NVIDIA 还能够根据歌曲的风格,跟随音乐的节拍创造新的舞蹈动作。他们使用一个 MM-GAN(生成对抗网络)收集来自芭蕾、尊巴和嘻哈的不同视频。得益于这一解决方案,他们成功生成了 361,000 个剪辑,总共包含 71 个小时的新舞步。
最后…
写作
在我们“创造力”的最后一个领域,我们可以找到我们所谓的自然语言生成(NLG),它包括从数据中创造“叙事写作”。比如美国美联社目前正在使用 AI 撰写数千篇体育报道。
新的网站也出现了,从一个标题生成“独特的”文本,以创建一篇新文章的完整草稿。这个过程很简单:选择一个主题或标题,等一会儿,并采取自动文章作者起草的。不可思议,你不觉得吗?
那么,下一步是什么?
**“人类的创造力”**是唯一永不停止创造事物的机器。
让我们开始与人工智能形成新的合作,创造你以前从未想象过甚至梦想过的东西。不是说 AI 要来取代我们。
不是这样的。
我们不要找借口了。顺其自然,利用新的人工智能能力。
让我们开始创造吧!
欢迎发表评论、鼓掌或分享这篇文章。跟随 me 进行未来岗位。
如果你想了解更多,你可以在oscargarciaramos.com找到我
与+1K 人一起加入我的电子邮件列表,获取更多独家内容
基于不同神经网络的艺术风格转换
模型之间的比较
介绍
艺术风格的转变在于将一幅图像转变成一幅类似于艺术家所画的图像。
如果我们是文森特·梵高的粉丝,并且我们喜欢德国牧羊犬,我们可能会想要一张我们最喜欢的狗的照片,用梵高的星夜时尚来画。
作者图片
梵高《星夜》, 公共领域
生成的图片可能是这样的:
作者图片
相反,如果我们喜欢葛饰北斋的神奈川巨浪,我们可能会得到这样一张照片:
神奈川大浪潮作者葛饰北斋, 公共领域
作者图片
如果我们更喜欢瓦西里·康丁斯基的作品 7,就像下面这幅图一样:
瓦西里·康丁斯基作文 7, 公共领域
作者图片
由于计算处理能力的进步,允许使用更复杂的神经网络,这些图像转换成为可能。
在继续之前,您可能想看看如何在没有任何复杂框架的情况下使用 python 实现一个基本的神经网络点击此处
由一系列卷积矩阵运算层组成的卷积神经网络(CNN)是图像分析和物体识别的理想选择。它们采用了与 Gimp 或 Photoshop 等应用程序中使用的图形过滤器和检测器类似的概念,但功能更强大,方式更复杂。
矩阵运算的一个基本例子是由边缘检测器执行的。它获取一个 n×n 像素的小图片样本(以下示例中为 5×5),将其值乘以预定义的 n×n 卷积矩阵,并获得一个值,该值指示图像的该部分中是否存在边缘。对图像的所有 n×n 部分重复该过程,我们可以生成新的图像,其中我们已经检测到存在于其中的对象的边界。
作者图片
CNN 的两个主要特征是:
- 卷积矩阵的数值不是预先定义的,以找到特定的图像特征,如边缘。这些值是在优化过程中自动生成的,因此它们能够检测比边界更复杂的特征。
- 它们具有分层结构,因此第一层将检测简单的图像特征(边缘、色块等)。)并且最新的层将使用来自先前层的信息来检测复杂的对象,如人、动物、汽车等。
这是卷积神经网络的典型结构:
感谢像马修·d·泽勒、罗布·弗格斯的*“可视化和理解卷积网络”【1】和克里斯·奥拉、亚历山大·莫德温采夫、路德维希·舒伯特的“特征可视化”【12】*这样的论文,我们可以直观地了解 CNN 不同层检测到的特征:
马修·d·泽勒等人的图片*“可视化和理解卷积网络”【1】,授权使用*
第一层检测图像的最基本特征,如边缘。
马修·d·泽勒等人的图片*“可视化和理解卷积网络”【1】,授权使用*
接下来的层结合前一层的信息来检测更复杂的特征,如纹理。
马修·d·泽勒等人的图片*“可视化和理解卷积网络”【1】,授权使用*
下面的层,继续使用以前的信息来检测重复模式等特征。
马修·d·泽勒等人的图片*“可视化和理解卷积网络”【1】,授权使用*
最新的网络层能够检测复杂的特征,如对象部分。
马修·d·泽勒等人的图片*“可视化和理解卷积网络”【1】,授权使用*
最终层能够对图像中存在的完整对象进行分类。
检测复杂图像特征的可能性是对这些特征执行复杂变换,但仍然感知图像中相同内容的关键使能因素。
独立图像优化
关于艺术风格转移的最重要的论文之一是由 Leon A. Gatys、Alexander S. Ecker、Matthias Bethge 撰写的“艺术风格的神经算法” [2]。
它的主要发现是,自然图像的 内容 及其 风格 可以彼此独立地分离和处理,这允许我们从经典艺术绘画中“提取”风格并将其应用到我们自己的图像中。
这里讨论的许多其他神经类型转移模型采用了这一思想,并用更快和更复杂的网络扩展了它,但仍然使用这一基础。
Gatys 等人的模型基于 VGG-19[3]神经网络,该网络通常用于视觉对象识别,可与人类性能相媲美。
作者图片
然后,它使用它的片段来定义一些函数:
- 一个内容损失函数,它计算生成的图像内容与我们原始图像的内容有何不同。为了比较内容,而不是比较图像像素,它检查输入图像 的 的 CNN 最高层之一的值和输出图像 的该层的值。这将允许我们生成包含相似对象的不同图像。
- 一个风格损失函数,它计算生成的图像的风格与经典艺术绘画的风格(或我们选择使用的任何风格的图像)有何不同。要比较风格,需要不同的方法。它采用不同级别的层(以比较不同复杂性的特征),并且对于每一层,创建具有检测到的特征之间的相关性的矩阵(Gram 矩阵)。该矩阵指示哪些特征同时出现(如发现水平线总是具有 X 颜色等)。风格损失被计算为 风格图像 的层的克矩阵和 输出图像 的层的克矩阵之间的距离。这使得我们可以将一些简单的特征,如一些颜色的块,应用到最复杂的,如波浪或艺术家的笔触。
- 考虑内容损失和风格损失的总损失函数。
作者图片
然后,它运行几轮优化(数千次或更多),将在我们的工作图像中引入变化,这将减少总损失,从而在我们的照片和绘画风格之间产生混合。
以前所有的德国牧羊犬艺术形象都是用这种方法生成的。
你也可以使用这种方法去 artcopypaste.com 网站制作你自己的艺术图片。
优点:
- 适用于任意样式和任意大小的图像(仅受进程中使用的 GPU 内存限制)。
- 不需要预先训练神经网络(它使用用于对象检测的 VGG19 ImageNet 权重)。
- 主要的深度学习框架都有可用的例子: PyTorch 、 Tensorflow 、 Keras 等。
缺点:
- 它需要很长时间才能产生结果,在中等范围的 GPU 上大约需要几分钟。
- 它需要存储 VGG 预训练的重量数据(550 MB)。
用于单一风格转换的预训练网络
这些网络解决了之前描述的模型的主要缺点:制作艺术图像所花费的时间。
它们基于贾斯廷·约翰逊、亚历山大·阿拉希、李菲菲的论文*“实时风格转换和超分辨率的感知损失”* [4]中描述的模型。
这些模型用特定的风格预先训练 CNN,这可能需要在 GPU 中花费几个小时,然后这些网络可以用于几乎实时地将选定的风格应用到任何图像,也可以在几分钟内将风格应用到电影。
它们由两个 CNN 组成:
- 一个可优化的 图像变换网络 ,它采用原始图像并按照编码器-解码器设计生成新的艺术图像。图像首先被简化为一组高级特征,然后可以被扩展以重新创建图像,但是在这种情况下,应用了艺术风格。
- 一个固定的 损失网络 ,用于测量“感知损失”,即生成的图像尽管改变了风格,但与原始图像有何不同。这种损失类似于 Gatys 等人 [2]的总损失函数(内容损失+风格损失),但它是使用预训练的 VGG16[3]网络而不是 VGG19 网络来计算的。
作者图片
图像变换网络的结构类似于:
作者图片
- 网络结构遵循来自*拉德福德等人【5】*的指南
- C1-3 是具有步骤 2 的卷积,没有合并,对图像进行下采样,并且具有批量归一化和重新激活。
- RN1–5 是用于高级图像特征识别的 resnet[6]。在图像识别问题上,雷斯内特被证明比 VGG 更快。
- C4-6 是跨越而不合并的卷积,用于图像上采样,具有批量归一化和 ReLU 激活,除了最后一层使用 Tanh 激活来生成 0 到 255 之间的像素值。
- 卷积 C1 和 C6 使用 9x9 内核,C2–5 使用 3x3 内核。
这种图像下采样和上采样有助于检测图像的更高级特征。在某种程度上,它的工作方式类似于有损压缩,但针对的是图像的高级特征(而不是 JPEG 图像中的像素或颜色)。
使用与之前相同的图像和样式,将产生以下结果:
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
优点:
- 一旦经过训练,图像变换网络就可以很快地将它所训练的风格应用于任何类型的原始图像。它在中档 GPU 中工作在几十秒的量级。
缺点:
- 它需要花费更多的时间来训练,因为它需要根据图像数据集来训练网络。
- 它不仅需要 VGG 的权重数据(550 MB),还需要用于训练的影像数据集(例如,包含 82,700 张影像且需要 13.7 GB 存储空间的 COCO 2014 数据集)
用于任意风格转换的预训练网络
这些网络还生成预训练模型,但不限于仅一种风格,该模型旨在能够再现风格图像中存在的任何风格。
Golnaz Ghiasi、Honglak Lee、Manjunath Kudlur、Vincent Dumoulin、黄邦贤·施伦斯的论文*“探索实时、任意神经艺术风格化网络的结构”*【7】中描述了创建这种类型的网络模型的一种方法。
另一个非常相似的模型,在黄浚、瑟奇·贝隆吉的*“使用自适应实例规范化的实时任意风格转换”【8】*中有所描述。
该模型由三个神经网络组成:
- 一个 风格的传输网络 (类似于约翰逊等人的图像传输网络)
- 一张 亏损网 (类似强生等人vgg 16【3】)
- 并增加了一个 风格预测网(Inception V3【9】)。
作者图片
Golnaz Ghiasi 等人 [7]论文扩展了文森特·杜默林、黄邦贤·施伦斯和曼朱纳斯·库德鲁尔在“艺术风格的习得性表征”[10]中描述的初始工作,该工作实现了一个类似于约翰逊等人 [4]的模型,但是通过操纵风格变换网络的归一化参数,它能够将 32 种绘画风格应用于图像。
由于增加了 风格预测网络 ,该模型能够应用任意数量的风格,甚至是它没有被训练过的风格。该网络产生表示风格图像中存在的检测到的风格的标准化参数矢量,并将它们应用于风格传递网络以生成艺术品。
为了训练该模型,不仅需要大的图像数据集来用作训练风格传输网络的内容(在这种情况下,ImageNet 数据集包括 1400 万个图像),而且需要大的风格图像数据集来训练风格预测网络(在这种情况下,Painter by Numbers 数据集包括 80.000 个艺术绘画和可描述纹理数据集,包括 5600 个纹理)。
幸运的是,有一些预先训练好的模型可以直接使用:
- 第一个版本,在 Tensorflow Hub 中可用,权重数据大小只有 39 MB,可以生成以下图像:https://tfhub . dev/Google/magenta/arbitrary-image-stylization-v1-256/1
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
- 第二个更新版本,大小为 82 MB,也可在 Tensorflow Hub 获得:https://tfhub . dev/Google/magenta/arbitrary-image-stylization-v1-256/2
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
你也可以在 artcopypaste.com 的网站用这个模型测试你自己的图片。
优点:
- 这种模式非常快。用预训练的模型仅通过 1 次风格转移网络和风格预测网络,就产生艺术图像输出。
缺点:
- 它需要大量的图像数据集和训练时间。但幸运的是,预先训练的模型是可用的,随时可以使用。
- 由于用于训练的样式的分辨率有限,它们不会生成与 *Gatys 等人【2】*或 *Johnson 等人【4】*同样高细节的结果,但它们仍然是非常令人满意的结果。
利用编码器-解码器网络的通用风格传输
该模型在、、、、王、陆、明的论文*“通过特征变换的通用风格转换”*【11】中有详细描述
它试图放弃在样式图像上训练网络的需要,同时仍然保持视觉上吸引人的变换图像。
它首先训练一系列连接到 VGG 网络不同层的解码器网络。VGG 网络充当编码器。它加载了 ImageNet 权重并被固定。直到解码器连接到编码器的点,每个解码器结构都具有 VGG 的逆结构。
使用图像数据集,解码器被训练来重新生成原始图像馈送到 VGG。一旦他们接受了训练,他们的体重在剩下的过程中是固定的。
作者图片
这产生了一组编码器-解码器,其将原始图像转换成具有不同复杂程度的特征,但是能够重构原始图像,或者执行单级变换,或者为了更好的生成质量,执行多级变换。
对于单级转换:
- 内容和样式图像都通过 VGG 进行编码。
- 两个图像的特征都是从特定层提取的。
- 然后,对这些特征应用白化和着色变换。
- 然后,WCT 的结果被馈送到相应的解码器网络,以生成风格化图像。
作者图片
实际上,白化过程有助于捕捉内容和样式图像中存在的内容特征。另一方面,着色过程有助于捕捉风格特征。最后,该过程混合内容和风格特征,给定每个特征指定的相对权重。这种混合然后被馈送到解码器以继续该过程。
对于多级优化:
- 原始图像和样式图像被馈送到 VGG。
- 从第五层提取两幅图像的特征。
- 在特征中执行白化和着色变换,然后馈送到第五解码器。
- 然后,解码器输出与风格化图像一起再次馈入 VGG。
- 然后我们从第四层提取两幅图像的特征。
- 用白化和着色变换处理这些特征,然后馈送到第四解码器。
- 类似地,重复这些步骤,直到我们从第一个解码器获得生成的图像。
- 这个生成的图像就是我们最终的艺术图像。
作者图片
这种模式的一些例子如下:
作者图片,星夜风格
作者图片,大波浪风格
作者图像,合成 7 样式
优点:
- 这种模式速度很快。通过五次传递(每个编码器-解码器一次),它产生艺术图像输出。
缺点:
- 训练五个解码器网络中的每一个都需要大量的图像数据集和时间,但这仅需要一次,但该论文甚至在代码样本中包括预训练的权重。
最后的想法
这项工作远远没有描述所有现有的神经网络模型来执行艺术风格转移的迷人过程,这是在不断演变。
最好的例子是 Gatys 等人将图像的内容和风格分开,这是几乎所有其他模型所采用和扩展的。
我也只是想用几个例子来展示,我们如何更深入地理解我们在图像中考虑的对象,尽管它在颜色和形式上可能会遭受所有可能的转换,并更好地了解我们如何感知我们周围的世界。
其他相关故事:人工智能开端(用 Python 从零开始构建神经网络)
参考文献
1:马修·d·泽勒,罗布·弗格斯,“可视化和理解卷积网络”(2013),https://arxiv.org/abs/1311.2901
2:莱昂·A·加蒂丝,亚历山大·s·埃克,马蒂亚斯·贝赫,《艺术风格的一种神经算法》(2015),https://arxiv.org/abs/1508.06576
3:卡伦·西蒙扬,安德鲁·齐泽曼,“用于大规模图像识别的极深度卷积网络”(2014),https://arxiv.org/abs/1409.1556
4:贾斯廷·约翰逊,亚历山大·阿拉希,李菲菲,“实时风格转换和超分辨率的感知损失”(2016),https://arxiv.org/abs/1603.08155
5:亚历克·拉德福德,卢克·梅茨,苏史密斯·钦塔拉,“深度卷积生成对抗网络的无监督表示学习”(2015),https://arxiv.org/abs/1511.06434
6:何,,任,,《深度残差学习用于图像识别》(2015),
7: Golnaz Ghiasi,Honglak Lee,Manjunath Kudlur,Vincent Dumoulin,黄邦贤·施伦斯,“探索一个实时、任意的神经艺术风格化网络的结构”(2017),https://arxiv.org/abs/1705.06830
8:https://arxiv.org/abs/1703.06868、黄浚、塞尔日·贝隆吉,“自适应实例归一化的实时任意风格转换”(2017)
9:克里斯蒂安·塞格迪,文森特·范霍克,谢尔盖·约夫,黄邦贤·施伦斯,兹比格涅夫·沃伊纳,“重新思考计算机视觉的盗梦空间架构”(2015),https://arxiv.org/abs/1512.00567
10:文森特·杜穆林,黄邦贤·施伦斯,曼朱纳斯·库德鲁尔,“艺术风格的学术代表”(2016),https://arxiv.org/abs/1610.07629
11:,,,,王,,吕鑫,明,“通过特征转换实现通用风格转换”(2017),
12:克里斯·奥拉(Chris Olah),亚历山大·莫尔德温采夫(Alexander Mordvintsev),路德维希·舒伯特(Ludwig Schubert),《特征可视化》(2017),https://distill.pub/2017/feature-visualization/
人工智能艺术:神经风格转移
对卷积神经网络最有趣的应用之一的解释
介绍
如果你能把你的图像转变成像文森特·梵高或莱昂纳多·达·芬奇这样的著名画家风格的艺术品,会怎么样?如果知道卷积神经网络不仅可以帮助你学习对图像进行分类或检测物体,还可以帮助你学习艺术家的绘画或绘画风格,以艺术家自己的风格重建图像,你不会感到惊讶吗?好吧,如果你想知道如何做到这一点,这篇文章就是为你准备的。
神经类型转移
这种深度学习技术可以帮助你生成一个输出图像(表示为 G )基于内容图像(表示为 C ),但是以另一个图像的风格绘制或绘制(称为风格图像,表示为 S )。
使用神经类型转移生成的图像示例
这种技术主要依赖于 ConvNets 的初始层和更深层从给定的风格图像中提取特征并在内容图像上实现它的方式。
卷积神经网络及其学习
让我们以一个 VGG 模型为例来说明学习过程
VGG19 架构
当图像被传送到网络上,并且训练开始时,每一层都有一些激活。现在,如果你试图想象每一层的激活,你会发现最初的层会试图识别图像的简单特征,如边缘或边界或特定颜色的阴影。而更深层的激活将倾向于学习图像的更复杂的特征,如形状、图案、物体、纹理等。接近尾声时,最终图层将能够识别前景或背景物体,如猫、狗、汽车等。
这是我们在神经风格转移中使用的基本直觉,即分离图像的风格和内容。我们从风格图像中提取出所有特征,将其分离,同样,我们从内容图像中分离出复杂的特征,这有助于我们生成输出图像。
构建神经风格转移系统
在建立神经风格转换系统的过程中,第一步也是最重要的一步是定义损失函数:内容损失和风格损失。内容损失最小化确保内容图像和生成图像的更深层之间的差异或误差最小,风格损失最小化确保风格图像和生成图像的所有层之间的差异或误差。
最初,我们将生成的图像( g )定义(或初始化)为可训练变量,事实上,它是唯一可训练的图像,因为内容( c )和样式图像( s )不会被训练。并且预训练模型的参数(权重和偏差)应该被冻结。
内容损失
内容损失功能帮助生成的图像结合内容图像的内容。当生成的图像和内容图像被馈送到 CNN,并且计算不同层的激活时,选择更深的层( l )的输出,其用于找出内容和生成的图像之间的误差。该损失函数基本上是被馈送了内容图像( C )和生成图像( G )的 CNN 的这两个中间层之间的欧几里德距离。用简单的话来解释,内容损失函数为我们提供了更深层次的内容和生成的图像之间有多大差异的答案。
内容损失函数
这仅仅是 CNN 的层 l 的激活与内容和生成的图像之间的均方误差。请注意,我们仅在一个且仅一个层( l )应用内容损失,而不是多个层。
为什么我们要尽量减少内容损失
如上所述,卷积神经网络的更深层捕获更复杂的特征(或者本质上是内容),因此,如果我们需要生成的图像( g )具有与内容图像( c )相同的内容,那么我们将不得不最小化这两个图像的特征表示中的更深层之间的差异,或者换句话说,如果两个图像在更深层中具有非常相似的特征,这意味着两个图像中的内容是相同的。
风格丧失
获取样式损失的过程与我们在内容损失的计算中应用的策略类似,但是我们不使用中间层的原始输出,而是使用各个层的所生成的特征图的 gram 矩阵。然后,我们将损失应用于所有层,与内容损失相反,内容损失仅应用于单个层。
Gram 矩阵计算
Gram 矩阵或 Style 矩阵是一个简单的矩阵,它的第( i,j )个元素具有第 i 个和第 j 个特征图的逐元素乘法的输出,并在图像的宽度和高度上对其求和。
因此,总风格损失分两步计算:
首先,在给定层( l ),计算风格( s )的特征图表示的 gram 矩阵或风格矩阵与生成的图像( g )之间的均方误差,其表示该层的风格损失。
任何给定层的风格损失计算(l)
其次,样式损失被应用于 CNN 中的每一层。它与附加权重( wl )相乘,该权重是对总损失的计算有贡献的每一层的权重因子。
总风格损失计算
为什么我们要尽量减少风格损失
如上所述,在任何给定层( l ),风格损失通过从风格图像( s )和生成图像( g )的该层( l )中的特征映射获得的 Gram 矩阵或风格矩阵的相关性之间的差来计算。并且 Gram 矩阵 G( l )表示该层的特征图( l )之间的特定类型的相关性。其中 G l ( i,j )表示特征图 I 和 j 之间的相关性。因此,非常直观的是,如果我们最小化风格的特征表示( s )和生成的图像( g )之间的距离,则生成的图像将具有与风格图像相似的特征,因为生成的图像是唯一的可训练图像而不是风格图像,因此生成的图像开始获得风格图像的特征。由于样式损失应用于所有图层的要素地图制图表达,因此它将为生成的影像提供在初始图层中识别的样式影像的最小要素。
全损
总损失或最终损失可定义如下:
神经类型转移的最终损失
术语α*【alpha】和β**【beta】是超参数,可以根据用户偏好进行调整。任何超参数的值越大,与其相关的损失在生成的图像中的贡献就越大。例如,如果用户想要较少的样式图像对生成的图像的影响和更多的内容图像,则用户可以减小超参数**【β】(β)并增大超参数α**(α)。*
优化损失
现在,在我们定义了最终损失函数之后,该过程的最后一步仍然是使用优化算法来最小化该损失。
优化损失的推荐方法是使用 L-BFGS 优化器。其他方法包括使用随机梯度下降或使用 Adam 优化器,但不建议这样做,因为数据不是随机的,即将数据集分成小的小批量是行不通的,因为输入是单个静态图像。此外,对于神经类型转移的任务,L-BFGS 优化器在学习上比 Adam 优化器更快。
结果
在历元的不同阶段输出图像
因此,以类似的方式,你可以尝试不同的风格和内容图像的组合,以创建各种艺术作品,Python 笔记本可在我的 GitHub 帐户上这里获得。
现在你可以继续发挥你的创造力,创作出这样的作品:
借助神经风格转移生成不同的艺术品。
参考:
基于 Leon A. Gatys、Alexander S. Ecker 和 Matthias Bethge 的论文: 使用卷积神经网络的图像风格转移 。
人工智能艺术:用神经风格转换将照片变成艺术品
你曾希望自己能像毕加索或梵高一样画画吗?
- 简介:机器之间的界限&艺术家变得模糊
- 虽然人工智能已被证明在复杂的计算和预测方面更胜一筹,但创造力似乎是机器无法接管的领域。
- 随着人工智能开始产生令人惊叹的视觉效果、深刻的诗歌和超凡的音乐,艺术的本质和人类创造力在未来的作用开始变得不确定。
- 令人惊讶的是,人工智能现在能够创作出具有美感的艺术作品。
请注意: 我保留本博客使用的所有媒体的权利——照片、动画、视频等。它们是我的作品(除了上面提到的 7 件作为风格图片的艺术家作品)。gif 文件可能需要一段时间加载,请耐心等待。在中型应用程序中,它不为我加载。如果是这种情况,请在浏览器中打开。
这是一些我用来从照片中生成数字艺术品的图像处理技术
2。颜色量化
- 减少图像中使用的不同颜色的数量,目的是使新图像在视觉上相似,大小压缩。
- 常见情况:将 24 位彩色图像转换为 8 位彩色图像。
- 使用 K 均值聚类对相似颜色的像素进行分组。
- 聚类的 K 个质心代表 3-D RGB 颜色空间&将替换聚类中所有点的颜色,得到具有 K 种颜色的图像。
3。超像素分割
- 将图像划分为超像素。超像素是一组具有相似颜色或灰度级的相连像素。
- 使用一种称为简单线性迭代聚类(SLIC)的无监督分割技术。使用 K-均值聚类分割图像。
- 它接受图像的所有像素值,并试图将它们分成预定义数量的子区域。
- 然后,每个超像素中的所有像素取该段中所有像素的平均颜色值。
4。神经类型转移
- 一种优化技术,将一幅图像的内容与另一幅图像的风格结合起来,有效地传递风格。
- **图像内容:**物体结构,其具体布局&定位。
- **意象风格:**色彩、肌理、笔触图案、画风技法。
- 能够产生手工难以产生的迷人结果。
- 如下所示,输出匹配内容图像的内容统计&样式图像的样式统计。这些统计数据是使用卷积神经网络从图像中提取的。
- 简而言之,生成的图像是相同的内容图像,但好像是梵高以其艺术作品“星夜”的风格绘制的。
4.1 项目概述
- 我已经在这个项目上工作了一个多月。我用模型超参数&一对内容图像和样式图像做了很多实验。
- 迄今为止,使用 63 幅内容图片和 40 幅风格图片(8 幅作品和 32 张照片)生成了 2500 多幅数字作品。
- 每个图像(800 像素宽)需要 7 分钟来生成(2000 次迭代)。我能够使用 6GB 的 GPU 生成高达 1200 像素宽的图像。
- 我还应用了基本的图像增强技术&色彩校正来制作视觉上有美感的艺术品。
4.2 风格转移:VGG-19 CNN 架构
- 风格转移是一项复杂的技术,需要一个强大的模型。
- 大到足以完成这项任务的模型可能需要很长时间来训练&为此需要非常大的数据集。
- 出于这个原因,我们导入一个已经在非常大的 ImageNet 数据库上训练过的预训练模型。
- 根据的 NST 原始论文,我们将使用 VGG-19 网络。
- 预先训练的 VGG-19 模型已经学会识别各种特征。
- 图 1 示出了输入图像(1200x800)的不同层的尺寸。
- 特征部分- 处理从图像中提取相关特征。
- 分类器部分- 处理图像分类(此处不需要)。
- 在我们的项目中,我们将只依赖模型的预训练特征部分,而不是从零开始构建我们自己的 CNN。
- 输入图层采用 3 通道彩色 RGB 图像,然后通过总共 16 个图层,因为 VGG-19 中剩余的 3 个图层是完全连接的分类图层。还有总共 5 个最大池层。
- 我们已经冻结了相关参数,这样它们在反向传播过程中不会更新。
4.3 成本函数
- 与深度学习中的常规神经网络算法不同,我们不是优化成本函数来获得一组参数值。
- 相反,我们优化一个成本函数来获得目标图像的像素值。
- **内容损失:**内容图像&生成图像产生的某些卷积输出的均方误差。
- **风格损失:**风格图像产生的 gram 矩阵的均方误差&生成的图像。
- **总损失:**内容损失的加权相加&风格损失。
4.4 优化图像内容:
将目标图像的内容特征与内容图像的特征进行匹配。
4.4.1 特征图—过滤可视化
- 这里我展示了 Conv1_1 层的 64 个特征图中的 2 个。
- 图层中的每个特征地图检测图像的一些特征。
- 下面的特征图试图识别图像中的垂直边缘(更确切地说是左侧比右侧亮的边缘)。
- 下面的特征图识别水平边缘(更具体地,顶部区域比底部区域亮的边缘)。
4.4.2 浅层与深层
- 较浅的层检测边缘和简单纹理等低级特征。
- 更深的层检测高级特征,如复杂的纹理和形状。
- 随着我们越深入,特征地图的维度就越小。
- 以下 gif 显示了上述图层中的一些特征地图。
1200x800
600x400
300x200
4.4.3 选择用于内容提取的层
- CNN 的每一层都会忘记原始图像的具体细节&更多地关注特征(边缘、形状、纹理)。
- 取内容最重要的特征。我们没有填充的任何细节都可以用样式填充。这使得空间可以平衡内容和风格。
- 在神经网络的初期,我们总会得到更清晰的图像。
- 如果你在网络中间选择一个图层,我们将会得到视觉上最愉悦的结果——既不太浅也不太深。
- 这里选择 Conv4_2 层来捕捉最重要的特性。
4.4.4 含量损失
- **目标:**生成与输入图像内容相似的图像。
- 内容丢失采用 CNN 的隐藏层激活(此处为 Conv4_2),并测量内容和生成图像的不同激活。
- 最大限度地减少内容损失确保两幅图像有相似的内容。
- 取内容图像(AC)和生成图像(AG)激活之间的平方差,然后平均所有这些平方差。
- content _ loss = mean(σᵢ(ag-AC))∀I = 1 到 512
4.5 优化图像风格:
- 内容特征按原样使用,因为 CNN 在提取输入图像的内容元素方面做得很好。
- 尽管 syle 特征需要一个额外的预处理步骤,但是使用 gram 矩阵进行更有效的风格特征提取。
- 通过将 gram 矩阵应用于所提取的特征,内容信息被消除,然而风格信息被保留。
4.5.1 样式权重
- 我们选择了 5 层从中提取特征。靠近开头的层通常在重新创建风格特征方面更有效,而后面的层为风格元素提供了额外的变化。
- 我们可以通过将某些权重参数与每个层相关联来选择将某些层优先于其他层。
- 我们将加重早期层的重量。
4.5.2 克矩阵—克(克)
- G(gram)度量同一层中特征图之间的相关性。
- 特征映射只是卷积层的激活后输出。
- Conv2_1 有 128 个滤波器,它将输出 128 个特征图。
- **直觉:**假设我们有两个滤镜,一个检测蓝色物体&一个检测螺旋。将这些过滤器应用于输入图像将产生 2 个特征图&我们测量它们的相关性。
- 如果特征图高度相关,那么图像中出现的任何螺旋几乎肯定是蓝色的。
- 最小化样式和生成的图像的 gram 矩阵之间的差异导致在生成的图像中具有相似的纹理。
- 然后,所有的激活图被展开成像素值的 2D 矩阵。
- 展开版本中的每一行代表一个滤波器(或通道)的激活。
- g(克)是通过将展开的滤波器矩阵与其转置相乘来计算的,这产生了维度通道 x 通道的矩阵。
- g(克)与图像分辨率无关,即对于 Conv2_1 层,生成的图像和样式图像的克矩阵尺寸为 128x128。
- 因此,生成图像的分辨率(=内容图像的分辨率)和样式图像可能不同。
- 对角线元素测量滤波器 ii 有多活跃,例如,假设滤波器 ii 正在检测垂直纹理,那么 G(gram)ᵢᵢ测量垂直纹理在整个图像中有多常见。如果 G(gram)ᵢᵢ很大,这意味着图像有很多垂直纹理。
- 通过捕捉不同类型的特征 G(gram)ᵢᵢ的流行,以及有多少不同的特征一起出现 G(gram)ᵢⱼ,gram 矩阵 G(gram)测量图像的风格。
4.5.3 风格损失
- **目标:**最小化样式图像的克矩阵之间的距离&生成图像的克矩阵。
- 将生成的图像和风格图像通过同一个预先训练的 VGG CNN。
- 取 CNN 的一些卷积的输出,计算它们的 gram 矩阵&然后计算每个选择层的均方误差。
- 在每次迭代中,我们创建一个输出图像,使得输出的 gram 矩阵和样式图像的 gram 矩阵之间的差异最小化。
4.6 优化内容&样式一起:
- 总损失是内容损失和总风格损失的线性组合。
- 总损失=α内容损失+β总损失
- α和β超参数控制内容和风格之间的相对权重。
- 通过 VGG19 模型运行内容映像并计算内容成本。
- 通过 VGG19 模型运行样式图像并计算样式成本。
- 使用 adam 优化器,学习率= 0.003
- 通过将模型和张量转移到 CUDA 来利用 GPU。
4.7 总结
- 我们有内容图像、风格图像&生成的(或目标)图像。
- 虽然样式转印纸从目标图像是随机的白噪声图像开始,但是我从目标图像是内容图像的克隆开始。
- 优化过程然后将尝试&保持目标图像的内容,同时在每次迭代中应用更多来自样式图像的样式。
- 我们将针对生成的图像优化总损耗。
- **内容丢失:**我们将内容&生成的图像通过预先训练好的 CNN,如 VGG-19。我们取这两个输出之间的均方误差。
- **风格丢失:**我们通过同一个 CNN 传递风格&生成的图像。我们抓取 5 个不同层的输出&计算克矩阵。
- 然后,我们取每一层的样式图像和生成图像的 gram 矩阵之间的均方误差。
- 取这些均方差的加权和。这让我们完全失去了风格。
- 总损失是内容损失和总风格损失的加权和。
- 利用反向传播,计算所有需要的梯度,以最小化相对于我们的目标图像参数的损失。
- 这就是优化器如何学习调整哪些像素&如何调整它们以最小化总损失。
- 用最小化总损失的反向传播更新生成的图像。
- 每次迭代更新权重&重复这个过程。
4.8.1 利用著名艺术品作为风格图像:
- 以从梵高到毕加索的任何艺术家的风格重画这幅画。
- 这里是我为这个博客选择的一些艺术作品。
文森特梵高:星夜
- 世界上最受认可和最宏伟的艺术品之一。
- 我在这里添加了一个运动效果,整个效果是空灵的&像做梦一样。
- 蓝色主导了这幅画,将群山融入天空。星星的黄色白色月亮在天空的映衬下显得格外突出。
- **天空:**一笔一笔打着旋儿,卷着星星周围的云&月亮。
- **山丘&树木:**弯曲&搭配天空柔和的漩涡。滚进下面的小村庄。
- **村庄:**直线&锐角把它和画的其他部分分开。
我梦想画画,然后我画出我的梦想——文森特·梵高
今天的世界没有意义,我为什么要画有意义的画呢?—巴勃罗·毕加索
以下是结果,一些组合产生了令人震惊的艺术品。
4.8.2 使用照片作为风格图像:
这是一个新娘和涂鸦的图像,将它们结合起来会产生一个类似涂鸦的输出。
在这里,你可以看到建筑在背景中被弹出。
这种效果有点像这里的玻璃蚀刻技术。
旧木门的纹理创造了一幅古画的独特外观。
印度人居中心的天花板图案被转移到这里,创造出类似马赛克的效果。
spirograph 生成的设计应用于此处的内容图像。
冰块的纹理在这里非常好用。
好像涂鸦是画在砖墙上的。
马赛克天花板的样式用于生成输出。
4.9 迭代式可视化:
- 形象的风格和内容如何结合起来优化目标图像。
- 随着更多的迭代,图像在整个过程中逐渐变得更有风格&可视化是非常迷人的。
4.10 将一系列照片风格化以创建动画:
- 我能想到的一个应用是在动画行业,在现实世界中拍摄&根据所需的风格图像进行风格化。
- 在这里,我用 DSLR 的连续连拍模式捕捉图像。
4.11 使用风格转移将视频风格化
- 程式化的定时录像,我以 30 帧/秒的速度拍摄,持续时间为 30 秒。
- 然后,900 帧中的每一帧都与不同风格的图像一起通过风格转换算法,以创建独特的效果。
- 对于每一种风格,所有的帧在 720p 分辨率下渲染需要大约 18 个小时。
4.12 结果随内容权重的变化(α ) &样式权重(β):
- α与β的比率越低,风格转移得越多。
- 当α=1 & β=100 时,我得到了令人印象深刻的结果,这个博客中的所有结果都是针对这个比例的。
- 对于 2000 次迭代,下面是比率如何影响生成的图像-
- 这种变化在树木的笔触中更加明显。
4.13 两种风格图像的风格转换:
- 我已经扩展了算法来结合两种风格的图像。
- 下面显示的是用两种风格的图像生成的两个图像。
- 我喜欢第一张生成图像的纹理。然而,我希望它像第二个生成的图像一样更加丰富多彩。
- 因此,我没有使用单一风格的图片,而是使用了两种风格图片的组合&结果令人印象深刻。
- 修改后的总损失= 1 *内容损失+100 *样式 1 损失+45 *样式 2 损失
4.14 结论
完成一幅画需要几个小时或几天甚至更长时间&然而在深度学习的帮助下,我们可以使用照片在几分钟内生成一幅受某种风格启发的新的数字绘画。这让我们想知道未来的艺术家是计算机还是人类。
以一个值得商榷的问题结束博客:如果用人工智能来创造图像,最终的产品真的可以被认为是艺术吗?评论一下你对此的看法。
感谢您的阅读!
我希望你喜欢这个博客。如果你想了解我的文章,请跟我来。🙂
我的下一篇博客将是关于 Deep Dream,这是一种人工智能算法,它在有意过度处理的图像中产生梦一样的幻觉外观。
阅读我的其他博客:
一张图胜过千言万语。字面意思!这张图有 2200+字。😱
towardsdatascience.com](/creating-typography-using-word-cloud-in-python-9652bd62fa69) [## 使用 Spotify API 和 Python 中的 Seaborn 对音乐品味进行国别可视化分析
你知道哪个国家喜欢欢快的音乐,哪个国家喜欢喧闹的音乐吗?
towardsdatascience.com](/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)
本博客中使用的绘画作品归功于它们各自的艺术家。提及他们的官方网站:
在这里,你会看到。梵高的画,水彩画,平面作品,字母素描,以及梵高的…
www.vangoghgallery.com](https://www.vangoghgallery.com/) [## 李奥尼德·阿夫列莫夫在线画廊
李奥尼德·阿夫列莫夫是当代最杰出的艺术家之一,以其不同寻常的绘画方式和独特的艺术风格而闻名
afremov.com](https://afremov.com/) [## 瓦西里·康丁斯基- 610 艺术品,传记,书籍,引文,文章
9 月 05 日布拉德福德·麦考密克写道:“评论说:”我 8 岁的儿子画这样的艺术作品,当他真的…
www.wassilykandinsky.net](https://www.wassilykandinsky.net/) [## 爱德华蒙克-绘画,传记,爱德华蒙克的报价
爱德华·蒙克最著名的身份是出生于挪威的表现主义画家和印刷商。在 20 世纪后期,他…
www.edvardmunch.org](https://www.edvardmunch.org/) [## 巴勃罗·毕加索:毕加索 150 幅名画、传记及语录
就艺术和艺术运动而言,巴勃罗·毕加索可能是 20 世纪最重要的人物
www.pablopicasso.org](https://www.pablopicasso.org/) [## 李奥尼德·阿夫列莫夫在线画廊
李奥尼德·阿夫列莫夫是当代最杰出的艺术家之一,以其不同寻常的绘画方式和独特的艺术风格而闻名
afremov.com](https://afremov.com/) [## 葛饰北斋
点击这里探索关于葛饰北斋传记的完整信息,并从他杰出的…
www.katsushikahokusai.org](https://www.katsushikahokusai.org/) [## 约瑟夫·马洛德·威廉·透纳 1775-1851 |泰特
约瑟夫·马洛德·威廉·透纳(1775 年 4 月 23 日-1851 年 12 月 19 日),现在被称为威廉·特纳,是一个…
www.tate.org.uk](https://www.tate.org.uk/art/artists/joseph-mallord-william-turner-558)
参考文献:
[## 艺术风格的神经算法
在美术中,尤其是绘画,人类已经掌握了通过构图创造独特视觉体验的技巧…
arxiv.org](https://arxiv.org/abs/1508.06576) [## 卷积神经网络:特征映射和滤波器可视化
了解卷积神经网络如何理解图像。
towardsdatascience.com](/convolutional-neural-network-feature-map-and-filter-visualization-f75012a5a49c) [## 用于艺术风格转换的卷积神经网络
现在有一个很棒的应用程序叫做 Prisma,它可以把你的照片转换成艺术作品,使用…
harishnarayanan.org](https://harishnarayanan.org/writing/artistic-style-transfer/) [## 基于 VGG 模型的神经风格迁移
一种采用不同图像风格的数字图像变换技术
towardsdatascience.com](/neural-style-transfer-using-vgg-model-ff0f9757aafc) [## 13.12.神经类型转移-深入研究深度学习 0.14.3 文档
如果你使用社交分享应用程序,或者碰巧是一名业余摄影师,你对滤镜很熟悉。过滤器可以…
d2l.ai](https://d2l.ai/chapter_computer-vision/neural-style.html) [## AI 对于艺术和艺术家意味着什么?宽墙
到目前为止,人工智能系统已经成功地完成了许多以前由人类完成的任务,每一个新的…
www.widewalls.ch](https://www.widewalls.ch/magazine/ai-art-artificial-intelligence-artists) [## 人工智能模糊了艺术家的定义
随着人工智能(AI)融入我们日常生活的更多方面,从写作到驾驶…
www.americanscientist.org](https://www.americanscientist.org/article/ai-is-blurring-the-definition-of-artist#:~:text=To%20create%20AI%20art%2C%20artists,the%20aesthetics%20it%20has%20learned.)
利用独立分量分析进行伪影校正
用神经科学的例子来说明
时间序列数据往往被不需要的信号假象所污染,这些假象有可能严重扭曲任何进一步的分析。独立分量分析(ICA)是解决这个问题的有效方法。这里,我将简要介绍 ICA,然后演示如何实现它来消除信号伪像。在整篇文章中,我将使用通过脑电图(EEG)获得的时间序列数据,EEG 是一种来自神经科学的技术,用于测量大脑大脑皮层的电活动。
**注意:**我在这里只展示关键的代码片段。用 Python 3 写的完整代码可以在我的 GitHub 上以 Jupyter 笔记本的形式找到。
国际通信机构(International Communications Agency)
ICA 是一种信号处理方法,能够将多变量信号分离成它的附加子分量或源。它基于这样的假设,即来源在统计上是独立的,并且每个来源中的值是非高斯分布的基础[1]。源分离的一个经典例子是鸡尾酒会问题,一个房间里的多个人同时说话,他们的声音被位于不同空间位置的麦克风记录下来。然后可以应用 ICA 将混合源数据分离成代表最大时间独立信号的各种信息源。换句话说,房间里每个人的声音都可以以相当高的准确度还原出来,如下图所示。
简化的鸡尾酒会问题。来源:Tharwat,A. (2018) [2]。
脑电图的应用
脑电图及其假象
在 EEG 的情况下,ICA 可以识别包括诸如眨眼或眼球运动等伪影的成分。然后,在数据从源空间(ICA 计算的单个源)转换回传感器空间(原始 EEG 数据)之前,可以移除这些分量。这些传感器或电极的位置图示如下。
头皮上的标准 10–20 电极位置(俯视图)。
通过检查时间序列数据,通常可以相当容易地检测到眨眼和眼球运动。它们尤其被位于眼睛正上方或靠近眼睛的前部通道接收到。每种方法的示例如下所示。
正面通道中眨眼的图示(F & Fp)。来源:https://imotions.com/blog/eeg/
额叶通道的眼球运动图解(F & Fp)。来源:https://imotions.com/blog/eeg/
使用 FastICA 纠正伪影
科学界一直在使用各种 ICA 算法,如 Infomax、JADE 和 FastICA [3,4],后者可以说是最流行的一种。另外, scikit-learn 在其分解模块中提供了 FastICA 算法,这进一步促使我在这次演示中使用它。
这里使用的数据是从大约 8 分钟的静息状态 EEG 会话中获取的。在我们开始之前,让我们看一下脑电图的时间序列。
描述所有 63 个通道的 EEG 时间序列数据的 2000 样本切片。
这里的采样率是 500 Hz,所以上图显示了 4 秒钟的数据。在样本 1250 和 1500 之间可以看到眨眼。眨眼通常在通道 Fp1 和 Fp2 中最明显,因此我们分别绘制它们。
通道 Fp1 和 Fp2 中眨眼的描述。
观察 Fp1,在眨眼开始之前可以检测到轻微的箱形。这代表水平的眼球运动,理想情况下也应该去除。现在,让我们运行 scikit-learn 的 FastICA 并绘制所有 63 个 ICA 组件,看看我们是否可以识别任何伪像的来源。
## Computing ICA componentsfrom sklearn.decomposition import FastICAica = FastICA(n_components=63, random_state=0, tol=0.05)
comps = ica.fit_transform(eeg)# eeg --> raw data, shape: (224930, 63)
# comps --> ICA components, shape: (224930, 63)
ICA 组件。
为了简单起见,我只绘制了 400 个样本的组成部分,从 1200 到 1600,希望能发现 Fp1 和 Fp2 中可见的眨眼。在仔细检查时,看起来好像分量 29 包含水平眼睛运动,而分量 42 包含眨眼伪影。为了证实这一点,我查看了更长的数据切片(此处未显示),发现这些分量中的伪像实际上与各种前额通道中的眨眼和眼球运动伪像同时出现。
注意: ICA 根据统计测量将信号分成子分量,这意味着没有特定的分量顺序。如果你不指定random_state
,你会发现包含工件的组件可以不同。
现在,让我们移除组件 29 和 42,并使用逆变换将源数据转换回原始传感器空间。
## Set artefact components to zero before inverse transformcomps[:,[29,42]] = 0
restored = ica.inverse_transform(comps)
Fp1 和 Fp2 的原始和 ICA 校正信号。
成功了!恢复的信号(Fp1_post 和 Fp2_post,深色)不再包含原始信号(Fp1_pre 和 Fp2_pre,浅色)中存在的眨眼和眼球运动伪影。
注意: ICA 已经被证明对诸如眨眼和眼球运动之类的刻板假象非常有效。然而,在各种空间位置产生噪声的非定型假象,即当受试者抓头时,会破坏 ICA 的工作,应谨慎对待。
参考
[1]hyv rinen,a .,2016 年。独立成分分析:最新进展。菲洛斯译数学物理科学。 371 (1984):20110534。[ 考研 ]
[2]塔尔瓦特,a .,2018 年。独立成分分析:导论。应用计算。通知。https://doi.org/10.1016/j.aci.2018.08.006[PDF
[3]海弗里宁,1999 年。用于独立成分分析的快速且鲁棒的定点算法。 IEEE 神经网络汇刊。10(3):626–634。[ PDF
[4]hyv rinen,a;Oja,e .,2000 年。独立成分分析:算法与应用。神经网络。13(4–5):411–430。[ PDF
有助于您了解 GPT-3 的文章
意见
增强你对最新炒作的人工智能模型:GPT 3 的了解
我通常会张贴本周在 Medium 上遇到的与人工智能和机器学习主题相关的有趣文章。
但是最近,很难逃脱围绕 GPT-3 的炒作和兴趣。
因此,本周我已经确定了几篇文章,它们将带你从零开始了解 GPT 3 号,成为有点像英雄的人物。
本文将为您提供一些知识,以了解 GPT-3 的基本背景,以及其直观的应用和潜在的威胁。
对于那些有点赶时间的人来说,可以随意只阅读’ 【短评’ 对所提交文章的总结和回顾。
而那些时间稍微多一点的人可以深入研究一下“ ”详细回顾一下“ 的总结来了解我对所提到文章的想法和看法。
您会发现一些文章:
- 这就解释了 GPT 在 3 分钟内 3 投 3 中的原因
- 或者,解释一下为什么 GPT-3 被过度宣传,也是在 3 分钟内
- 深入了解 GPT-3
- 质疑编码角色的寿命,因为 GPT-3 的潜力。
包含文章的封面图像
GPT-3:第一个人工通用智能?朱利安·劳蕾特
一站式获取有关 GPT-3 的历史、发展和潜力的信息。
简短评论
Julien Lauret 的文章全面总结了迄今为止创造 GPT 3 号的历程。
Julien 已经成功地将多年来对建模语言和解决自然语言处理的方法和技术的开发和介绍总结为几个小而简洁的段落。
除了向读者提供 GPT-3 的背景资料,朱利安还用外交辞令回答了 GPT-3 是否是 AGI 的问题。他的回答真实地反映了问题本身的性质,因为无论是谁提出这个问题,这个问题都要服从于智力的定义。
详细审查
朱利安关于 GPT-3 的最新文章是一篇非常需要的文章,因为我觉得人工通用智能(AGI)的话题在我们的想象中几乎已经退居二线了。
朱利安在文章的开头指出了关于 AGI 的两种观点。一种观点暗示 AGI 还有几十年的时间;另一个问题是人类是否有可能到达 AGI。
Julien 的文章中充斥着一些技术和专业术语,但每个术语都附有简短的定义,在某些情况下还有广泛的背景知识。
诸如“深度神经网络”、“机器翻译”、“Word2vec”和“少量学习”等术语的呈现和定义方式为读者提供了语言建模和 NLP 的速成课程,以及有关 GPT-3 的主要信息。
这篇文章直到文章中途才提到 GPT-3,这是因为 Julien 巧妙地带领读者经历了一次概述对语言建模和 GPT-3 本身的进步做出贡献的关键发展和研究的旅程。
关于 GPT-3 和它的前身的内在特征*(重量数)*的信息被提供给读者,以使读者了解 GPT 模型在每个发布版本中所取得的进步水平。
本文的后半部分展示了早期 access API 用户开发的 GPT-3 的直观应用程序示例。
但更重要的是,朱利安回答了文章题目中提出的问题。朱利安对 GPT-3 是否是 AGI 的结论是,它不是。但更重要的是,问题本身的答案并不像人们想象的那样清晰。
这种不明确性源于这样一个事实,即智力的定义是模糊的,取决于个人的解释。
朱利安指出,讨论 GPT-3 的应用是一个重要的问题。我们已经看到了它生成诗歌、游戏场景和通过语言定义的 web 组件的能力。
我们现在需要观察的是,人工智能的最新成就如何应用于涉及视频和图像的更广泛的环境中。
朱利安的文章有趣地包含了一些哲学观点和陈述。例如,朱利安指出,我们无法确定 GPT-3 拥有的智力水平,就像我们无法确定一个瘫痪的人或身体有缺陷的人的认知功能水平一样。
这篇文章深入探讨了值得思考的人工智能领域。
这篇文章非常适合:
机器学习从业者:使用的语言和技术术语,任何参与机器学习的人都非常熟悉。所包括的定义和论文允许进一步探讨与 GPT-3 有关的主题
当历史学家回顾过去时,他们会选择 2020 年作为发明 AGI 的一年吗?
towardsdatascience.com](/gpt-3-the-first-artificial-general-intelligence-b8d9b38557a1)
GPT-3 由戴尔·马科维茨在不到 3 分钟的时间内解释
关于 GPT 3 号的简短信息
简短评论
对于那些时间不多并且想了解 GPT 3 号的信息的人来说,戴尔·马科维茨的文章是一个完美的停留。有了良好的结构和介绍的段落,你就能得到 GPT-3 关键性能的重要信息。本文还包括一些基于 GPT-3 的应用程序示例。
详细审查
戴尔的文章可以被描述为包含 GPT 3 号重要细节的有用信息的快速拍摄。
戴尔在文章中探讨了 GPT-3 语言模型的一般构成,但没有大量的技术术语和细节。
本文首先通过一系列嵌入式 twitter 帖子展示了一些基于 GPT 3 的应用程序。
戴尔的文章为 GPT-3 相关的通用技术思想的定义提供了信息,这就是“语言模型”。
对“语言模型”的描述附有一个甚至五岁孩子都能理解的例子。
更重要的是,戴尔的文章包括了 GPT-3 的重要性质,以便进行进一步的探索。这篇文章提到了 GPT-3 基于变压器的架构,以及 GPT-3 和它的前身中的一些参数。
文章最后陈述了 GPT-3 号与其同类产品不同的主要原因,主要是 GPT-3 号可普遍应用于各种任务,无需微调。
这篇文章非常适合阅读:
普通观众:这篇文章使用的语言并不太专业。所提供的信息结构合理,格式清晰,便于理解新 GPT 协议的主要特点和优势。不需要主要的技术背景。
快速了解 OpenAI 的 GPT-3 模型如何在引擎盖下工作。
towardsdatascience.com](/gpt-3-explained-in-under-2-minutes-9c977ccb172f)
最新的 AI 会杀死编码吗?由弗雷德里克·巴斯勒
Web 程序员会想要阅读这篇文章
简短评论
弗雷德里克·布斯勒(Frederik Bussler)写了一篇文章,重新点燃了科技行业几年来一直存在的一个问题。
弗雷德里克介绍了不同版本的 GPT 的简要背景,以及基于观点的推理,解释了为什么编码工作角色可能迟早会面临人工智能的末日。
详细审查
弗雷德里克在他的最新文章中向读者指出了人工智能进步的速度有多快。他引用了研究人员在 2017 年提出的一个问题,该问题提出了“到 2040 年,人工智能能写出大多数代码吗?”。毫无疑问,在 2020 年,我们将开始看到这个问题的答案。
像大多数其他描述 GPT-3 的文章一样,弗雷德里克提到了 GPT-3 语言模型的关键特征,即由于其非常健壮的神经网络参数,它能够推广到特定领域的任务。正如弗雷德里克所指出的,这就是为什么 GPT-3 可以用几乎任何编程语言编码。
弗雷德里克脱离了文章试图解决的主要问题,为读者提供了 GPT 语言模型变体的详细描述。
这篇文章回到了主题,有一个部分叫做“进化或死亡”,这是一个大多数行业都可能会经历的信念,但是程序员比其他人更快。
弗雷德里克为读者提供了进一步的信息——那些可能对弗雷德里克的说法持怀疑态度的人——随着 Squarespace、Wix、GoDaddy 等平台的引入,无代码运动已经全面展开,这些平台通常是所见即所得的网站生成平台。
为了支持无代码平台出现的趋势,Frederik 包括 AutoML 和一家公司的链接,该公司能够创建没有编码技能的人工智能模型。
我得到的印象是,Frederik 非常确信,在不久的将来,编码或程序员的角色是人工智能的公平游戏。
阅读这篇基于观点的文章,找到可以重申你对几个行业内人工智能大灾难的担忧的论点。
这篇文章是以下人士的必读之作:
程序员:尽管人工智能和自动化将在未来大量减少工作岗位,但程序员和编码员仍将是必需的,这让我一直感到欣慰。GPT-3 的出现和潜力似乎引发了一些担忧,我们或许应该给予更多的关注。
人工智能现在可以用任何语言编码,无需额外训练。
towardsdatascience.com](/will-gpt-3-kill-coding-630e4518c04d)
一个 3 分钟的解释为什么 GPT-3 被阿尤什·夏尔马夸大了
不是每个人都买 GPT-3 卖的东西
简短版本
赞美 GPT 3 号的文章不在少数,但阿尤什的文章试图将我们带回现实。这篇直言不讳的文章很短,让读者相信 GPT-3 只不过是一个被主流媒体夸大的人工智能工具。
详细版本
Ayush Sharma 这篇文章旨在让那些持有 GPT-3 是备受期待的人工通用智能(AGI)的到来这一概念的技术人员。
我特别喜欢他所用的比喻,他描述了科技领域一些人所信奉的概念与穴居人通过发现火而解决了核聚变的相似性。
阿尤什似乎没有被 GPT 3 中闪亮的新玩具所迷惑。这篇文章提醒我们,我们目前看到的炒作和关注是主流媒体采用的一种熟悉的行为周期,以高估 AI advanced 的潜力,所有这些都是为了出售故事。
将 GPT-3 描述为“美化的 10 美元以上自动完成软件”是相当苛刻的。在这篇文章中,Ayush 直截了当地陈述了为什么 GPT-3 不是 AGI 的原因。
文章进一步列举了 GPT-3 协议的不足之处。
这篇文章的结论包括一条来自 Open AI 首席执行官 Sam Altman 的嵌入式推文,他在其中表示,围绕 GPT-3 的炒作是没有道理的,尽管它可能令人印象深刻,但仍有很长的路要走。
这篇文章非常适合阅读:
每个人:人们很容易迷失在互联网上展示的人工智能的潜力中。因此,有一个相当像批评家的视角总是健康的,这样才能管理公众的期望,防止未来的失望。
[## 一个 3 分钟的解释为什么 GPT-3 被过分夸大。
是的,GPT 3 号令人印象深刻。不,它与人工通用智能(AGI)相去甚远。
medium.com](https://medium.com/@ayushsharma_mit/a-3-minute-explainer-on-why-gpt-3-is-overhyped-7f134d10c8ce)
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 即将发布的视频内容 这里
- 跟着我上 中
- 通过 LinkedIn 联系我
人造大脑?具有神经元特性的新材料可能是答案
创造一台像我们一样思考的机器的关键可能最近已经揭晓
由于传统硅基技术的物理限制,预测到 2040 年,我们的全球能源供应将不再能够满足我们的计算需求。因此,迫切需要开发能够更快处理数据的新系统,最重要的是,以更节能的方式处理数据。
科学家们早就知道,实现这一目标的一种方法是创造一种模仿人脑的技术,人脑是我们所知的最强大的机器。在硅计算中,不同的功能由不同的物理实体执行,这减慢了处理时间并导致大量的热浪费。相比之下,我们大脑中的神经元能够通过一个巨大的网络同时发送和接收信息,其电压比我们最先进的计算机低 10 倍。
我们的大脑相对于硅大脑的主要优势是并行处理能力。我们的每一个神经元都与成千上万的其他神经元相连,它们都可以作为信息的输入和输出。在硅计算中,晶体管元件只能有三种连接方式。为了创造一个像我们一样存储和处理信息的人造大脑机器,关键是找到可以像我们的神经元一样在绝缘和传导电流之间无缝波动的物理材料。
上月发表在细胞杂志上的一项研究发现了一种具有这种特性的材料。德克萨斯 A & M 大学的研究人员创造了β’-CuₓV₂O₅纳米线,它展示了响应温度、电压和电流变化,在导电状态之间振荡的能力。
通过进一步的研究,他们发现这种能力源于铜离子在β’-CuₓV₂O₅的运动,这种运动迫使电子移动,从而改变了材料的导电性能。通过操纵β’-CuₓV₂O₅的这一方面,可以根据命令产生电尖峰,这与我们的神经元之间发送信号时产生的电尖峰非常相似。
像这样的小电事件可以用来在材料的电路中存储信息。我们的大脑通过在关键时刻以独特的顺序激活特定的神经元来发挥作用。一个特定的神经元事件序列会导致信息的处理,无论是回忆记忆还是执行身体动作。β’-CuₓV₂O₅的一个环会以同样的方式行动。
这是一个巨大的突破,它创造了一个可以模仿我们大脑工作方式的电路网络。这一研究领域被称为神经形态工程,主要目的是开发能够复制我们大脑的能力和结构的技术,以匹配其处理效率和能力的水平。
“这项工作的重要性在于表明化学家可以合理地设计和创造出具有显著改善的神经形态特性的电活性材料。随着我们了解的越来越多,我们的材料将会得到显著改善,从而为我们计算能力的持续技术进步提供一条新的途径。”R. Stanley Williams,得克萨斯州 A&M 电气和计算机工程师
该团队希望这将是创造像我们一样思考和理解的机器的第一步。随着机器学习和神经网络技术每天都在进步,看到这项技术如何与深度学习算法相结合,以比我们目前使用标准计算机更有效地存储和处理信息,将是令人着迷的。
人工智能——建模中苦乐参半的交响乐
每个模型都是错的,但有些模型是有用的
在过去的几十年里,我们已经看到了人工智能(AI)的巨大进步。然而,这一进展并不是稳步实现的。一路上经历了重大的起伏。在其中一些阶段,人们甚至害怕公开承认人工智能这个术语,因为这个领域的声誉受到了严重损害。在那个时候,任何从事人工智能的人都被认为是梦想家。这也导致了该领域的不同名称和细分,被称为机器学习、数据挖掘或模式识别。
图 1:人工智能炒作周期、摩尔定律和数字数据量不断增长的对比。
理查德·萨顿在最近的一篇博客文章中指出,计算能力的缺乏被认为是迄今为止遭遇起伏的一个重要原因。在他的透彻分析中,观察到一般模型总是胜过那些主要由专家知识驱动的模型。随着计算能力的提高,通用模型能够超越手工制作的、基于专家知识的方法。然而,当通用模型在计算上变得过于昂贵时,摩尔定律就出现了,使用通用方法的进一步发展变得不可能。图 1 示意性地展示了这一发展。基于这种分析,得出的结论是,专家知识的结合是一种资源浪费,因为人们只需要等到有足够的计算能力来解决机器智能的下一个里程碑。这个结论相当激进,值得再分析一下。因此,我们将有一个简短的历史观点,这实际上是最近在 KDnuggets 上发表的三篇文章的简短总结。
感知器的灵感来自左边显示的生物神经元。所得的计算神经元计算其输入的加权和,然后由激活函数 h(x)处理,以确定输出值。这样做,我们能够模拟线性决策边界,因为加权和可以被解释为到决策边界的有符号距离,而激活确定实际的类成员。在右侧,示出了不能由单个线性分类器解决的 XOR 问题。它通常需要弯曲的边界或多条线。图片:来源
第一次人工智能炒作开始于 20 世纪 50 年代,并导致了该领域的重要发展。明斯基开发了第一台被称为随机神经类比强化计算机(SNARC)的神经网络机器,该机器受生物设计的启发,将神经元映射为一台电机。更重要的发展是感知器,它使得受生物启发的神经元可以在计算机程序中训练。那个时代的另一个重要发展是基于规则的语法模型的发明,它被用来解决第一个简单的自然语言处理任务。同样,图灵测试的概念也属于人工智能的这个时期。随着这些巨大的发展,对人工智能的高期望逐渐越来越快。然而,这些概念不能满足他们的期望,在许多日常生活应用中失败了。这些怀疑进一步得到理论观察的支持,例如,感知器不能学习逻辑异或函数,因为它不是线性可分的。结果,人工智能的资金被大幅削减,这也被称为今天的人工智能冬天。
使用层导数的反向传播的图形概述。在正向传递期间,网络被评估一次,并使用损失函数与期望输出进行比较。反向传播算法沿着不同的路径通过层图,以便有效地计算矩阵导数。图片:来源
在 80 年代,人工智能的魅力又回来了。第二次繁荣是由更重要技术的发展促成的,如使多层感知器可训练的反向传播算法,以及具有单个隐藏层的神经网络已经是通用函数逼近器的理论观察。循环网络被开发出来,强化学习也使得博弈论变得可训练。当时的另一个突破是统计语言模型的发展,逐渐开始取代基于规则的系统。甚至深度和卷积网络在那时已经被探索。然而,不断增长的计算需求——由数值不稳定性支持——导致了长时间的训练。与此同时,出现了其他基于模型、不太复杂的技术,如支持向量机和集成,这些技术逐渐降低了神经网络的重要性,因为可以在更短的时间内获得相同或更好的结果。特别是凸优化和变分方法成为重要的概念,有效地结束了这第二次人工智能炒作。当时,神经网络被认为是低效和数值不稳定的。许多研究人员不再在这个方向投入时间,因为其他方法更有效,可以更有效地处理数据。
深度学习擅长检测和分割等感知任务。在这里,我们强调一些医疗应用:左手边显示的是基于人工智能体的地标检测和 X 射线变换不变地标检测(投影图像由 Unberath 博士提供)。右侧显示了基于 U 形网的支架分割。图片:来源
第三个炒作期,我们目前正在经历的这个时期再次受到许多重要突破的推动。我们已经看到计算机打败了世界级的围棋选手,创造了艺术,并解决了以前几乎不可能完成的任务,如图像字幕。在这个时期,一个主要的重复出现的主题是不再需要手工制作和特征工程,深度学习算法解决了所有开箱即用的问题。事实上,已经发现了一些重要的概念,这些概念能够概括许多最先进的方法。深度卷积网络已经取代了 SIFT 和小波理论等多尺度方法。此外,可训练的卷积神经网络已经证明在语音处理中胜过所谓的梅尔频率倒谱系数(MFCCs ),其中这些特征已经主导该领域近 50 年。看来过去发展起来的许多理论已经过时了。然而,人们必须记住,深层网络设计实际上经常受到经典特征提取模型的启发,并且图像处理特征与小波变换有明显的相似性,并且音频处理网络仍然形成隐式滤波器组。同样,知识仍然存在,但是它以不同的形式编码。人们仍然不得不承认,以前算法的可训练版本明显优于它们的前辈。
我们目前的分析缺少第三个组成部分,这是今天人工智能成功的另一个驱动因素:用于训练机器学习算法的数字数据的可用性(参见图 1)。在最近的一篇文章中,Helbing 和他的同事观察到数据每 12 个月翻一番,而即使是 GPU 的处理能力也只在 18 个月内翻一番。因此,我们很快将不再能够像今天这样详尽地处理数据。我们要么选择只处理有限数量的数据,要么必须限制我们用来处理它们的方法的复杂性。因此,基于模型的方法可能很快会再次占据主导地位,我们可能会经历另一个时期,在这个时期,非通用和专用模型将推动研究。
这种研究似乎是徒劳的,因为它可能会在某个时候被更普遍的方法所取代。然而,我们必须记住模型的另一个重要优势:它们可以被理解和相应地操作。以一个物理公式为例,它可以求解一个或另一个变量。我们可以对所有模型执行此操作,并使用它们的属性来重新安排它们的用途。这是我们目前的深度学习模型无法做到的。他们必须从头开始接受培训,而且他们的重用能力有限。因为这样的模型也有很多目前深度学习无法做到的。
时间像箭一样飞逝。AI 的未来会给我们带来什么?图片: Pixabay / Pexels
对于遥远的未来,我们已经可以推测,这种知识驱动的人工智能将在未来几年被真正的通用人工智能所取代,正如萨顿预测的那样,通用人工智能能够自己创建、维护和重用这种模型。然而,在这篇文章的作者看来,将领域知识与深度学习相结合的方法并不是徒劳的,因为下一级的推广将通过从模型驱动的人工智能中吸取的经验教训来实现,而这些经验教训仍将到来。在开发模型驱动的人工智能时,我们将了解如何构建良好的可训练模型人工智能解决方案,并最终创建自动化方法来实现相同的目标。
当然,很难做出预测,尤其是对未来的预测。无论哪种方式,无论是一般的无模型方法还是模型驱动的科学,我们都期待着机器学习、模式识别和数据挖掘的激动人心的未来!
这篇博文最早出现在 http://www.marktechpost.com 的网站上。如果你喜欢这篇博文,我推荐你阅读 MarkTechPost.com 上的其他帖子,或者看看我们免费的深度学习资源。
本文的文本和图像根据知识共享许可 4.0 署名进行许可。请随意重用和分享这项工作的任何部分。
人工智能——欧洲的方法
马库斯·斯皮斯克在 Unsplash 上的照片
欧盟委员会目前正在探索需要什么样的措施和立法来实现人工智能的全部潜力,同时保护欧盟公民。在这种情况下,一份白皮书的初步版本已经泄露。尽管它还不是一份官方出版物,但它已经很好地显示了欧洲目前在人工智能问题上的考虑。
以下是草案摘要(截至 21。2020 年 1 月)。你可以在这里下载的完整论文。
对价值观、法治和构建安全可靠的复杂系统的能力的强烈依赖是帮助实现值得信赖的人工智能的一些基础。
章节有
1。前言
2。简介
3。利用工业和专业市场的优势
4。抓住未来的机遇:下一次数据浪潮
5。卓越的生态系统。信任的生态系统:人工智能的监管框架。结论
1。人工智能正在快速发展,并将对我们的生活产生重要而积极的影响,但也可能存在风险。
对欧盟委员会来说,三个领域非常重要:推动科学突破,保持欧盟的技术领先地位,以及确保新技术为欧洲人服务。
重要的是欧罗巴作为一个整体行动,并定义自己的方式。
该方法基于监管和投资。
2。简介 对价值观、法治的强烈依恋,以及构建安全可靠的复杂系统的能力,是帮助实现值得信赖的人工智能的一些基础。
日期将越来越成为经济增长的原因。尤其是来自商业和工业的数据——欧洲在这两个领域都处于强势地位。
自由、人类尊严和隐私保护的价值观必须成为欧洲人工智能的基础。监管应该是欧洲的,以避免单一市场的分裂和公民的不确定性。
白皮书的两个主要部分是,第一,从研究和创新开始,沿着整个价值链的“卓越生态系统”。第二个是“信任生态系统”,这样公民可以对人工智能的使用充满信心,而公司则了解法律法规。
此外,补充“欧洲数据战略”旨在确保欧罗巴成为“世界上最具吸引力、最安全和最具活力的数据中心”。
3。利用工业和专业市场的优势 欧洲有很大的优势从人工智能的发展中受益:卓越的研究,在许多重要领域的市场领导地位(机器人,竞争性制造,汽车,医疗保健)。此外,欧洲拥有大量未被充分利用的数据。
因此,欧洲应该建立自己的优势,并在价值链中加以利用。
事实证明,欧盟资助计划是协调投资的一种成功方式。自上一时期以来,欧盟对研究和创新的资助增加了 70%,达到 15 亿欧元。不过,与其他地区相比,这只是一小部分。欧洲需要增加和最大化投资。
4。抓住未来的机遇:下一波数据浪潮 欧洲在消费者和在线服务领域的弱势地位是基于数据访问方面的竞争劣势。到 2025 年,平台将失去其在数据仓库中的主导地位,大部分数据将位于本地边缘设备上,例如工厂或医院。
欧洲应该扩大人工智能专用 CPU 的领域。像欧洲处理器倡议这样的项目可以帮助做到这一点。Europa 已经在神经形态工程领域处于领先地位,并在量子计算领域占据强势地位。
欧洲将继续引领人工智能算法基础的进步,并将机器学习、深度学习和符号推理等领域的专业知识与深度神经网络相结合。
5。卓越的生态系统
A .与成员国合作
为了进一步最大限度地扩大研究、创新和部署投资的影响,将向成员国提议修订人工智能协调计划,以便在 2020 年底前通过(行动 1)。
B .联合并集中研究和创新群体的努力
为了达到高水平,欧洲必须巩固其卓越中心。必须创造协同和集中。这也包括留住和吸引最好的研究人员。欧洲需要一个特别引人注目的最高水平的人工智能研究中心,以吸引投资和人才。
这个人工智能研究中心应该专注于欧洲能够取得世界领先地位的领域(例如:工业、卫生、交通、农业食品链、能源/环境、地球观测或太空)。
同样重要的是提供测试和基准站点。这方面的法律框架将于 2020 年第二季度创建(创建“欧盟卓越”标签/品牌)(行动 2)。
C .关注中小企业
重要的是,中小企业既要使用人工智能,又要有获取人工智能的途径。为此,应进一步加强数字创新中心和人工智能按需平台。
根据" InvestEU "方案,将进一步扩大对中小企业和初创企业的投资。
与成员国合作,确保每个成员国至少有一个数字创新中心。为此,计划投入 9 亿欧元。在 Q1 2020 年,1 亿欧元的资金将用于人工智能创新。从 2021 年起,InvestEU 将把这一数额至少增加十倍(行动 3)。
D .与私营部门的伙伴关系
重要的是,私营部门充分参与制定研究和创新议程,并提供必要的共同投资。为此,有必要发展公私合作伙伴关系,并获得公司管理层的批准。
欧盟委员会正在为人工智能和机器人技术建立一个新的公私合作伙伴关系(行动 4)。
E .促进人工智能的采用
公共管理使用 AI 技术是必要的。这里的重点是医疗保健和交通。为此,将在具体部门讨论的帮助下,在 2020 年年中之前制定一项行动计划(行动 5)。
F .保护对数据和计算基础设施的访问
改善数据的获取和管理是一个关键问题。同样重要的是对计算机技术和基础设施的投资。
将拨款 40 亿欧元支持高性能计算机、量子计算机以及人工智能和数据基础设施。
G .技能
欧洲的方法还必须特别关注技能领域。虽然教育政策是成员国的责任,但委员会可以协调最佳做法的交流。
促进人工智能相关能力将是修订后的“人工智能协调计划”和“数字教育行动计划”的优先事项。
欧洲卓越中心以及由此带来的人才增长也将对整个欧洲的技能转移产生积极影响。
数字欧洲方案旨在吸引最优秀的教授和研究人员,并提供人工智能领域的世界领先的硕士学位(行动 7)。
H .国际方面
欧盟的工作已经影响了国际话语(伦理原则)。
欧盟将继续与全球人工智能参与者合作。这是基于欧盟的利益(执行欧洲标准,获取关键资源,如数据,公平的竞争环境)。合作必须旨在促进基本权利。
6。信任的生态系统:人工智能的监管框架
信任是确保人工智能日益普及的重要因素。
为此,编写了关于可信 AI 的指南,其中描述了七个基本要求。根据公司的反馈,透明度和人力监督很重要,但立法者尚未具体要求。
一个有约束力的监管框架可以帮助增加消费者和企业对人工智能的信心,从而促进其使用。该框架受到高级别专家组要求的启发。
人工智能开发商和提供商已经受到欧洲立法的约束。然而,大赦国际的具体性质可能会使这一立法难以适用和执行。因此,必须审查现有立法,以确定它是否已经足够。
为了确保欧盟内部市场的平稳运行,欧盟层面的强有力框架优于国家立法。
6A。问题定义
该框架的重点应该是将风险降至最低。这些风险可能是实质性的(安全、健康、财产损失等)。)和非物质的(失去隐私、限制言论自由、人的尊严、歧视等)。).
人工智能作为“黑匣子”的问题可能会给法律的应用和执行带来困难。
主要风险是数据安全以及对基本权利和安全的威胁。
6A i .基本权利的风险,包括隐私、数据保护和歧视
使用人工智能可能导致侵犯基本权利。要么是因为错误的开发,要么是因为数据的偏差。
这是一个问题,因为公民将越来越多地接触到人工智能的决定。
虽然人类的决策存在偏差,但 AI 没有社会控制机制。
6A 二世。安全风险和责任体系的有效运行
人工智能会产生新的安全风险。例如通过车辆中的错误图像识别。
如果没有明确的安全法规,这可能会导致公司的法律不确定性,当局也无法干预。这将削弱整体安全性,并使责任问题复杂化。
人工智能的特性使得追溯系统决策变得困难。这目前可能导致证据不足。因此,可能无法据此要求赔偿,也无法追查侵犯基本权利的行为。
B .现有的欧盟人工智能立法框架
关于安全和责任问题的全面法律框架(国家和欧盟级别)已经到位,并可能适用于人工智能应用。欧盟立法也涵盖基本权利和消费者权利。
需要研究欧盟立法是否已经能够充分解决禽流感的风险,或者是否需要适应。委员会提出以下领域供审议:
1)有效应用和执行现有的国家和欧盟立法。
2)现有欧盟立法范围的局限性:例如,软件和服务不被视为产品,因此不在立法范围内。
3)人工智能系统的动态本质。
4)不同经济行为者之间责任分配的不确定性。
5)安全概念的变化:在操作过程中出现的风险,例如由于更新或技术或安全变化。
C .监管框架的范围
委员会从 b 中得出结论,补充现有立法是一种行动选择。澄清范围是一个重要的问题。目前的假设是,它涉及利用人工智能的服务和产品。为了创造法律确定性,需要界定人工智能的概念。
对这个定义的建议是:AI 是在软件或硬件中使用算法,识别产品或服务为了实现给定目标应该执行的动作。这是通过解释、推理和从数据中学习来完成的。
D .要求适用的可能情况
该框架不应该过于规范,以免给中小企业造成过多的官僚障碍。
应该关注“高风险”应用,以便监管干预能够保持合理。为此,有必要对低风险和高风险进行精确定义。
确定风险水平的标准可以是:1)高风险部门的定义,2)高风险应用的定义,3)自我评估,4)产出的影响潜力:重要性、不可逆性、高风险群体中的目标群体。
高风险应用程序的定义应基于两个标准:
1)高风险领域的详细列表。
2)关于人工智能使用的高风险的抽象定义。
强制性要求仅适用于满足这两个标准的应用程序。对于所有其他应用,现有立法继续适用。
E .需求类型
必须考虑强制性法律要求及其适用的级别。还必须考虑前面提到的风险水平。调节的强度必须是可调节的。特别是在高风险系统的情况下,所有参与者都必须遵守该法规,包括没有 EU-基地的参与者。
下面提出了高风险应用程序的需求类型:
a)质量和可追溯性义务
高风险应用程序必须使用根据欧洲规则和要求收集的数据进行培训。
这意味着数据必须保证基本权利以及隐私、保密性、完整性、可再现性(根据 DSGVO)和高级别小组道德准则的具体要求:准确性、可再现性、可再现性。
b)透明度和人员监督义务
高风险应用程序应提供符合欧洲法规的文档。这关系到数据的质量、准确性、编程方法以及生产、测试和验证人工智能系统的技术。如果还与可能的偏差相关的话。
正确应用和准确性的能力、限制、目的和条件必须提交给当局和最终用户。
当用户使用人工智能系统时,必须弄清楚这一点。
需要有人监督。
c)远程生物识别系统的具体要求
生物识别系统带来了侵犯基本权利的风险。
关于(a)和(b)的要求,应提供相应的生物特征数据处理指南。
此外,对于风险不高的系统,可能会有一个自愿的“质量标签”。然而,这种标签不会完全涵盖安全、问责和基本权利等问题,而只会鼓励可信人工智能的发展。
F .收信人
在人工智能系统的生命周期中有许多参与者。未来的立法应基于这样的原则,即责任在于最有能力应对潜在风险的行为者。
G .强制执行
应通过事前(之前)和事后(之后)评估相结合的方式对要求进行评估。可能会对风险水平进行调整。
对于高风险申请,将根据现有机制在欧盟内部进行事前评估。发生违规后,将对低风险应用程序进行事后评估。
H .治理
行政结构必须是欧洲的,以便集中责任,提高成员国在人工智能方面的能力,并确保欧洲逐步具备测试和认证人工智能产品和服务的必要能力。这种方法应该是非官僚的和敏捷的。
这些结构还应依靠国家当局网络。
不应与现有机构重叠,而应与其密切合作。
成员国应该将符合性评估留给独立的测试中心。
应确保利益攸关方尽可能广泛的参与。
7。结论 为了让欧洲利用人工智能提供的所有机会,必须建立和加强必要的工业和技术能力。这在欧洲数据战略中有所阐述。欧盟将成为全球数据中心。
欧洲的人工智能方法旨在加强欧洲的创新,同时促进道德和值得信赖的人工智能。
这份白皮书旨在与所有相关利益攸关方开展广泛磋商。