相关文章:

【一】tensorflow安装、常用python镜像源、tensorflow 深度学习强化学习教学

【二】tensorflow调试报错、tensorflow 深度学习强化学习教学

【三】tensorboard安装、使用教学以及遇到的问题

【四】超级快速pytorch安装


trick1---实现tensorflow和pytorch迁移环境教


tf.concat()是相对比较好理解的函数,它和python里的numpy.concatenate()函数作用是一样的。都是把多个array沿着某一个维度接在一起。只不过numpy.concatenate()用来处理numpy array,tf.concat()用于处理tensor。他们俩有个共同点,就是得到的结果tensor或者numpy array的维度的数量一定是一样的

例子:

t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 0)

输出结果:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
shape=[4, 3]

先来分解一下t1和t2。首先t1 = [[1, 2, 3], [4, 5, 6]]可以看成:

t1 = [A, B]
A = [1,2,3]
B = [4,5,6]

t1的shape是[2,3],意思是有2个元素[A, B], 他们每个里面有3个元素,t2同理。

t2 = [C, D]
C = [7,8,9]
D = [10,11,12]

这里[2,3]的维度数量是2,也就是2维的。如果是3维的可能是[2,3,什么]。知道tf.concat()不会改变维度数量非常重要。因为tf.concat()只是对对应维度元素数量的叠加。比如tf.concat([t1, t2], 0)意思是对t1和t2在第一维度对接。因为他俩的shape都是[2,3],输出tensor的shape一定是[4,3],因为他俩的第一维度都是2,2+2=4。再比如如果是tf.concat([t1, t2], 1),那么输出shape一定是[2,6],以此类推。

维度是从0开始算的,也就是沿着第一个维度接起来。(以此类推,axis=1就是第二个维度),从shape可以看出t1和t2都是只有两个维度。既然是沿着第一个维度对接,那根本就不用看第二个维度

那么什么是第一个维度呢?就可以理解成第一层中括号。t1的第一层中括号是t1 = [A, B], t2 = [C, D](展开A,B,C,D是第二个维度)
对接是什么意思呢?就是把对应的中括号打开,把对应的里面一层的元素放在一起,再用中括号全扩起来。

tf.concat([t1, t2], 0)  #后面的0的意思是 axis=0

按步骤是:

  1. 打开中括号:[A,B],[C,D] -> A,B,C,D
  2. 放在一起再扩起来: A,B,C,D -> [A,B,C,D]

这里已经知道了输出的shape是[4,3]。其中的4代表第一维度有4个元素,就是A,B,C,D。t1 = [A, B], t2 = [C, D]各只有一个中括号,所以不用考虑对应,直接放一起就行了。如果t1和t2比如各有2个中括号的话,括回去之后也应该有2个中括号,下面例2有讲到

A,B,C,D都是什么来着?

A = [1,2,3]
B = [4,5,6]
C = [7,8,9]
D = [10,11,12]

每个里面有3个元素,这就是[4,3]的3的含义。
所以输出结果是:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], shape = [4,3]

注意t1和t2是有顺序的。如果这行命令是:

tf.concat([t2, t1], 0)

那么结果应该是[[7, 8, 9], [10, 11, 12], [1, 2, 3], [4, 5, 6]]

tf.concat([t1, t2], 1)  #1是 axis=1,第二维度的意思

还是按照上面的方法,我们知道了输出结果的shape一定是[2,6]。既然沿着第二维度对接,那么不用看第一维度。
第一维度是:t1 = [A, B], t2 = [C, D](不用动,也就是这一维度的输出结果一定是[x1, x2])
第二维度是:A = [1,2,3] B = [4,5,6] C = [7,8,9] D = [10,11,12]
这里A,B属于t1,C,D属于t2,各有2个中括号。那么按顺序,A对应C,B对应D。

  1. 打开中括号:[1,2,3],[4,5,6],[7,8,9],[10,11,12] -> 1,2,3, 4,5,6, 7,8,9, 10,11,12
  2. 对应的A,C放一起:1,2,3,7,8,9 -> [1,2,3,7,8,9]
  3. 对应的B,D放一起: 4,5,6,10,11,12 -> [4,5,6,10,11,12]

最后在第一维度括起来,结果是:

[[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]], shape = [2,6]

直观方法:

t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 0)

其实t1是个2维数组,也就是一个面。形象一点就是:

t1:
-------
|1|2|3|
|-|-|-|
|4|5|6|
-------
t2:
----------
| 7| 8| 9|
|--|--|--|
|10|11|12|
----------

都是2行3列。
我会把第一维度看成,第二维度看成
如果沿着对接,也就是把行数增加为4行,列数还是3列。那么结果就是:

----------
| 1| 2| 3|
|--|--|--|
| 4| 5| 6|
----------
| 7| 8| 9|
|--|--|--|
|10|11|12|
----------

这个矩阵就是:

[[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]]

demo2:

t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 1)

这就是沿着对接,也就是变成6列。行还是3行。也就变成了:

-------------------
| 1| 2| 3| 7| 8| 9|
|--|--|--|--|--|--|
| 4| 5| 6|10|11|12|
-------------------

输出就是

[[1, 2, 3, 7, 8, 9],
[4, 5, 6, 10, 11, 12]]

如果两个tensor都有第三维的话,比如:

t1 = [[[1], [2], [3]], [[4], [5], [6]]]
t2 = [[[7], [8], [9]], [[10], [11], [12]]]
tf.concat([t1, t2], 2)

t1和t2的shape都是[2,3,1],沿着第三维对接。结果shape一定是[2,3,2]。
那么用这个直观的方法就是非常好理解,
就可以理解成把t1的2d矩阵放在t2的2d矩阵的前面,形成一个3d矩阵,像这样:

3d数组这样理解:2行,3列,2层
2行:[A, B]
3列:A = [a,b,c], B = [d, e, f]
2层:a = [1,7], b = [2,8], c = [3, 9], d = [4, 10], e = [5, 11], f = [6, 12]
所以结果是:

[[[1,7], [2,8], [3, 9]], [[4, 10], [5, 11], [6, 12]]], shape = [2,3,2]

这种方法的弊端就是大于3维的数组就不好想了,毕竟我们生活的是3维世界。

链接:https://www.jianshu.com/p/c465e7fab882

tensorflow语法【tf.concat()详解】的更多相关文章

  1. Tensorflow中tf.ConfigProto()详解

    参考Tensorflow Machine Leanrning Cookbook tf.ConfigProto()主要的作用是配置tf.Session的运算方式,比如gpu运算或者cpu运算 具体代码如 ...

  2. tensorflow 的tf.where详解

    最近在用到数据筛选,观看代码中有tf.where()的用法,不是很常用,也不是很好理解.在这里记录一下 tf.where( condition, x=None, y=None, name=None ) ...

  3. Markdown语法说明(详解版)

    ####date: 2016-05-26 20:38:58 tags: Markdown tags && Syntax ##Markdown语法说明(详解版)杨帆发表于 2011-11 ...

  4. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  5. 学习TensorFlow的tf.concat使用

    https://www.tensorflow.org/api_docs/python/tf/concat

  6. Markdown语法图文全面详解(转)

    基本语法参考    转自:https://blog.csdn.net/u014061630/article/details/81359144 更改字体.颜色.大小,设置文字背景色,调整图片大小设置居中 ...

  7. Tensorflow.nn 核心模块详解

    看过前面的例子,会发现实现深度神经网络需要使用 tensorflow.nn 这个核心模块.我们通过源码来一探究竟. # Copyright 2015 Google Inc. All Rights Re ...

  8. 【目标检测】SSD+Tensorflow 300&512 配置详解

    SSD_300_vgg和SSD_512_vgg weights下载链接[需要科学上网~]: Model Training data Testing data mAP FPS SSD-300 VGG-b ...

  9. tensorflow LSTM+CTC使用详解

    最近用tensorflow写了个OCR的程序,在实现的过程中,发现自己还是跳了不少坑,在这里做一个记录,便于以后回忆.主要的内容有lstm+ctc具体的输入输出,以及TF中的CTC和百度开源的warp ...

  10. nginx语法之location详解

    Location语法优先级排列 匹配符 匹配规则 优先级 = 精确匹配 ^~ 以某个字符串开头 ~ 区分大小写的正则匹配 ~* 不区分大小写的正则匹配 !~ 区分大小写不匹配的正则 !~* 不区分大小 ...

随机推荐

  1. 数据结构——AVL树

    AVL树是一种特殊的二叉查找树,其特征在于:对所有节点来说,其左子树和右子树间的高度差小于等于1.本文简要总结下AVL树的几种基本操作. 节点结构体定义 typedef struct Node_s { ...

  2. Django 对实体的增删改查样例

    class UserInfo(models.Model): """ 人员信息 """ user_id = models.CharField( ...

  3. Vue第五篇 Vue的生命周期

    Vue生命周期简介 生命周期的钩子函数 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  4. Zookeeper 的 ZAB 协议 以及 zookeeper 与 nacos 注册中心比对

    本文为博主原创,未经允许不得转载: 目录: 1. ZAB 协议 2. zookeer 节点状态 3. zookeeper 注册中心与 nacos 注册中心比较 4. zookeeper 配置注册中心 ...

  5. 【RTOS】基于RTOS的降低功耗的策略

    RTOS中降低功耗的策略 Saving Power with an RTOS 介绍 随着绿色节能产品需求的增加,快速增长的移动设备,其电池寿命最受关注,设计者必须要考虑在其设计中如何最大限度的降低功耗 ...

  6. 使用JavaStream将List转为Map

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 使用Java Stream将List转换为Map ...

  7. [转帖]018、数据库管理之TiDB升级

    升级 使用TiUP进行补丁升级(HotFix) 版本升级流程 升级准备-更新TiUP 升级准备- 编辑TiUP Cluster 升级准备- 集群监控状态检查 升级TiDB 集群 验证TiDB集群升级结 ...

  8. [转帖]TIDB-TIDB节点磁盘已满报警

    一.背景 今日突然收到tidb节点的磁盘报警,磁盘容量已经超过了80%,但是tidb是不放数据的,磁盘怎么会满,这里就需要排查了 二.问题排查 解决步骤 1.df -h查看哪里占用磁盘比较多,然后通过 ...

  9. [转帖]配置ftp连接对象存储bucket子目录的方法

    https://developer.jdcloud.com/article/1838 配置ftp连接对象存储bucket子目录的方法  京东云技术交付部  2021-01-27 IP归属:未知 441 ...

  10. 【转帖】Linux查看二进制文件:一招制敌(linux二进制查看文件)

    https://www.dbs724.com/146055.html 一招制敌:学会Linux查看二进制文件 在Linux操作系统中,二进制文件是一种常见的文件类型.如果你想深入了解一个二进制文件,可 ...