温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行Python的张量Tucker分解及其应用

发布时间:2021-10-19 10:13:41 来源:亿速云 阅读:295 作者:柒染 栏目:大数据

本篇文章为大家展示了如何进行Python的张量Tucker分解及其应用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

 

Tensor 张量分解 Decomposition


人工智能、深度学习、卷积神经网络、强化学习。这些是机器学习领域的革命性进步,使得很多原本不大可能成的任务逐渐成为了可能。尽管有这些优点,但是也存在一些缺点和局限性。例如,由于神经网络需要大量的训练集,因此容易导致过拟合。这些算法通常是针对特定任务设计的,它们的能力并不能很好地移植为其他任务上。

计算机视觉的主要挑战之一是涉及的数据量: 一个图像通常表示为具有数百万个元素的矩阵,而视频包含数千个此类图像。此外,这种数据中经常会出现噪声。因此,能够降低数据维数的无监督学习方法是改进很多算法的必备法宝。

鉴于此,张量分解在高维数据的应用背景中非常有用。用 Python 实现张量分解来分析视频可以得到数据的重要信息,可以作为其他方法的预处理。

 

高维数据

高维数据分析涉及一组问题,其中之一就是特征的数量比数据的数量反而大。在许多应用中(例如回归),这会导致速度和模型学习问题,例如过拟合甚至无法生成模型。在计算机视觉、材料科学乃至商业中,这都是司空见惯的,因为互联网上捕获了太多的数据。

解决方案之一就是找到数据的低维表示,并将其作为模型中的训练观测值,因为降维可减轻上述问题。较低维的空间通常能够包含原始数据的大多数信息,因此降维数据足够代替原始数据。样条、正则化和张量分解就是这种方法的例子。我们来研究后一种方法,并实践一下它的一种应用。
如何进行Python的张量Tucker分解及其应用  
将 3D 数据投影到 2D 平面上,图片来源:May Morrison。
 

数学概念

本文的核心概念是张量,简单来说,它就是一个多维数组:
  • 数字是 0 维张量
  • 向量是 1 维张量
  • 矩阵是 2 维张量
  • 此外,将直接指张量的维度

该数据结构对于存储图像或视频特别有用。在传统的   RGB 模型   [1]中,单个图像可以用一个 3 维张量表示:
  • 每个颜色通道 (红色,绿色,蓝色) 都有其自己的矩阵,矩阵中给定像素的值编码了该颜色通道的强度

  • 每个像素在矩阵中具有 (x,y) 坐标,而矩阵的大小取决于图像的分辨率
如何进行Python的张量Tucker分解及其应用  
3D 张量的表示形式。对于图像,        ,而        和        取表示图像分辨率。图像来源:Kolda,Tamara G. 和 Brett W. Bader。

更进一步,视频只是一系列帧,其中每个帧都是图像。使其变得难以可视化,但是可以将其存储在4D张量中:3个维度用于存储单个帧,第4个维度用于编码时间的流逝。

如何进行Python的张量Tucker分解及其应用  
每个切片是表示某一帧的一个 3 维张量,沿着时间轴有多个切片。图像来源:Kamran Paynabar。

为了更具体一点,让我们以一段 60 秒长每秒有 60 帧(每秒的帧数),分辨率为 800x600 的视频为例。该视频可以存储在 800x600x3x3600 张量中。因此它将有 50 亿个元素!对于建立一个可靠的模型来说,这个数量太大了。这就是需要张量分解来救急了。

关于张量分解的文献很多,我向感兴趣的读者推荐 Kolda 和 Balder 的   综述   [2]。特别是,Tucker 分解具有许多应用,例如张量回归,将张量用作   目标   [3]或   预测   [4]变量。关键的一点是,它允许提取一个核张量,即原始数据的压缩版本。如果这让你想起了 PCA,那就对了: Tucker 分解的步骤之一实际上是 SVD 的扩展即   高阶奇异值分解
现有的算法允许提取核张量以及分解矩阵(在我们的应用程序中未使用)。超参数是秩 n。无需赘述,主要思想是 n 值越高,分解越精确。秩 n 也决定了核张量的大小。如果 n 较小,则重构的张量可能与原始张量不完全匹配,但是数据维度降得越低:如何权衡取决于当前应用。
如何进行Python的张量Tucker分解及其应用  
A,B 和 C 是分解矩阵,而 G 是核张量,其维数由 n 指定。图像来源:Kolda,Tamara G. 和 Brett W. Bader。
提取此核张量会具有很大用处,下面的实际应用例子中将看到这一点。
 

应用

作为一个玩具示例,我用手机捕获了三个 10 秒钟的视频:
  • 我喜欢的咖啡馆露台
  • 停车场
  • 下午通勤时在高速公路上行驶的汽车
我将它们和 notbook 代码上传到了 GitHub 上。主要目的是确定在停车场和通勤视频最相似的前提下,我们是否可以按照相似度对潜在视频对进行严格排名。
在分析之前,先用 OpenCV Python 库来加载和处理此数据。步骤如下,
  • 创建 VideoCapture 对象并提取每个对象的帧数
  • 我使用较短的视频截断其他两个视频,以便更好地比较

# Import libraries
import cv2
import numpy as np
import random
import tensorly as tl
from tensorly.decomposition import tucker
# Create VideoCapture objects
parking_lot = cv2.VideoCapture('parking_lot.MOV')
patio = cv2.VideoCapture('patio.MOV')
commute = cv2.VideoCapture('commute.MOV')
# Get number of frames in each video
parking_lot_frames = int(parking_lot.get(cv2.CAP_PROP_FRAME_COUNT))
patio_frames = int(patio.get(cv2.CAP_PROP_FRAME_COUNT))
commute_frames = int(commute.get(cv2.CAP_PROP_FRAME_COUNT))
 
  • 从这些张量中随机采样 50 帧以加快后面操作
# Set the seed for reproducibility
random.seed(42)
random_frames = random.sample(range(0, commute_frames), 50)
# Use these random frames to subset the tensors
subset_parking_lot = parking_lot_tensor[random_frames,:,:,:]
subset_patio = patio_tensor[random_frames,:,:,:]
subset_commute = commute_tensor[random_frames, :, :, :]
# Convert three tensors to double
subset_parking_lot = subset_parking_lot.astype('d')
subset_patio = subset_patio.astype('d')
subset_commute = subset_commute.astype('d')
 
完成这些步骤后,得到三个 50x1080x1920x3 张量。
 

结果

为了确定这些视频之间的相似程度,我们可以对它们进行排名。两个张量之差的 L2 范数是相似性的常见度量。值越小,相似度越高。在数学上,张量的范数可以是,

如何进行Python的张量Tucker分解及其应用  
每个        代表一个给定的维度,        是一个给定的元素。

因此,差的范数类似于欧几里得距离。

使用完整张量实施此操作产生的结果并不令人满意。
# Parking and patio
parking_patio_naive_diff = tl.norm(subset_parking_lot - subset_patio)
# Parking and commute
parking_commute_naive_diff = tl.norm(subset_parking_lot - subset_commute)
# Patio and commute
patio_commute_naive_diff = tl.norm(subset_patio - subset_commute)
 

看相似性:

如何进行Python的张量Tucker分解及其应用  

不仅两个视频之间没有明确的排名,而且停车场和露台两个视频似乎是最相似的,这与最初的假设形成了鲜明对比。

好吧,接下让我们来看看 Tucker 分解能不能改善结果。
TensorLy 库使分解张量相对容易,尽管速度上有些慢: 我们需要的只是张量及其秩 n。尽管 AIC 准则是找到此参数最佳值的常用方法,但在这种特定情况下实际上并不需要达到最佳值,因为目的是进行比较。我们需要所有三个变量都具有共同的秩 n。因此,我们选择 n-rank = [2、2、2、2],这是精度和速度之间的良好折衷。附带说明一下,n-rank = [5、5、5、5] 超过了 LAPACK(底层线性代数程序包)的功能,这也说明这些方法计算量是很大的。
提取核张量后,可以进行相同的比较。
# Get core tensor for the parking lot video
core_parking_lot, factors_parking_lot = tucker(subset_parking_lot, ranks = [2,2,2,2])
# Get core tensor for the patio video
core_patio, factors_patio = tucker(subset_patio, ranks = [2,2,2,2])
# Get core tensor for the commute video
core_commute, factors_commute = tucker(subset_commute, ranks = [2,2,2,2])
# Compare core parking lot and patio
parking_patio_diff = tl.norm(core_parking_lot - core_patio)
int(parking_patio_diff)
# Compare core parking lot and commute
parking_commute_diff= tl.norm(core_parking_lot - core_commute)
int(parking_commute_diff)
# Compare core patio and commute
patio_commute_diff = tl.norm(core_patio - core_commute)
int(patio_commute_diff)
 

再看相似性,

如何进行Python的张量Tucker分解及其应用  
这些结果是有道理的:尽管露台视频与停车场和通勤视频不一样,但后两个视频相似性更接近一个数量级。

在本文中,我展示了无监督学习方法如何提供对数据的见解。只有通过 Tucker 分解降低维数以从视频中提取核张量后,它们的比较才有意义。我们确认停车场和通勤视频最为相似。

随着视频成为越来越普遍的数据源,该技术具有许多潜在的应用。首先想到的(由于我对电视的热情以及视频流服务如何使用数据)是通过检查预告片或电影/电视节目的一些关键场景之间的相似之处来改进现有的推荐系统。其次是材料科学,其中可以根据加热金属的红外视频与基准的相似性对其进行分类。为了使这些方法完全可扩展,应解决计算成本: 在我的计算机上,Tucker 分解速度很慢,虽然只有三段 10s 的小视频。并行化是加快处理速度的一种潜在方法。
除了这些直接的应用,该技术还可以与引言中介绍的某些方法结合使用。使用核心张量而不是完整图像或视频作为神经网络中的训练点可以帮助解决过拟合问题并加快训练速度,从而通过解决这两个主要问题来增强方法。

上述内容就是如何进行Python的张量Tucker分解及其应用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI