【Tensorflow】tf.reduce_sum()方法深度解析

本文详细介绍了TensorFlow中tf.reduce_sum方法及其参数。先展示了该方法对一维、二维、三维矩阵所有元素求和并降维至一维的情况,此时与numpy.sum方法类似。接着重点讲解改变axis参数值的运算,以三维矩阵为例解释了axis与矩阵shape的关系,最后总结该方法可沿轴求和并降维,类似方法还有reduce_max等。
部署运行你感兴趣的模型镜像

首先看一下reduce_sum及其参数的注释 :

def tf.reduce_sum(input_tensor, axis=None, keepdims=False, name=None)

 Computes the sum of elements across dimensions of a tensor.

Reduces input_tensor along the dimensions given in axis. Unless keepdims is true, the rank of the tensor is reduced by 1 for each entry in axis. If keepdims is true, the reduced dimensions are retained with length 1.

If axis is None, all dimensions are reduced, and a tensor with a
single element is returned.

1 参数只有一个矩阵 input_tensor,其余参数为默认

下面我们用三个张量为例(下统一称为矩阵),对一维向量,二维矩阵,三维矩阵分别执行其余参数为默认的reduce_sum()运算。

x_dim_1 = tf.constant([1,2,3])
z = tf.reduce_sum(x_dim_1)
print("1D sum :")
print(z)

x_dim_2 = tf.constant([[1,2,3],[4,5,6]])
z = tf.reduce_sum(x_dim_2)
print("2D sum :")
print(z)

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

z = tf.reduce_sum(x_dim_3)
print("3D sum :")
print(z)

输出结果如下:

在这里插入图片描述

不难看出,无论是对几维矩阵而言,tf.reduce_sum()方法均对矩阵的所有元素进行求和,并将结果降维至一维,返回一个数值(0维矩阵)。 在这种情况下,tf.reduce_sum()方法与我们熟悉的numpy.sum()方法可以说在矩阵运算方面别无二致,同时也符合注释中所说 :
 

If axis is None, all dimensions are reduced, and a tensor with a
single element is returned.

 2 保持keepdims参数为false,改变axis参数的值进行运算

这个部分就是reduce_sum的灵魂所在,其关键是要理解所谓axis参数对于高维矩阵的意义。
不妨先看看,如果我们打印出上述代码中的三个矩阵常量的shape,会得到什么:

 在这里插入图片描述

需要理解的是,对于高维矩阵来说,其每一个元素都是一个低维矩阵。 例如,对于一维矩阵(数组) x_dim_1 而言,每一个元素都是一个0维的数组(数值) : 1,2,3。 对于高维矩阵,以三维矩阵x_dim_3 为例,其每一个元素都是一个二维的矩阵,这些二维矩阵中的每一个元素都是一个一维数组,这些一维数组中的每个元素都是一个0维矩阵(数值)。

听起来好像像绕口令,那么我们就以x_dim_3为例,具体解释axis与矩阵的shape之间的关系。
x_dim_3 = [ [ [1,2],[2,3],[3,4] ],
[ [4,5],[5,6],[6,7] ] ]

首先我们不难看出,这是一个三维矩阵。那么该矩阵包含了几个二维矩阵的元素呢,我们不难看出包含了两个,分别是 [ [1,2],[2,3],[3,4] ] 以及 [ [4,5],[5,6],[6,7] ] 两个二维矩阵。那么对于每一个作为元素的二维矩阵,又包含了多少个一维数组呢,显然,每一个二维矩阵都包含了三个一维数组。以第一个二维数组元素为例,包含了[1,2],[2,3],[3,4]三个一维数组元素。而每一个一维数组元素,又分别包含了两个0维数组(数值)。

这就是张量 x_dim_3 的shape的构成(2,3,2),其代表的数学意义为,这个三维矩阵包含了两个二维矩阵元素,每一个二维矩阵又包含了三个一维矩阵元素,每一个一维矩阵又包含了两个数值。同时,三个数值分别对应了axis=0 axis=1 axis=2 三个轴分别包含的元素个数。

问题实际变成了,沿着axis=0 : 对包含的两个二维矩阵元素进行求和, 沿着axis=1 : 对该维度包含的三个一维矩阵进行求和,沿着axis = 2 : 对该维度包含的两个数值进行求和。 下面放出对x_dim_3的测试及输出结果。
 

# 沿着axis = 0 对三维矩阵进行降维求和 实际就是对两个二维矩阵元素进行加法运算
x_dim_3 = tf.constant([[[1,2],[2,3],[3,4]],
            [[4,5],[5,6],[6,7]]])
z = tf.reduce_sum(x_dim_3,axis=0)
print(z)

输出结果如下:

在这里插入图片描述

在这里插入图片描述

 

# 沿着axis=1 对三维矩阵进行降维求和 
x_dim_3 = tf.constant([[[1,2],[2,3],[3,4]],
            [[4,5],[5,6],[6,7]]])
z = tf.reduce_sum(x_dim_3,axis=1)
print(z)

在这里插入图片描述

# 沿着axis=2对三维矩阵进行降维求和 
x_dim_3 = tf.constant([[[1,2],[2,3],[3,4]],
            [[4,5],[5,6],[6,7]]])
z = tf.reduce_sum(x_dim_3,axis=2)
print(z)

在这里插入图片描述

 3 总结

reduce_sum方法人如其名,减少维度的同时对矩阵内部沿着某一轴进行求和。与之类似的方法还有reduce_max, reduce_min, reduce_mean,他们关于axis参数的使用与本篇文章中分析的是别无二致的。当然,axis可以不是一个数值,而是一个矩阵,有兴趣的可以进一步探索与发现。
 

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think>好的,用户问的是“tf.reduce_mean(tf.square(y_true - y_pred))是什么意思”。首先,我需要确认用户的背景。可能是一个刚开始学习TensorFlow深度学习的新手,对损失函数的计算不太清楚。用户可能在使用神经网络时遇到了这个表达式,想要理解它的数学含义和具体作用。 接下来,我需要分解这个表达式。首先,y_true代表真实标签,y_pred是模型预测值。tf.square计算的是两者的差的平方,这应该是均方误差(MSE)的一部分。然后tf.reduce_mean对所有这些平方差求平均,所以整体就是MSE损失函数。 用户可能知道MSE是什么,但不确定这个TensorFlow代码如何对应到公式。需要解释清楚每个函数的作用,以及为什么这样组合就是MSE。此外,用户可能想知道这在训练模型时的作用,比如作为损失函数如何帮助优化模型参数。 还要考虑用户可能的疑问点,比如reduce_mean的作用,是否只是简单的平均?可能需要进一步说明TensorFlow中张量的操作,比如如果y_true和y_pred是多维的,reduce_mean会在所有维度上求平均,还是只在某个轴上?可能需要提到这一点,但根据常见用法,通常是对所有元素求平均。 另外,用户可能没有意识到,这个表达式是回归任务中常用的损失函数,用于衡量预测值与真实值之间的差距。可以举个简单的例子,比如具体数值的计算过程,帮助用户更直观地理解。 最后,需要确认是否还有其他相关问题,比如与其他损失函数的对比,或者如何在实际模型中使用这个表达式。不过根据当前问题,只需解释清楚这个特定表达式的含义即可,但可以简要提到应用场景,比如在编译模型时作为loss参数传递。</think>### **分步解析`tf.reduce_mean(tf.square(y_true - y_pred))`** #### **第1步:理解基本组成** ```python # 代码结构分解 差值计算 → y_true - y_pred # 真实值与预测值的逐元素差 平方运算 → tf.square(...) # 对差值取平方 均值计算 → tf.reduce_mean(...) # 全局平均值计算 ``` #### **第2步:数学表达式对应关系** $$ \text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_{\text{true}}^{(i)} - y_{\text{pred}}^{(i)})^2 $$ - **$y_{\text{true}}$**:真实标签张量(Ground Truth) - **$y_{\text{pred}}$**:模型预测输出张量 - **$n$**:参与计算的总元素数(自动适应不同维度) #### **第3步:Tensor维度处理机制** | 输入维度 | 计算过程 | 输出维度 | 示例 | |---------|----------|----------|------| | 标量 → (1,) | 单值直接计算 | 标量 | `y_true=2`, `y_pred=3` → 输出1.0 | | 向量 → (batch_size,) | 批量独立计算 | 标量 | 输入(128,) → 输出() | | 矩阵 → (batch, features) | 全体元素参与平均 | 标量 | 输入(32,10) → 输出() | | 高维张量 → (b,c,h,w) | 展平后统一计算 | 标量 | 输入(16,3,224,224) → 输出() | #### **第4步:数值计算示例** 假设: ```python y_true = [2.0, 4.0, 6.0] # 真实值 y_pred = [1.5, 3.8, 5.9] # 预测值 ``` 计算过程: 1. 差值计算:`[2.0-1.5, 4.0-3.8, 6.0-5.9] = [0.5, 0.2, 0.1]` 2. 平方运算:`[0.25, 0.04, 0.01]` 3. 均值计算:`(0.25 + 0.04 + 0.01)/3 ≈ 0.10` #### **第5步:梯度计算特性** $$ \frac{\partial \text{MSE}}{\partial y_{\text{pred}}} = \frac{2}{n}(y_{\text{pred}} - y_{\text{true}}) $$ - 梯度随误差线性变化 - 大误差样本对参数更新影响更大 #### **第6步:实际应用场景** 1. **回归任务标准配置** ```python model.compile(optimizer='adam', loss='mse') # 直接使用字符串'mse'等效 ``` 2. **自定义损失组件** ```python def custom_loss(y_true, y_pred): mse = tf.reduce_mean(tf.square(y_true - y_pred)) reg = tf.reduce_sum(model.losses) # 正则项 return mse + 0.01*reg ``` 3. **多任务学习基准** ```python loss1 = tf.reduce_mean(tf.square(y_true1 - y_pred1)) loss2 = tf.reduce_mean(tf.square(y_true2 - y_pred2)) total_loss = 0.7*loss1 + 0.3*loss2 ``` #### **第7步:与其他损失函数的对比** | 损失函数类型 | 公式 | 适用场景 | 梯度特性 | |------------|------|----------|----------| | MSE | $\frac{1}{n}\sum(y_{\text{true}}-y_{\text{pred}})^2$ | 回归问题 | 均匀敏感 | | MAE | $\frac{1}{n}\sum\|y_{\text{true}}-y_{\text{pred}}\|$ | 异常值抵抗 | 恒定梯度 | | Huber Loss | $\begin{cases}0.5\delta^2 & |\delta|<\epsilon \\ \epsilon(|\delta|-\frac{\epsilon}{2}) & \text{其他}\end{cases}$ | 鲁棒回归 | 自适应平滑 | #### **第8步:数值稳定性增强技巧** ```python # 改进方案1:添加极小值防止除零 tf.reduce_mean(tf.square(y_true - y_pred) + 1e-7) # 改进方案2:对数域计算(适用于大范围数值) tf.reduce_mean(tf.math.log(tf.square(y_true - y_pred) + 1.0)) ``` #### **第9步:扩展应用——加权MSE** ```python sample_weights = [0.2, 0.5, 0.3] # 样本权重 weighted_mse = tf.reduce_mean(tf.square(y_true - y_pred) * sample_weights) ``` #### **第10步:调试建议** 1. **形状验证** ```python print(y_true.shape, y_pred.shape) # 必须完全相同 ``` 2. **数值范围检查** ```python tf.debugging.assert_all_finite(y_pred, "预测值包含非法数值") ``` 3. **梯度可视化** ```python with tf.GradientTape() as tape: loss = tf.reduce_mean(tf.square(y_true - y_pred)) grads = tape.gradient(loss, model.trainable_variables) plot_gradients(grads) # 自定义梯度分布可视化 ``` --- ### **关键理解要点** 1. **误差放大效应** 平方运算会使较大误差产生更强的梯度信号,引导模型优先修正显著偏差 2. **量纲一致性** 输出值量纲为原始数据的平方单位,需注意数据标准化处理 (建议训练前对数据进行归一化:$x_{\text{norm}} = \frac{x - \mu}{\sigma}$) 3. **批次敏感性** 小批量训练时可能产生波动,建议配合指数移动平均监控 ```python ema = tf.train.ExponentialMovingAverage(decay=0.99) ema_loss = ema.apply([loss]) ``` 4. **硬件加速优化** TensorFlow XLA编译器会自动优化为等效矩阵运算: $$\text{MSE} = \frac{1}{n}\|\mathbf{y}_{\text{true}} - \mathbf{y}_{\text{pred}}\|_2^2$$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值