真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何進行Python的張量Tucker分解及其應(yīng)用

本篇文章為大家展示了如何進行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)站的公司定做!

 

Tensor 張量分解 Decomposition

人工智能、深度學(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ù)上。

計算機視覺的主要挑戰(zhàn)之一是涉及的數(shù)據(jù)量: 一個圖像通常表示為具有數(shù)百萬個元素的矩陣,而視頻包含數(shù)千個此類圖像。此外,這種數(shù)據(jù)中經(jīng)常會出現(xiàn)噪聲。因此,能夠降低數(shù)據(jù)維數(shù)的無監(jiān)督學(xué)習(xí)方法是改進很多算法的必備法寶。

鑒于此,張量分解在高維數(shù)據(jù)的應(yīng)用背景中非常有用。用 Python 實現(xiàn)張量分解來分析視頻可以得到數(shù)據(jù)的重要信息,可以作為其他方法的預(yù)處理。

 

高維數(shù)據(jù)

高維數(shù)據(jù)分析涉及一組問題,其中之一就是特征的數(shù)量比數(shù)據(jù)的數(shù)量反而大。在許多應(yīng)用中(例如回歸),這會導(dǎo)致速度和模型學(xué)習(xí)問題,例如過擬合甚至無法生成模型。在計算機視覺、材料科學(xué)乃至商業(yè)中,這都是司空見慣的,因為互聯(lián)網(wǎng)上捕獲了太多的數(shù)據(jù)。

解決方案之一就是找到數(shù)據(jù)的低維表示,并將其作為模型中的訓(xùn)練觀測值,因為降維可減輕上述問題。較低維的空間通常能夠包含原始數(shù)據(jù)的大多數(shù)信息,因此降維數(shù)據(jù)足夠代替原始數(shù)據(jù)。樣條、正則化和張量分解就是這種方法的例子。我們來研究后一種方法,并實踐一下它的一種應(yīng)用。
如何進行Python的張量Tucker分解及其應(yīng)用  
將 3D 數(shù)據(jù)投影到 2D 平面上,圖片來源:May Morrison。
 

數(shù)學(xué)概念

本文的核心概念是張量,簡單來說,它就是一個多維數(shù)組:
  • 數(shù)字是 0 維張量
  • 向量是 1 維張量
  • 矩陣是 2 維張量
  • 此外,將直接指張量的維度

該數(shù)據(jù)結(jié)構(gòu)對于存儲圖像或視頻特別有用。在傳統(tǒng)的   RGB 模型   [1]中,單個圖像可以用一個 3 維張量表示:
  • 每個顏色通道 (紅色,綠色,藍色) 都有其自己的矩陣,矩陣中給定像素的值編碼了該顏色通道的強度

  • 每個像素在矩陣中具有 (x,y) 坐標(biāo),而矩陣的大小取決于圖像的分辨率
如何進行Python的張量Tucker分解及其應(yīng)用  
3D 張量的表示形式。對于圖像,        ,而        和        取表示圖像分辨率。圖像來源:Kolda,Tamara G. 和 Brett W. Bader。

更進一步,視頻只是一系列幀,其中每個幀都是圖像。使其變得難以可視化,但是可以將其存儲在4D張量中:3個維度用于存儲單個幀,第4個維度用于編碼時間的流逝。

如何進行Python的張量Tucker分解及其應(yīng)用  
每個切片是表示某一幀的一個 3 維張量,沿著時間軸有多個切片。圖像來源:Kamran Paynabar。

為了更具體一點,讓我們以一段 60 秒長每秒有 60 幀(每秒的幀數(shù)),分辨率為 800x600 的視頻為例。該視頻可以存儲在 800x600x3x3600 張量中。因此它將有 50 億個元素!對于建立一個可靠的模型來說,這個數(shù)量太大了。這就是需要張量分解來救急了。

關(guān)于張量分解的文獻很多,我向感興趣的讀者推薦 Kolda 和 Balder 的   綜述   [2]。特別是,Tucker 分解具有許多應(yīng)用,例如張量回歸,將張量用作   目標(biāo)   [3]或   預(yù)測   [4]變量。關(guān)鍵的一點是,它允許提取一個核張量,即原始數(shù)據(jù)的壓縮版本。如果這讓你想起了 PCA,那就對了: Tucker 分解的步驟之一實際上是 SVD 的擴展即   高階奇異值分解。
現(xiàn)有的算法允許提取核張量以及分解矩陣(在我們的應(yīng)用程序中未使用)。超參數(shù)是秩 n。無需贅述,主要思想是 n 值越高,分解越精確。秩 n 也決定了核張量的大小。如果 n 較小,則重構(gòu)的張量可能與原始張量不完全匹配,但是數(shù)據(jù)維度降得越低:如何權(quán)衡取決于當(dāng)前應(yīng)用。
如何進行Python的張量Tucker分解及其應(yīng)用  
A,B 和 C 是分解矩陣,而 G 是核張量,其維數(shù)由 n 指定。圖像來源:Kolda,Tamara G. 和 Brett W. Bader。
提取此核張量會具有很大用處,下面的實際應(yīng)用例子中將看到這一點。
 

應(yīng)用

作為一個玩具示例,我用手機捕獲了三個 10 秒鐘的視頻:
  • 我喜歡的咖啡館露臺
  • 停車場
  • 下午通勤時在高速公路上行駛的汽車
我將它們和 notbook 代碼上傳到了 GitHub 上。主要目的是確定在停車場和通勤視頻最相似的前提下,我們是否可以按照相似度對潛在視頻對進行嚴(yán)格排名。
在分析之前,先用 OpenCV Python 庫來加載和處理此數(shù)據(jù)。步驟如下,
  • 創(chuàng)建 VideoCapture 對象并提取每個對象的幀數(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))
 
  • 從這些張量中隨機采樣 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 張量。
 

結(jié)果

為了確定這些視頻之間的相似程度,我們可以對它們進行排名。兩個張量之差的 L2 范數(shù)是相似性的常見度量。值越小,相似度越高。在數(shù)學(xué)上,張量的范數(shù)可以是,

如何進行Python的張量Tucker分解及其應(yīng)用  
每個        代表一個給定的維度,        是一個給定的元素。

因此,差的范數(shù)類似于歐幾里得距離。

使用完整張量實施此操作產(chǎn)生的結(jié)果并不令人滿意。
# 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分解及其應(yīng)用  

不僅兩個視頻之間沒有明確的排名,而且停車場和露臺兩個視頻似乎是最相似的,這與最初的假設(shè)形成了鮮明對比。

好吧,接下讓我們來看看 Tucker 分解能不能改善結(jié)果。
TensorLy 庫使分解張量相對容易,盡管速度上有些慢: 我們需要的只是張量及其秩 n。盡管 AIC 準(zhǔn)則是找到此參數(shù)最佳值的常用方法,但在這種特定情況下實際上并不需要達到最佳值,因為目的是進行比較。我們需要所有三個變量都具有共同的秩 n。因此,我們選擇 n-rank = [2、2、2、2],這是精度和速度之間的良好折衷。附帶說明一下,n-rank = [5、5、5、5] 超過了 LAPACK(底層線性代數(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)
 

再看相似性,

如何進行Python的張量Tucker分解及其應(yīng)用  
這些結(jié)果是有道理的:盡管露臺視頻與停車場和通勤視頻不一樣,但后兩個視頻相似性更接近一個數(shù)量級。

在本文中,我展示了無監(jiān)督學(xué)習(xí)方法如何提供對數(shù)據(jù)的見解。只有通過 Tucker 分解降低維數(shù)以從視頻中提取核張量后,它們的比較才有意義。我們確認(rèn)停車場和通勤視頻最為相似。

隨著視頻成為越來越普遍的數(shù)據(jù)源,該技術(shù)具有許多潛在的應(yīng)用。首先想到的(由于我對電視的熱情以及視頻流服務(wù)如何使用數(shù)據(jù))是通過檢查預(yù)告片或電影/電視節(jié)目的一些關(guān)鍵場景之間的相似之處來改進現(xiàn)有的推薦系統(tǒng)。其次是材料科學(xué),其中可以根據(jù)加熱金屬的紅外視頻與基準(zhǔn)的相似性對其進行分類。為了使這些方法完全可擴展,應(yīng)解決計算成本: 在我的計算機上,Tucker 分解速度很慢,雖然只有三段 10s 的小視頻。并行化是加快處理速度的一種潛在方法。
除了這些直接的應(yīng)用,該技術(shù)還可以與引言中介紹的某些方法結(jié)合使用。使用核心張量而不是完整圖像或視頻作為神經(jīng)網(wǎng)絡(luò)中的訓(xùn)練點可以幫助解決過擬合問題并加快訓(xùn)練速度,從而通過解決這兩個主要問題來增強方法。

上述內(nèi)容就是如何進行Python的張量Tucker分解及其應(yīng)用,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁標(biāo)題:如何進行Python的張量Tucker分解及其應(yīng)用
文章地址:http://weahome.cn/article/jjjedd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部