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.mzph.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;主库也立…