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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
用Python实现随机森林算法的示例
Aug 24 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
python绘制中国大陆人口热力图
Nov 07 Python
opencv与numpy的图像基本操作
Mar 08 Python
python操作日志的封装方法(两种方法)
May 23 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
Python通用唯一标识符uuid模块使用案例
Sep 10 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
详解scrapy内置中间件的顺序
Sep 28 Python
python归并排序算法过程实例讲解
Nov 04 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
如何离线执行php任务
2017/02/21 PHP
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
Python每天必学之bytes字节
2016/01/28 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python退火算法在高次方程的应用
2018/07/26 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
Python实现FTP文件传输的实例
2019/07/07 Python
Python可以实现栈的结构吗
2020/05/27 Python
Python异常处理机制结构实例解析
2020/07/23 Python
python字典key不能是可以是啥类型
2020/08/04 Python
python实现xml转json文件的示例代码
2020/12/30 Python
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
C和C++经典笔试题附答案解析
2014/08/18 面试题
开工仪式主持词
2014/03/20 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
师德承诺书
2015/01/20 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python