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函数装饰器用法实例详解
Jun 04 Python
python定时器(Timer)用法简单实例
Jun 04 Python
Python KMeans聚类问题分析
Feb 23 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
python批量下载抖音视频
Jun 17 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python 基于opencv实现图像增强
Dec 23 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中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
php不写闭合标签的好处
2014/03/04 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
jquery easyui使用心得
2014/07/07 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
原生js实现随机点名
2020/07/05 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
wxpython 学习笔记 第一天
2009/02/09 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
商务专员岗位职责
2013/11/23 职场文书
母亲追悼会答谢词
2014/01/27 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
小学庆六一主持词
2015/06/30 职场文书
公司管理建议书
2015/09/14 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js