本篇文章為大家展示了如何進行Python的張量Tucker分解及其應(yīng)用,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
巴中網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,巴中網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為巴中1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的巴中做網(wǎng)站的公司定做!
人工智能、深度學(xué)習(xí)、卷積神經(jīng)網(wǎng)絡(luò)、強化學(xué)習(xí)。這些是機器學(xué)習(xí)領(lǐng)域的革命性進步,使得很多原本不大可能成的任務(wù)逐漸成為了可能。盡管有這些優(yōu)點,但是也存在一些缺點和局限性。例如,由于神經(jīng)網(wǎng)絡(luò)需要大量的訓(xùn)練集,因此容易導(dǎo)致過擬合。這些算法通常是針對特定任務(wù)設(shè)計的,它們的能力并不能很好地移植為其他任務(wù)上。
鑒于此,張量分解在高維數(shù)據(jù)的應(yīng)用背景中非常有用。用 Python 實現(xiàn)張量分解來分析視頻可以得到數(shù)據(jù)的重要信息,可以作為其他方法的預(yù)處理。
高維數(shù)據(jù)分析涉及一組問題,其中之一就是特征的數(shù)量比數(shù)據(jù)的數(shù)量反而大。在許多應(yīng)用中(例如回歸),這會導(dǎo)致速度和模型學(xué)習(xí)問題,例如過擬合甚至無法生成模型。在計算機視覺、材料科學(xué)乃至商業(yè)中,這都是司空見慣的,因為互聯(lián)網(wǎng)上捕獲了太多的數(shù)據(jù)。
此外,將直接指張量的維度
每個顏色通道 (紅色,綠色,藍色) 都有其自己的矩陣,矩陣中給定像素的值編碼了該顏色通道的強度
更進一步,視頻只是一系列幀,其中每個幀都是圖像。使其變得難以可視化,但是可以將其存儲在4D張量中:3個維度用于存儲單個幀,第4個維度用于編碼時間的流逝。
為了更具體一點,讓我們以一段 60 秒長每秒有 60 幀(每秒的幀數(shù)),分辨率為 800x600 的視頻為例。該視頻可以存儲在 800x600x3x3600 張量中。因此它將有 50 億個元素!對于建立一個可靠的模型來說,這個數(shù)量太大了。這就是需要張量分解來救急了。
高階奇異值分解
。我使用較短的視頻截斷其他兩個視頻,以便更好地比較
# 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 范數(shù)是相似性的常見度量。值越小,相似度越高。在數(shù)學(xué)上,張量的范數(shù)可以是,
因此,差的范數(shù)類似于歐幾里得距離。
# 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)
看相似性:
不僅兩個視頻之間沒有明確的排名,而且停車場和露臺兩個視頻似乎是最相似的,這與最初的假設(shè)形成了鮮明對比。
# 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)
再看相似性,
在本文中,我展示了無監(jiān)督學(xué)習(xí)方法如何提供對數(shù)據(jù)的見解。只有通過 Tucker 分解降低維數(shù)以從視頻中提取核張量后,它們的比較才有意義。我們確認(rèn)停車場和通勤視頻最為相似。
上述內(nèi)容就是如何進行Python的張量Tucker分解及其應(yīng)用,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。