tf計算矩陣維度_tensorflow中關于 多維tensor的運算(tf.multiply, tf.matmul, tf.tensordot)...

multiply 等同與* ,用于計算矩陣之間的element-wise 乘法,要求矩陣的形狀必須一致(或者是其中一個維度為1),否則會報錯:

import tensorflow as tf

a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12], shape=[2, 3, 2])

b = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3, 1])

c = a*b

e = tf.multiply(a, a)

with tf.Session():

print(a.eval())

print(b.eval())

print(c.eval())

print(d.eval())

print(e.eval())

>> a

[[[ 1 2]

[ 3 4]

[ 5 6]]

[[ 7 8]

[ 9 10]

[11 12]]]

>>b

[[[1]

[2]

[3]]

[[4]

[5]

[6]]]

>>a*b

[[[ 1 2]

[ 6 8]

[15 18]]

[[28 32]

[45 50]

[66 72]]]

>>multiply(a, b)

[[[ 1 2]

[ 6 8]

[15 18]]

[[28 32]

[45 50]

[66 72]]]

>>multiply(a,a)

[[[ 1 4]

[ 9 16]

[ 25 36]]

[[ 49 64]

[ 81 100]

[121 144]]]

更改b的形狀:

b=tf.constant([1,2,3,4,5,6], shape= [1,3,2])

d = a* b

with tf.Session():

print(a.eval())

print(b.eval())

print(d.eval())

>>a

[[[ 1 2]

[ 3 4]

[ 5 6]]

[[ 7 8]

[ 9 10]

[11 12]]]

>>b

[[[1 2]

[3 4]

[5 6]]]

>>c

[[[ 1 4]

[ 9 16]

[25 36]]

[[ 7 16]

[27 40]

[55 72]]]

b=tf.constant([1,2,3,4], shape= [2,1,2])

d = a* b

with tf.Session():

print(a.eval())

print(b.eval())

print(d.eval())

>>a

[[[ 1 2]

[ 3 4]

[ 5 6]]

[[ 7 8]

[ 9 10]

[11 12]]]

>>b

[[[1 2]]

[[3 4]]]

>>d

[[[ 1 4]

[ 3 8]

[ 5 12]]

[[21 32]

[27 40]

[33 48]]]

matmul 是tensor的矩陣乘法, 參與運算的兩個tensor維度、數據類型必須一致,

參與運算的是最后兩維形成的矩陣,如果tensor是二維矩陣,則等同于矩陣乘法:

# 二維tensor

a = tf.constant([1,2,3,4,5,6], shape=[2,3])

b = tf.constant([1,2,3,4,5,6], shape=[3,2])

c = tf.matmul(a,b)

with tf.Session():

print(a.eval())

print(b.eval())

print(c.eval())

>>a

[[1 2 3]

[4 5 6]]

>>b

[[1 2]

[3 4]

[5 6]]

>>c

[[22 28]

[49 64]]

# 三維tensor

a = tf.constant([i for i in range(1, 25)], shape=[2, 3, 4])

b = tf.constant([i for i in range(1, 25)], shape=[2, 4, 3])

c = tf.matmul(a, b)

>>a

[[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]]

[[13 14 15 16]

[17 18 19 20]

[21 22 23 24]]]

>>b

[[[ 1 2 3]

[ 4 5 6]

[ 7 8 9]

[10 11 12]]

[[13 14 15]

[16 17 18]

[19 20 21]

[22 23 24]]]

>>c

[[[ 70 80 90]

[ 158 184 210]

[ 246 288 330]]

[[1030 1088 1146]

[1310 1384 1458]

[1590 1680 1770]]]

# c形狀[2,3,3],因為a的后兩維是[3,4],b的后兩維是[4,3],乘積為[3,3]

# 四維tensor

a = tf.constant([i for i in range(1, 25)], shape=[2, 2,2,3])

b = tf.constant([i for i in range(1, 25)], shape=[2, 2,3,2])

c = tf.matmul(a,b)

>>a

[[[[ 1 2 3]

[ 4 5 6]]

[[ 7 8 9]

[10 11 12]]]

[[[13 14 15]

[16 17 18]]

[[19 20 21]

[22 23 24]]]]

>>b

[[[[ 1 2]

[ 3 4]

[ 5 6]]

[[ 7 8]

[ 9 10]

[11 12]]]

[[[13 14]

[15 16]

[17 18]]

[[19 20]

[21 22]

[23 24]]]]

>>c

[[[[ 22 28]

[ 49 64]]

[[ 220 244]

[ 301 334]]]

[[[ 634 676]

[ 769 820]]

[[1264 1324]

[1453 1522]]]

# c的形狀 [2,2,2,2]

tensordot:矩陣乘法運算,參與運算的兩個tensor的維度可以不一樣:

a?和?b?沿特定軸的張量收縮.

Tensordot(也稱為張量收縮)對從?a?和?b?所指定的索引?a_axes?和?b_axes?的元素的乘積進行求和.列表?a_axes?和?b_axes?指定沿其收縮張量的那些軸對.對于所有?range(0,?len(a_axes))?中的?i,a?的軸?a_axes[i]?必須與?b?的軸?b_axes[i]?具有相同的維度.列表?a_axes?和?b_axes?必須具有相同的長度,并由唯一的整數組成,用于為每個張量指定有效的坐標軸.

該操作對應于?numpy.tensordot(a,?b,?axes).

示例1:當?a?和?b?是矩陣(2階)時,axes?=?1?相當于矩陣乘法.

示例2:當?a?和?b?是矩陣(2階)時,axes?=?[[1],?[0]]?相當于矩陣乘法.

函數參數:

?a:float32?或?float64?類型的?Tensor.

?b:Tensor,與?a?具有相同的類型.

?axes:可以是標量?N,也可以是具有形狀?[2,k]?的?int32?Tensor?的列表.如果軸是標量,則按順序對?a?的最后?N?個軸和?b?的前?N?個軸進行求和.如果軸是一個列表或?Tensor,則分別對于軸?a?和?b,在第一和第二行包含該組唯一整數指定沿該收縮被計算.a?和?b?的坐標軸數必須相等.

?name:操作的名稱(可選).

函數返回值:

函數返回與?a?具有相同類型的?Tensor.

可能引發的異常:

?ValueError:如果?a,b?和?axes?的形狀是不相容的.

?IndexError:如果軸上的值超過相應張量的等級.

a = tf.constant([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24], shape=[2,3,4])

b = tf.constant([1,2,3,4,5,6,7,8,9,10,11,12], shape=[4,3])

c = tf.tensordot(a, b, axes=1)

d = tf.tensordot(a, b, axes=2) # 對a的后2個軸乘積進行加和[2,3X4],即a的shape變成[2,12]; # 對b的前兩個軸進行加和,b的shape變成[12]

e = tf.tensordot(a, b, axes=([1,2],[0,1]))

f = tf.tensordot(a, b, axes=([1,2],[1,0])) # 分別指定兩個軸,對tensor進行展開,a展開成[2,12],

# b展開成[12,1],軸的順序不同,展開方式不同

# 此處b展開成[1,4,7,10,2,5,8,11,3,6,9,12],上面展開成[1,2,3,4,5,6,7,8,9,10,11,12]

g = tf.tensordot(a, b, axes=([1],[1])) #指定任何軸,指定的軸形狀一致

with tf.Session():

print(a.eval())

print(b.eval())

print(c.eval())

>>a

[[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]]

[[13 14 15 16]

[17 18 19 20]

[21 22 23 24]]]

>>b

[[ 1 2 3]

[ 4 5 6]

[ 7 8 9]

[10 11 12]]

>>c

[[[ 70 80 90]

[158 184 210]

[246 288 330]]

[[334 392 450]

[422 496 570]

[510 600 690]]]

# c的形狀 [2,3,3] [2,3,4] * [4,3]

>>d

[ 650 1586]

>>e

[ 650 1586]

>>f

[ 584 1520]

>>g

[[[ 38 83 128 173]

[ 44 98 152 206]

[ 50 113 176 239]

[ 56 128 200 272]]

[[110 263 416 569]

[116 278 440 602]

[122 293 464 635]

[128 308 488 668]]]

a = tf.constant([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24], shape=[2,3,4])

b = tf.constant([1,2,3,4,5,6,7,8,9,10,11,12], shape=[4,3])

c = tf.constant([1,2,3,4], shape=[4,1])

d = tf.tensordot(a, b, axes=1)

e = tf.tensordot(a, c, axes=1)

>>a

[[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]]

[[13 14 15 16]

[17 18 19 20]

[21 22 23 24]]]

>>b

[[ 1 2 3]

[ 4 5 6]

[ 7 8 9]

[10 11 12]]

>>c

[[1]

[2]

[3]

[4]]

>>d

[[[ 70 80 90]

[158 184 210]

[246 288 330]]

[[334 392 450]

[422 496 570]

[510 600 690]]]

# d的形狀[2,3,3] [2,3,4] * [4, 3] = [2,3,3]

>>e

[[[ 30]

[ 70]

[110]]

[[150]

[190]

[230]]]

# e的形狀 [2,3,1] [2,3,4] * [4,1] = [2,3,1]

a = tf.constant([i for i in range(1, 25)], shape=[2,3,4])

b = tf.constant([i for i in range(1, 25)], shape=[2,2,6])

c = tf.tensordot(a,b,([1,2],[1,2]))

>>a

[[[ 1 2 3 4]

[ 5 6 7 8]

[ 9 10 11 12]]

[[13 14 15 16]

[17 18 19 20]

[21 22 23 24]]]

>>b

[[[ 1 2 3 4 5 6]

[ 7 8 9 10 11 12]]

[[13 14 15 16 17 18]

[19 20 21 22 23 24]]]

>>c

[[ 650 1586]

[1586 4250]]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven高級之插件開發

前言 終于來到了Maven的插件開發,其實Maven的插件并沒有想象的那么難,剛開始講Maven基礎的時候就演示了一下JDK是如何打包的,Maven打包只是在JDK打包上封裝了一層而已,Maven也支持自定義插件開發 創建 我們先使用quickstart原型…

HTTP1.1新增了五種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 、 CONNECT

200 (成功) 服務器已成功處理了請求。 通常,這表示服務器提供了請求的網頁。 201 (已創建) 請求成功并且服務器創建了新的資源。 202 (已接受) 服務器已接受請求,但尚未處…

katalon進行app測試_Katalon API 測試 Demo

為何選擇Katalon符合我們當下的情況,測試需要借助現有工具提高測試效率以及提高測試質量;為何不自己寫代碼?不是只有自己寫的框架才是最好的,合適的才是最好的;katalon 支持ui、mobile、api 同時也支持腳本模式&#x…

Maven高級之archetype(原型/骨架)開發

前言 archetype這個的主要功能就是將寫好的項目模塊打包成一個原型,然后提供給其他人使用,這樣別人就可以快速使用這個項目模板了。 這個東西雖然很多人都基本用不上,但原型這個東西用的好還是很方便的,能夠在開發新項目上省去大…

深度學習在搜索業務中的探索與實踐

本文根據美團高級技術專家翟藝濤在2018 QCon全球軟件開發大會上的演講內容整理而成,內容有修改。引言 2018年12月31日,美團酒店單日入住間夜突破200萬,再次創下行業的新紀錄,而酒店搜索在其中起到了非常重要的作用。本文會首先介紹…

cesium面積計算_cesium-長度測量和面積測量

(更新)多謝網友的提醒,面積測量的小問題已經修改,經測試可正常使用網上找的大神的實現方法有點問題,實現有一些bug,作為cesium新手一個,棄之不忍,只好硬著頭皮修改了,不過還好問題不大&#xff…

SpringBoot自動配置原理流程

前言 新公司太忙了,都沒啥空更新博客,就隨便記錄一下以前的學習筆記吧。SpringBoot是基于Spring上的衍生框架,只要看懂了Spring的話,學這個就比較簡單了;SpringBoot也是在當前微服務時代下流行的框架,并且…

算法:對象方式數組去重

var arr [3, 1, 1, 4 , 2 , 4 , 2 , 4 , 2, 1, 1, 3, 3, 3];var ary[];var obj{};for(var i0;i<arr.length;i){var curarr[i];if(!obj[cur]){obj[cur]cur;ary.push(cur);}}console.log(ary); 復制代碼

python實現路由功能_python 實現重啟路由器

有一些服務&#xff0c;需要動態IP&#xff0c;所以我們用重啟路由器的方法實現。人工重啟不可選&#xff0c;用定時腳本執行即可。貼代碼&#xff0c;每種路由器&#xff0c;提示不一樣。需要路由器有telnet功能才行。#!/usr/bin/env python# -*- coding: utf-8 -*-import tel…

SpringBoot自定義Starter(自動配置類)

前言 SpringBoot其實從誕生以來圍繞的核心就是快速構建項目&#xff0c;快速構建的前提是有人幫你做好輪子&#xff0c;開發者只要拿來即用就好了&#xff0c;而造好輪子的人就是SpringBoot的開發者&#xff0c;引入自動配置的形式幫助開發者快速創建項目&#xff0c;而自動配…

Java并發編程之synchronized關鍵字解析

前言 公司加班太狠了&#xff0c;都沒啥時間充電&#xff0c;這周終于結束了。這次整理了Java并發編程里面的synchronized關鍵字&#xff0c;又稱為隱式鎖&#xff0c;與JUC包中的Lock顯示鎖相對應&#xff1b;這個關鍵字從Java誕生開始就有&#xff0c;稱之為重量級鎖&#xf…

raidrive安裝失敗_記一次RaiDrive映射OneDrive遇到的問題

大概在1周以前&#xff0c;出于需要存放直播錄像的原因&#xff0c;根據別人的視頻教程去自己動手搞了個5T網盤的帳號。(體驗一下&#xff0c;其實我還同時存一份在百度云&#xff0c;怕不穩定)用RaiDrive創建OneDrive的映射&#xff0c;在這步驟點確定后&#xff0c;會彈出微軟…

通過代理模式 + 責任鏈模式實現對目標執行方法攔截和增強功能

前言 最近需要實現一個插件功能&#xff0c;但是如果做成兩個接口的話&#xff08;即執行前和執行后&#xff09;&#xff0c;那么會降低插件的可玩性&#xff0c;所以需做成類似AOP的環繞通知形式&#xff0c;所以就使用到了責任鏈模式和代理模式進行實現。 介紹 代理模式(P…

Javascript基礎之-原型(prototype)

首先呢&#xff0c;prototype是對象里的一個內置屬性&#xff0c;并且呢&#xff0c;這個屬性是對于其他對象的一個引用。所以呢&#xff0c;思考下面的例子&#xff1a; var obj {a: 2 } var myObj Object.create(obj); console.log(myObj.a); // 2 console.log(myObj obj)…

Oracle查詢今天、昨天、本周、上周、本月、上月數據

查詢今天數據&#xff1a; SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE,YYYY-MM-DD)&#xff1b; 查詢昨天數據&#xff1a; SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE-1,YYYY-MM-DD)&…

usb一轉多 樹莓派zero_樹莓派 Zero USB/以太網方式連接配置教程

樹莓派 Zero 之所以成為一款非常棒的單板計算機并不全因為它小巧的尺寸和便宜的價格&#xff0c;還得益于它便捷、易用的特性。在加裝了 Zero Quick Plug 或 microUSB/USB 轉換頭之后&#xff0c;將樹莓派 Zero 和電腦連接起來。樹莓派 Zero 即可配置成 USB/以太網設備&#xf…

vscode Go 1.11.4 編譯錯誤 need Delve built by Go 1.11 or later

更新golang的版本為1.11.4之后vscode編譯錯誤&#xff1a;executables built by Go 1.11 or later need Delve built by Go 1.11 or later 原因是delve的版本太老了&#xff0c;需要更新&#xff0c;且delve的github地址已經更換&#xff0c;很多教程里的地址是不對的 新地址安…

oppo的sd卡在哪里打開_oppo的sd卡在哪里打開

大家好&#xff0c;我是時間財富網智能客服時間君&#xff0c;上述問題將由我為大家進行解答。以oppo A91為例&#xff0c;其sd卡可直接在文件管理頁面的存儲里面即可打開。OPPO A91的屏幕為6.4英寸&#xff0c;主屏分辨率2400乘以1080像素&#xff0c;機身顏色有暗夜星辰&…

Navicat使用教程:使用Navicat Query Analyzer優化查詢性能(第1部分)

下載Navicat Monitor最新版本Navicat Monitor 是一套安全、簡單而且無代理的遠程服務器監控工具。它具有強大的功能使你的監控發揮最大效用。受監控的服務器包括 MySQL、MariaDB 和 Percona Server&#xff0c;并與 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure …

dg oracle 切換模式_Oracle數據庫 DGbroker三種保護模式的切換

1.三種保護模式– Maximum protection在Maximum protection下&#xff0c; 可以保證從庫和主庫數據完全一樣&#xff0c;做到zero data loss.事務同時在主從兩邊提交完成&#xff0c;才算事務完成。如果從庫宕機或者網絡出現問題&#xff0c;主從庫不能通訊&#xff0c;主庫也立…