目录
文章目录隐藏
  1. TensorFlow 张量操作基础
  2. 张量创建方法
  3. 张量数学运算
  4. 张量形状操作
  5. 张量索引和切片
  6. 张量广播机制
  7. 张量聚合操作
  8. 张量拼接与分割
  9. 张量排序操作
  10. 张量高级操作
  11. 张量梯度计算
  12. 张量与 Numpy 互操作

本文关于 TensorFlow 中的张量基础操作,涵盖张量创建、数学运算、形状操作、索引切片、广播机制、聚合操作、排序及高级操作等核心内容,希望对大家有帮助。

TensorFlow 张量操作

TensorFlow 张量操作基础

张量是 TensorFlow 中的核心数据结构,可以理解为多维数组。张量的秩表示其维度数量,例如标量是 0 维张量,向量是 1 维张量,矩阵是 2 维张量。

import tensorflow as tf

# 创建标量
scalar = tf.constant(5)
# 创建向量
vector = tf.constant([1, 2, 3])
# 创建矩阵
matrix = tf.constant([[1, 2], [3, 4]])
# 创建 3 维张量
tensor = tf.constant([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

张量创建方法

TensorFlow 提供了多种创建张量的方式,包括从 Python 列表、Numpy 数组创建,以及生成特定模式的张量。

# 从 Python 列表创建
tensor_from_list = tf.convert_to_tensor([1, 2, 3])

# 从 Numpy 数组创建
import numpy as np
array = np.array([[1, 2], [3, 4]])
tensor_from_np = tf.convert_to_tensor(array)

# 生成全零张量
zeros = tf.zeros([2, 3])

# 生成全一张量
ones = tf.ones([3, 2])

# 生成随机正态分布张量
randn = tf.random.normal([2, 2], mean=0.0, stddev=1.0)

# 生成均匀分布张量
randu = tf.random.uniform([3, 3], minval=0, maxval=1)

张量数学运算

张量支持各种数学运算,包括逐元素运算和矩阵运算。

a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 6], [7, 8]])

# 逐元素加法
add = tf.add(a, b)

# 逐元素乘法
mul = tf.multiply(a, b)

# 矩阵乘法
matmul = tf.matmul(a, b)

# 张量求和
sum_all = tf.reduce_sum(a)
sum_axis0 = tf.reduce_sum(a, axis=0)
sum_axis1 = tf.reduce_sum(a, axis=1)

# 张量平均值
mean = tf.reduce_mean(a)

# 张量最大值
max_val = tf.reduce_max(a)

张量形状操作

改变张量形状是常见的操作,TensorFlow 提供了多种形状操作方法。

tensor = tf.constant([[1, 2], [3, 4], [5, 6]])

# 获取张量形状
shape = tensor.shape

# 改变张量形状
reshaped = tf.reshape(tensor, [2, 3])

# 转置张量
transposed = tf.transpose(tensor)

# 扩展维度
expanded = tf.expand_dims(tensor, axis=0)

# 压缩维度
squeezed = tf.squeeze(expanded)

张量索引和切片

TensorFlow 支持类似 Numpy 的索引和切片操作。

tensor = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 获取单个元素
elem = tensor[1, 2]  # 获取第 2 行第 3 列的元素

# 获取行切片
row_slice = tensor[1:, :]  # 获取第 2 行及以后的所有行

# 获取列切片
col_slice = tensor[:, 1]  # 获取第 2 列

# 使用步长切片
strided_slice = tensor[::2, ::2]  # 每隔 2 个元素取一个

张量广播机制

TensorFlow 支持广播机制,允许不同形状的张量进行运算。

a = tf.constant([[1, 2, 3]])  # 形状(1,3)
b = tf.constant([[4], [5], [6]])  # 形状(3,1)

# 广播加法
c = a + b  # 结果形状(3,3)

张量聚合操作

TensorFlow 提供了多种聚合操作函数。

tensor = tf.constant([[1, 2, 3], [4, 5, 6]])

# 沿轴 0 求和
sum0 = tf.reduce_sum(tensor, axis=0)  # [5,7,9]

# 沿轴 1 求最大值
max1 = tf.reduce_max(tensor, axis=1)  # [3,6]

# 计算逻辑与
logical = tf.reduce_all(tensor > 3)  # False

# 计算均值
mean = tf.reduce_mean(tensor)  # 3.5

张量拼接与分割

TensorFlow 支持张量的拼接和分割操作。

a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 6], [7, 8]])

# 沿轴 0 拼接
concat0 = tf.concat([a, b], axis=0)

# 沿轴 1 拼接
concat1 = tf.concat([a, b], axis=1)

# 张量分割
split0 = tf.split(a, num_or_size_splits=2, axis=0)
split1 = tf.split(a, num_or_size_splits=[1, 1], axis=1)

张量排序操作

TensorFlow 提供了排序和 top-k 操作。

tensor = tf.constant([[3, 1, 4], [1, 5, 9]])

# 排序
sorted_values, sorted_indices = tf.sort(tensor, direction='DESCENDING')

# argsort
argsort = tf.argsort(tensor)

# top-k
top_k_values, top_k_indices = tf.math.top_k(tensor, k=2)

张量高级操作

TensorFlow 还提供了一些高级张量操作。

# 张量收集
tensor = tf.constant([[0, 1, 2], [3, 4, 5]])
indices = tf.constant([0, 1])
gathered = tf.gather(tensor, indices)  # 收集第 0 行和第 1 行

# 张量分散
updates = tf.constant([10, 20])
scattered = tf.tensor_scatter_nd_update(tensor, [[0, 0], [1, 1]], updates)

# 张量条件操作
cond = tf.where(tensor > 3, tensor, tf.zeros_like(tensor))  # 大于 3 保留原值,否则设为 0

张量梯度计算

TensorFlow 支持自动微分,可以计算张量操作的梯度。

x = tf.Variable(3.0)
with tf.GradientTape() as tape:
    y = x ** 2 + 2 * x + 1
dy_dx = tape.gradient(y, x)  # 2x + 2 = 8

张量与 Numpy 互操作

TensorFlow 张量和 Numpy 数组可以方便地相互转换。

# 张量转 Numpy 数组
tensor = tf.constant([[1, 2], [3, 4]])
numpy_array = tensor.numpy()

# Numpy 数组转张量
new_tensor = tf.convert_to_tensor(numpy_array)

以上关于TensorFlow 张量操作的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
码云笔记 » TensorFlow 张量操作

发表回复