[TensorFlow系列-14]:TensorFlow基础 - 张量的操作 - 拼接与堆叠
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119651137
目录
第2章 增加张量长度的拼接:tf.tf.concat(values, axis)
第3章 增加张量维度的拼接:tf.stack(values, axis=0)
第1章 Tensor运算概述
https://tensorflow.google.cn/api_docs/python/tf
1.1 概述
Tensor提供了大量的张量运算,基本上可以对标Numpy多维数组的运算,以支持对张量的各种复杂的运算。
这些操作运算中大多是对数组中每个元素执行相同的函数运算,并获得每个元素函数运算的结果序列,这些序列生成一个新的同维度的数组。
不同维度张量的维度方向标识
- 随着张量维度的增加,张量维度的标识dim的范围也在扩宽
- 在张量维度扩展的过程中,维度标识值(dim=n)的含义也在发生变化。
- dim=0总是指向张量的多维数组存储的最外层:[ ] [ ] [ ], 这与物理存储的标识是相反的。
1.2 运算分类
(1)算术运算:加、减、系数乘、系数除
(2)函数运算:sin,cos
(3)取整运算:上取整、下取整
(4)统计运算:最大值、最小值、均值
(5)比较运算:大于,等于,小于、排序
(6)线性代数运算:矩阵、点乘、叉乘
1.3 张量的操作与变换
(1)变换内容: 变换张量元素的值。
(1)变换长度:变换张量的某个方向的长度(即向量的维度或长度),长度可增加,可减少。
(3)变换维度:变化张量的维度,维度可以增加,可减少。
1.4 环境准备
#环境准备
import numpy as np
import tensorflow as tf
print("hello world")
print("tensorflow version:", tf.__version__)
1.5 张量的操作 - 拼接与堆叠
两个张量合并的策略有:
(1)拼接:tf.concat
在原有张量的基础上,不增加张量的维度,只增加某个维度方向的长度,即在某个维度方向的长度上进行合并,这就是拼接。如下图所示:
(2)堆叠:tf.stack()
不改变现有张量每个维度的长度,把一个张量整体,作为一个新的维度,与另一张量合并,这就是堆叠。如下图所示:
stack要求两个张量的维度以及各个维度的长度 必须相等。
第2章 增加张量长度的拼接:tf.tf.concat(values, axis)
2.1 基本原理
2.2 函数说明
功能:在不改变张量维度的情况下,通过增加张量在某个维度方向的长度,把两个张量拼接起来。
原型:tf.concat(values, axis)
输入参数:
input: 输入张量
dim:拼接的方向, 由于可以在多个方向进行拼接,因此,必须指定在哪个维度方向上进行拼接 。
2.3 代码示例
(1)按照dim =0 的方向拼接
# 代码示例
# 张量的拼接:阶数不变,增加dim方向的长度
a = tf.constant([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = tf.constant([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量a")
print(a)
print(tf.rank(a))
print(tf.shape(a))
print(tf.size(a))
print("\n源张量b")
print(b)
print(tf.rank(b))
print(tf.shape(b))
print(tf.size(b))
print("\n按照dim=0方向拼接")
c = tf.concat((a,b),axis=0)
print(c)
print(tf.rank(c))
print(tf.shape(c))
print(tf.size(c))
源张量a
tf.Tensor(
[[1 1 1 1]
[2 2 2 2]
[3 3 3 3]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
源张量b
tf.Tensor(
[[4 4 4 4]
[5 5 5 5]
[5 5 5 5]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
按照dim=0方向拼接
tf.Tensor(
[[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[4 4 4 4]
[5 5 5 5]
[5 5 5 5]], shape=(6, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([6 4], shape=(2,), dtype=int32)
tf.Tensor(24, shape=(), dtype=int32)
(2)按照dim=1的方向进行拼接
# 张量的拼接:阶数不变,增加dim方向的长度
a = tf.constant([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
b = tf.constant([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("源张量a")
print(a)
print(tf.rank(a))
print(tf.shape(a))
print(tf.size(a))
print("\n源张量b")
print(b)
print(tf.rank(b))
print(tf.shape(b))
print(tf.size(b))
print("\n按照dim=0方向拼接")
c = tf.concat((a,b),axis=1)
print(c)
print(tf.rank(c))
print(tf.shape(c))
print(tf.size(c))
输出:
源张量a
tf.Tensor(
[[1 1 1 1]
[2 2 2 2]
[3 3 3 3]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
源张量b
tf.Tensor(
[[4 4 4 4]
[5 5 5 5]
[5 5 5 5]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
按照dim=0方向拼接
tf.Tensor(
[[1 1 1 1 4 4 4 4]
[2 2 2 2 5 5 5 5]
[3 3 3 3 5 5 5 5]], shape=(3, 8), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 8], shape=(2,), dtype=int32)
tf.Tensor(24, shape=(), dtype=int32)
第3章 增加张量维度的拼接:tf.stack(values, axis=0)
3.1 基本原理
stack堆叠,可以增加一个维度,因此案例中dim=0,1,2 三种情形,在三种方向进行堆叠。
这里的dim就是axis的意思,即维度方向。
(1)按照dim = 0的方向堆叠
(2)按照dim = 1的方向堆叠
(3)按照dim = 2的方向堆叠
2.2 函数说明
功能:通过增加张量维度,把两个张量堆叠起来,堆叠后,维度增加1.
原型:stack(values, axis)
输入参数:
values: 输入张量
axis:拼接的方向,这里的axis是指拼接后张量的axis,而不是原张量的axis
2.3 代码示例
(1)axis=0的方向
# 张量的拼接:增加阶数,
a = tf.constant([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
print("源张量a")
print(a)
print(tf.rank(a))
print(tf.shape(a))
print(tf.size(a))
b = tf.constant([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("\n源张量b")
print(b)
print(tf.rank(b))
print(tf.shape(b))
print(tf.size(b))
print("\n按照axis=0方向拼接:扩展阶数")
c = tf.stack((a,b),axis=0)
print(c)
print(tf.rank(c))
print(tf.shape(c))
print(tf.size(c))
输出:
源张量a
tf.Tensor(
[[1 1 1 1]
[2 2 2 2]
[3 3 3 3]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
源张量b
tf.Tensor(
[[4 4 4 4]
[5 5 5 5]
[5 5 5 5]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
按照axis=0方向拼接:扩展阶数
tf.Tensor(
[[[1 1 1 1]
[2 2 2 2]
[3 3 3 3]]
[[4 4 4 4]
[5 5 5 5]
[5 5 5 5]]], shape=(2, 3, 4), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor([2 3 4], shape=(3,), dtype=int32)
tf.Tensor(24, shape=(), dtype=int32)
(2)axis=1的方向
# 张量的拼接:增加阶数,
a = tf.constant([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
print("源张量a")
print(a)
print(tf.rank(a))
print(tf.shape(a))
print(tf.size(a))
b = tf.constant([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("\n源张量b")
print(b)
print(tf.rank(b))
print(tf.shape(b))
print(tf.size(b))
print("\n按照axis=1方向拼接:扩展阶数")
c = tf.stack((a,b),axis=1)
print(c)
print(tf.rank(c))
print(tf.shape(c))
print(tf.size(c))
输出:
源张量a
tf.Tensor(
[[1 1 1 1]
[2 2 2 2]
[3 3 3 3]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
源张量b
tf.Tensor(
[[4 4 4 4]
[5 5 5 5]
[5 5 5 5]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
按照axis=1方向拼接:扩展阶数
tf.Tensor(
[[[1 1 1 1]
[4 4 4 4]]
[[2 2 2 2]
[5 5 5 5]]
[[3 3 3 3]
[5 5 5 5]]], shape=(3, 2, 4), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor([3 2 4], shape=(3,), dtype=int32)
tf.Tensor(24, shape=(), dtype=int32)
(3)axis=2的方向
# 张量的拼接:增加阶数,
a = tf.constant([[1,1,1,1], [2,2,2,2],[3,3,3,3]])
print("源张量a")
print(a)
print(tf.rank(a))
print(tf.shape(a))
print(tf.size(a))
b = tf.constant([[4,4,4,4], [5,5,5,5],[5,5,5,5]])
print("\n源张量b")
print(b)
print(tf.rank(b))
print(tf.shape(b))
print(tf.size(b))
print("\n按照axis=1方向拼接:扩展阶数")
c = tf.stack((a,b),axis=2)
print(c)
print(tf.rank(c))
print(tf.shape(c))
print(tf.size(c))
输出:
源张量a
tf.Tensor(
[[1 1 1 1]
[2 2 2 2]
[3 3 3 3]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
源张量b
tf.Tensor(
[[4 4 4 4]
[5 5 5 5]
[5 5 5 5]], shape=(3, 4), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor([3 4], shape=(2,), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
按照axis=1方向拼接:扩展阶数
tf.Tensor(
[[[1 4]
[1 4]
[1 4]
[1 4]]
[[2 5]
[2 5]
[2 5]
[2 5]]
[[3 5]
[3 5]
[3 5]
[3 5]]], shape=(3, 4, 2), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor([3 4 2], shape=(3,), dtype=int32)
tf.Tensor(24, shape=(), dtype=int32)
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119481948
更多推荐
所有评论(0)