tensorflow中 tf.reduce_XX函数

本文详细介绍了TensorFlow中的tf.reduce_mean函数,该函数用于计算张量沿指定轴的平均值,适用于图像处理和数据降维。文章通过实例展示了如何使用此函数,并对比了其他降维操作。

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
 

reduce_mean(input_tensor,
                axis=None,
                keep_dims=False,
                name=None,
                reduction_indices=None)
  1. 第一个参数input_tensor: 输入的待降维的tensor;
  2. 第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
  3. 第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
  4. 第四个参数name: 操作的名称;
  5. 第五个参数 reduction_indices:在以前版本中用来指定轴,已弃用;

以一个维度是2,形状是[3,3]的tensor举例:

import tensorflow as tf
 
x = [[1,2,3],
      [1,2,3]]
 
xx = tf.cast(x,tf.float32)
 
mean_all = tf.reduce_mean(xx, keep_dims=False)
mean_0 = tf.reduce_mean(xx, axis=0, keep_dims=False)
mean_1 = tf.reduce_mean(xx, axis=1, keep_dims=False)
 
 
with tf.Session() as sess:
    m_a,m_0,m_1 = sess.run([mean_all, mean_0, mean_1])
 
print m_a    # output: 2.0
print m_0    # output: [ 1.  2.  3.]
print m_1    #output:  [ 2.  2.]

如果设置保持原来的张量的维度,keep_dims=True ,结果:

print m_a    # output: [[ 2.]]
print m_0    # output: [[ 1.  2.  3.]]
print m_1    #output:  [[ 2.], [ 2.]]

类似函数还有:

  • tf.reduce_sum :计算tensor指定轴方向上的所有元素的累加和;
  • tf.reduce_max  :  计算tensor指定轴方向上的各个元素的最大值;
  • tf.reduce_all :  计算tensor指定轴方向上的各个元素的逻辑和(and运算);
  • tf.reduce_any:  计算tensor指定轴方向上的各个元素的逻辑或(or运算);
     
def compute_loss(model, X_ic, X_bc, X_pde): # 初始条件损失(t=0时的解) t_ic, x_ic, h_real_ic, h_imag_ic = X_ic with tf.GradientTape() as tape: u_pred_ic, v_pred_ic = model(tf.stack([t_ic, x_ic], axis=1)) loss_ic = tf.reduce_mean(tf.square(u_pred_ic - h_real_ic) + tf.reduce_mean(tf.square(v_pred_ic - h_imag_ic)) # 周期性边界条件损失(x=-5和x=5处的解和导数相等) t_bc, x_bc_left, x_bc_right = X_bc # 左边界预测 u_left, v_left = model(tf.stack([t_bc, x_bc_left], axis=1)) u_x_left = tape.gradient(u_left, x_bc_left) v_x_left = tape.gradient(v_left, x_bc_left) # 右边界预测 u_right, v_right = model(tf.stack([t_bc, x_bc_right], axis=1)) u_x_right = tape.gradient(u_right, x_bc_right) v_x_right = tape.gradient(v_right, x_bc_right) # 边界损失 loss_bc = (tf.reduce_mean(tf.square(u_left - u_right)) + tf.reduce_mean(tf.square(v_left - v_right)) + tf.reduce_mean(tf.square(u_x_left - u_x_right)) + tf.reduce_mean(tf.square(v_x_left - v_x_right))) # PDE残差损失(方程本身的误差) t_pde, x_pde = X_pde with tf.GradientTape(persistent=True) as tape: tape.watch([t_pde, x_pde]) u_pde, v_pde = model(tf.stack([t_pde, x_pde], axis=1)) # 计算二阶导数 u_x = tape.gradient(u_pde, x_pde) u_xx = tape.gradient(u_x, x_pde) v_x = tape.gradient(v_pde, x_pde) v_xx = tape.gradient(v_x, x_pde) # 计算时间导数 u_t = tape.gradient(u_pde, t_pde) v_t = tape.gradient(v_pde, t_pde) # PDE残差 f_real = -v_t + 0.5 * u_xx + (u_pde**2 + v_pde**2) * u_pde f_imag = u_t + 0.5 * v_xx + (u_pde**2 + v_pde**2) * v_pde loss_pde = tf.reduce_mean(tf.square(f_real) + tf.square(f_imag)) # 总损失(加权求和) total_loss = 1.0 * loss_ic + 1.0 * loss_bc + 1.0 * loss_pde return total_loss
最新发布
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值