您好,登录后才能下订单哦!
本篇文章为大家展示了如何进行Python的张量Tucker分解及其应用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
人工智能、深度学习、卷积神经网络、强化学习。这些是机器学习领域的革命性进步,使得很多原本不大可能成的任务逐渐成为了可能。尽管有这些优点,但是也存在一些缺点和局限性。例如,由于神经网络需要大量的训练集,因此容易导致过拟合。这些算法通常是针对特定任务设计的,它们的能力并不能很好地移植为其他任务上。
鉴于此,张量分解在高维数据的应用背景中非常有用。用 Python 实现张量分解来分析视频可以得到数据的重要信息,可以作为其他方法的预处理。
高维数据分析涉及一组问题,其中之一就是特征的数量比数据的数量反而大。在许多应用中(例如回归),这会导致速度和模型学习问题,例如过拟合甚至无法生成模型。在计算机视觉、材料科学乃至商业中,这都是司空见惯的,因为互联网上捕获了太多的数据。
此外,将直接指张量的维度
每个颜色通道 (红色,绿色,蓝色) 都有其自己的矩阵,矩阵中给定像素的值编码了该颜色通道的强度
更进一步,视频只是一系列帧,其中每个帧都是图像。使其变得难以可视化,但是可以将其存储在4D张量中:3个维度用于存储单个帧,第4个维度用于编码时间的流逝。
为了更具体一点,让我们以一段 60 秒长每秒有 60 帧(每秒的帧数),分辨率为 800x600 的视频为例。该视频可以存储在 800x600x3x3600 张量中。因此它将有 50 亿个元素!对于建立一个可靠的模型来说,这个数量太大了。这就是需要张量分解来救急了。
高阶奇异值分解
。我使用较短的视频截断其他两个视频,以便更好地比较
# 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))
# 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 分解降低维数以从视频中提取核张量后,它们的比较才有意义。我们确认停车场和通勤视频最为相似。
上述内容就是如何进行Python的张量Tucker分解及其应用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。