基于 Python 的张量 Tucker 分解及其应用
Tensor 张量分解 Decomposition
人工智能、深度学习、卷积神经网络、强化学习。这些是机器学习领域的革命性进步,使得很多原本不大可能成的任务逐渐成为了可能。尽管有这些优点,但是也存在一些缺点和局限性。例如,由于神经网络需要大量的训练集,因此容易导致过拟合。这些算法通常是针对特定任务设计的,它们的能力并不能很好地移植为其他任务上。
鉴于此,张量分解在高维数据的应用背景中非常有用。用 Python 实现张量分解来分析视频可以得到数据的重要信息,可以作为其他方法的预处理。
高维数据
高维数据分析涉及一组问题,其中之一就是特征的数量比数据的数量反而大。在许多应用中(例如回归),这会导致速度和模型学习问题,例如过拟合甚至无法生成模型。在计算机视觉、材料科学乃至商业中,这都是司空见惯的,因为互联网上捕获了太多的数据。
数学概念
数字是 0 维张量 向量是 1 维张量 矩阵是 2 维张量 此外,将直接指张量的维度
每个颜色通道 (红色,绿色,蓝色) 都有其自己的矩阵,矩阵中给定像素的值编码了该颜色通道的强度
每个像素在矩阵中具有 (x,y) 坐标,而矩阵的大小取决于图像的分辨率
更进一步,视频只是一系列帧,其中每个帧都是图像。使其变得难以可视化,但是可以将其存储在4D张量中:3个维度用于存储单个帧,第4个维度用于编码时间的流逝。
为了更具体一点,让我们以一段 60 秒长每秒有 60 帧(每秒的帧数),分辨率为 800x600 的视频为例。该视频可以存储在 800x600x3x3600 张量中。因此它将有 50 亿个元素!对于建立一个可靠的模型来说,这个数量太大了。这就是需要张量分解来救急了。
高阶奇异值分解
。应用
我喜欢的咖啡馆露台 停车场 下午通勤时在高速公路上行驶的汽车
创建 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')
结果
为了确定这些视频之间的相似程度,我们可以对它们进行排名。两个张量之差的 L2 范数是相似性的常见度量。值越小,相似度越高。在数学上,张量的范数可以是,
因此,差的范数类似于欧几里得距离。
# 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)
看相似性:
不仅两个视频之间没有明确的排名,而且停车场和露台两个视频似乎是最相似的,这与最初的假设形成了鲜明对比。
# 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)
再看相似性,
结论
在本文中,我展示了无监督学习方法如何提供对数据的见解。只有通过 Tucker 分解降低维数以从视频中提取核张量后,它们的比较才有意义。我们确认停车场和通勤视频最为相似。
本文先通过一个实例让大家初步了解张量分解这一工具,并通过代码掌握实际的用法。需要下载本文代码巩固理解的童鞋请戳此处[5]。如果想深入理解张量分解,请阅读参考文献,对于张量分解理论知识的详细解读将在后期推出。
参考资料
RGB 模型: https://en.wikipedia.org/wiki/RGB_color_model
[2]综述: http://www.kolda.net/publication/TensorReview.pdf
[3]目标: https://arxiv.org/abs/1807.10278
[4]预测: https://arxiv.org/pdf/1706.03423.pdf
[5]代码: https://github.com/celestinhermez/video-analysis-tensor-decomposition
[6]英文链接: https://towardsdatascience.com/video-analysis-with-tensor-decomposition-in-python-3a1fe088831c