tf.concat中axis的含义与使用详解


Posted in Python onFebruary 07, 2020

tensorflow中tf.concat的axis的使用我一直理解的比较模糊,这次做个笔记理下自己的思路。

import tensorflow as tf
tf.enable_eager_execution()
import numpy as np

先生成两个矩阵m1, 和m2, 大小为两行三列

m1 = np.random.rand(2,3) # m1.shape (2,3)
m1
>>array([[0.44529968, 0.42451167, 0.07463199],
    [0.35787143, 0.22926186, 0.34583839]])
m2 = np.random.rand(2,3) # m2.shape (2,3)
m2
>>array([[0.92811531, 0.6180391 , 0.71969461],
    [0.00564108, 0.55381637, 0.17155987]])

接下来采用tf.concat进行连接,简单来说,axis=0实际就是按行拼接,axis=1就是按列拼接

# axis = 0
m3 = tf.concat([m1,m2],axis=0)
m3
>> array([[0.44529968, 0.42451167, 0.07463199],
    [0.35787143, 0.22926186, 0.34583839],
    [0.92811531, 0.6180391 , 0.71969461],
    [0.00564108, 0.55381637, 0.17155987]])
m3.shape
>> (4,3)

# axis = 1
m4 = tf.concat([m1,m2],axis=1)
m4
>>array([[0.44529968, 0.42451167, 0.07463199, 0.92811531, 0.6180391 ,
    0.71969461],
    [0.35787143, 0.22926186, 0.34583839, 0.00564108, 0.55381637,
    0.17155987]])
m4.shape
>>(2,6)

但这实际上这只有在我们的输入是二维矩阵时才可以这样理解。axis的实际含义是根据axis指定的维度进行连接,如矩阵m1的维度为(2,3), 那么axis=0就代表了第一个维度‘2',因此,将m1和m2按照第一个维度进行连接,得到的新的矩阵就是将第一维度进行相加,其余维度不变,即维度变成了(4,3).

同理,axis=1时就是将矩阵的第二维度进行合并,其余维度不变,即维度变成了(2,6)。

接下来处理三个维度的数据,这也是我们在神经网络数据中经常要用到的,增加的一个维度通常代表了batch_size. 如下面的m5, batch_size=5, 可以理解为每个样本是个2*3的矩阵,一次将5个样本放在一起。

m5 = np.random.rand(5,2,3)
m6 = np.random.rand(5,2,3)
m5
>>array([[[0.04347217, 0.03368232, 0.36017024],
    [0.74223151, 0.06609717, 0.38155531]],

    [[0.50602728, 0.355745 , 0.93379797],
    [0.97572621, 0.53745311, 0.66461841]],

    [[0.92832972, 0.02441683, 0.48436203],
    [0.69651043, 0.24194495, 0.64623769]],

    [[0.66667596, 0.60053027, 0.2970753 ],
    [0.13281764, 0.29326326, 0.32393028]],

    [[0.40892782, 0.48516547, 0.02298178],
    [0.51239083, 0.40151008, 0.29913204]]])
m6
>>array([[[0.58001909, 0.56925704, 0.09798246],
    [0.20841893, 0.62683633, 0.17923217]],

    [[0.91216164, 0.0200782 , 0.3986682 ],
    [0.86687006, 0.83730576, 0.48443545]],

    [[0.65641654, 0.59786311, 0.2055584 ],
    [0.65391822, 0.74093133, 0.02416627]],

    [[0.80778861, 0.22644312, 0.91610686],
    [0.0789411 , 0.86955002, 0.41437046]],

    [[0.97821668, 0.97118328, 0.97714882],
    [0.21543173, 0.06964724, 0.35360077]]])

在这种情况下,axis=0代表的第一个维度的含义就不再是之前认为的行的概念了,现在m5的第一维度的值是5,代表的是batch_size。仍然按照之前的理解,如果设置axis=0, axis=0就是将第一维度进行相加,其余维度不变,因此我们可以得到新的维度为(10,2,3)。

m7 = tf.concat([m5, m6],axis=0)
m7
>> array([[[0.04347217, 0.03368232, 0.36017024],
    [0.74223151, 0.06609717, 0.38155531]],

    [[0.50602728, 0.355745 , 0.93379797],
    [0.97572621, 0.53745311, 0.66461841]],

    [[0.92832972, 0.02441683, 0.48436203],
    [0.69651043, 0.24194495, 0.64623769]],

    [[0.66667596, 0.60053027, 0.2970753 ],
    [0.13281764, 0.29326326, 0.32393028]],

    [[0.40892782, 0.48516547, 0.02298178],
    [0.51239083, 0.40151008, 0.29913204]],

    [[0.58001909, 0.56925704, 0.09798246],
    [0.20841893, 0.62683633, 0.17923217]],

    [[0.91216164, 0.0200782 , 0.3986682 ],
    [0.86687006, 0.83730576, 0.48443545]],

    [[0.65641654, 0.59786311, 0.2055584 ],
    [0.65391822, 0.74093133, 0.02416627]],

    [[0.80778861, 0.22644312, 0.91610686],
    [0.0789411 , 0.86955002, 0.41437046]],

    [[0.97821668, 0.97118328, 0.97714882],
    [0.21543173, 0.06964724, 0.35360077]]])
m7.shape
>>(10,2,3)

同理,也可以进行axis=1, axis=2的concat操作。

此外,axis的值也可以设置为负数,如axis=-1实际上就是指倒数第一个维度,如m5的倒数第一个维度的值就是‘3'。因此,axis=2的操作和axis=-1的操作是等价的。

以上这篇tf.concat中axis的含义与使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python随机生成指定长度密码的方法
Apr 04 Python
Python端口扫描简单程序
Nov 10 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
Python转换时间的图文方法
Jul 01 Python
python UDP(udp)协议发送和接收的实例
Jul 22 Python
Python socket 套接字实现通信详解
Aug 27 Python
python生成器用法实例详解
Nov 22 Python
Python pandas库中的isnull()详解
Dec 26 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 #Python
Python for循环通过序列索引迭代过程解析
Feb 07 #Python
python中with用法讲解
Feb 07 #Python
如何基于Python实现数字类型转换
Feb 07 #Python
Python while循环使用else语句代码实例
Feb 07 #Python
Python matplotlib画曲线例题解析
Feb 07 #Python
python next()和iter()函数原理解析
Feb 07 #Python
You might like
PHP操作数组相关函数
2011/02/03 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
python中线程和进程有何区别
2020/06/17 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
学生党支部先进事迹
2014/02/04 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
数控机床专业自荐信
2014/05/19 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
通讯稿格式及范文
2015/07/22 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis