[TensorFlow系列-14]:TensorFlow基础 - 张量的操作 - 拼接与堆叠

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119651137


目录

第1章 Tensor运算概述

1.1 概述

1.3 张量的操作与变换

1.4 环境准备

1.5 张量的操作 - 拼接与堆叠

 第2章 增加张量长度的拼接:tf.tf.concat(values, axis)

2.2 函数说明

2.3 代码示例

第3章 增加张量维度的拼接:tf.stack(values, axis=0)

 3.1 基本原理

2.2 函数说明

2.3 代码示例


第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

在原有张量的基础上,不增加张量的维度,只增加某个维度方向的长度,即在某个维度方向的长度上进行合并,这就是拼接。如下图所示:

[TensorFlow系列-14]:TensorFlow基础 - 张量的操作 - 拼接与堆叠_第1张图片

[TensorFlow系列-14]:TensorFlow基础 - 张量的操作 - 拼接与堆叠_第2张图片

(2)堆叠:tf.stack()

不改变现有张量每个维度的长度,把一个张量整体,作为一个新的维度,与另一张量合并,这就是堆叠。如下图所示:

[TensorFlow系列-14]:TensorFlow基础 - 张量的操作 - 拼接与堆叠_第3张图片

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

你可能感兴趣的:(人工智能-TensorFlow,人工智能-深度学习,深度学习,张量,Tensorflow,裁剪)