TensorFlow: 张量的运算
参考文档:https://blog.csdn.net/davincil/article/details/75349240
目录
什么是张量
张量(Tensor)是TensorFlow使用的主要数据块。它们就像TensorFlow用来处理数据的变量。每个张量都有一个维度和一个类型。
维度是指张量的行和列。您可以定义一维张量,二维张量和三维张量,关于张量详细使用我们将在后面看到。
类型是指张量元素的数据类型。
定义一维张量
为了定义张量,我们将创建一个NumPy数组或Python列表,并使用tf_convert_to_tensor 函数将其转换为张量。
我们将使用NumPy来创建一个这样的数组:
import numpy as np arr = np.array([1, 5.5, 3, 15, 20])
结果显示了阵列的尺寸和形状。
import numpy as np arr = np.array([1, 5.5, 3, 15, 20]) print(arr) print (arr.ndim) print (arr.shape) print (arr.dtype)
现在我们将使用tf_convert_to_tensor 函数将此数组转换为张量 。
import numpy as np import tensorflow as tf arr = np.array([1, 5.5, 3, 15, 20]) tensor = tf.convert_to_tensor(arr,tf.float64) print(tensor)
从结果中,可以看到张量的定义,但看不到张量的元素。
要查看张量的元素,可以像这样运行一个会话:
import numpy as np import tensorflow as tf arr = np.array([1, 5.5, 3, 15, 20]) tensor = tf.convert_to_tensor(arr,tf.float64) sess = tf.Session() print(sess.run(tensor)) print(sess.run(tensor[1]))
定义二维张量
这与一维数组完全相同,但是这次我们需要这样定义数组:
arr = np.array([(1, 5.5, 3, 15, 20),(10, 20, 30, 40, 50), (60, 70, 80, 90,100)])
你可以把它转换成这样的张量:
import numpy as np import tensorflow as tf arr = np.array([(1, 5.5, 3, 15, 20),(10, 20, 30, 40, 50), (60, 70, 80, 90, 100)]) tensor = tf.convert_to_tensor(arr) sess = tf.Session() print(sess.run(tensor))
在张量上计算
现在你知道如何定义张量。如何让它们之间进行一些数学运算呢?
加法运算
假设我们有两个这样的数组:
arr1 = np.array([(1,2,3),(4,5,6)]) arr2 = np.array([(7,8,9),(10,11,12)])
我们需要得到他们的总和。您可以使用TensorFlow执行许多数学操作。
你可以使用这样的add函数:
arr3 = tf.add(arr1,arr2)
整个代码将是这样的:
import numpy as np import tensorflow as tf arr1 = np.array([(1,2,3),(4,5,6)]) arr2 = np.array([(7,8,9),(10,11,12)]) arr3 = tf.add(arr1,arr2) sess = tf.Session() tensor = sess.run(arr3) print(tensor)
其他常用函数
# 算术操作符:+ - * / % tf.add(x, y, name=None) # 加法(支持 broadcasting) tf.subtract(x, y, name=None) # 减法 tf.multiply(x, y, name=None) # 乘法 tf.divide(x, y, name=None) # 浮点除法, 返回浮点数(python3 除法) tf.mod(x, y, name=None) # 取余 # 幂指对数操作符:^ ^2 ^0.5 e^ ln tf.pow(x, y, name=None) # 幂次方 tf.square(x, name=None) # 平方 tf.sqrt(x, name=None) # 开根号,必须传入浮点数或复数 tf.exp(x, name=None) # 计算 e 的次方 tf.log(x, name=None) # 以 e 为底,必须传入浮点数或复数 # 取符号、负、倒数、绝对值、近似、两数中较大/小的 tf.negative(x, name=None) # 取负(y = -x). tf.sign(x, name=None) # 返回 x 的符号 tf.reciprocal(x, name=None) # 取倒数 tf.abs(x, name=None) # 求绝对值 tf.round(x, name=None) # 四舍五入 tf.ceil(x, name=None) # 向上取整 tf.floor(x, name=None) # 向下取整 tf.rint(x, name=None) # 取最接近的整数 tf.maximum(x, y, name=None) # 返回两tensor中的最大值 (x > y ? x : y) tf.minimum(x, y, name=None) # 返回两tensor中的最小值 (x < y ? x : y) # 三角函数和反三角函数 tf.cos(x, name=None) tf.sin(x, name=None) tf.tan(x, name=None) tf.acos(x, name=None) tf.asin(x, name=None) tf.atan(x, name=None)
参考文档:https://blog.csdn.net/qq_22080019/article/details/80992566
求平均值
tf.reduce_mean
功能说明
计算张量 input_tensor 平均值
参数列表
参数名 必选 类型 说明 input_tensor 是 张量 输入待求平均值的张量 axis 否 None、0、1 None:全局求平均值;0:求每一列平均值;1:求每一行平均值 keep_dims 否 Boolean 保留原来的维度(例如不会从二维矩阵降为一维向量) name 否 string 运算名称 reduction_indices 否 None 和 axis 等价,被弃用
reduce_mean( input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None )
示例代码
现在您可以在 /home/ubuntu 目录下创建源文件 reduce_mean.py,内容可参考:
示例代码:/home/ubuntu/reduce_mean.py
#!/usr/bin/python import tensorflow as tf import numpy as np initial = [[1.,1.],[2.,2.]] x = tf.Variable(initial,dtype=tf.float32) init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) print(sess.run(tf.reduce_mean(x))) print(sess.run(tf.reduce_mean(x,0))) #Column print(sess.run(tf.reduce_mean(x,1))) #row
然后执行:
python /home/ubuntu/reduce_mean.py
执行结果:
1.5 [ 1.5 1.5] [ 1. 2.]
偏差求和
tf.nn.bias_add
功能说明
将偏差项 bias 加到 value 上面,可以看做是 tf.add 的一个特例,其中 bias 必须是一维的,并且维度和 value 的最后一维相同,数据类型必须和 value 相同。
参数列表
参数名 必选 类型 说明 value 是 张量 数据类型为 float, double, int64, int32, uint8, int16, int8, complex64, or complex128 bias 是 1 维张量 维度必须和 value 最后一维维度相等 data_format 否 string 数据格式,支持 ' NHWC ' 和 ' NCHW ' name 否 string 运算名称
bias_add( value, bias, data_format=None, name=None )
示例代码
现在您可以在 /home/ubuntu 目录下创建源文件 bias_add.py,内容可参考:
示例代码:/home/ubuntu/bias_add.py
#!/usr/bin/python import tensorflow as tf import numpy as np a = tf.constant([[1.0, 2.0],[1.0, 2.0],[1.0, 2.0]]) b = tf.constant([2.0,1.0]) c = tf.constant([1.0]) sess = tf.Session() print (sess.run(tf.nn.bias_add(a, b))) #print (sess.run(tf.nn.bias_add(a,c))) error print ("##################################") print (sess.run(tf.add(a, b))) print ("##################################") print (sess.run(tf.add(a, c)))
然后执行:
python /home/ubuntu/bias_add.py
执行结果:
3 个 3x2 维张量。您也可以尝试修改源代码看看输出结果有什么变化?
求平方
tf.square:
square( x, name=None )
功能说明
计算张量对应元素平方
参数列表
参数名 必选 类型 说明 x 是 张量 是 half, float32, float64, int32, int64, complex64, complex128 其中一种类型 name 否 string 运算名称
示例代码
现在您可以在 /home/ubuntu 目录下创建源文件 square.py,内容可参考:
示例代码:/home/ubuntu/square.py
#!/usr/bin/python import tensorflow as tf import numpy as np initial_x = [[1.,1.],[2.,2.]] x = tf.Variable(initial_x,dtype=tf.float32) x2 = tf.square(x) init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) print(sess.run(x2))
然后执行:
python /home/ubuntu/square.py
执行结果:
[[ 1. 1.] [ 4. 4.]]
求差平方 tf.squared_difference
功能说明
计算张量 x、y 对应元素差平方
参数列表
参数名 必选 类型 说明 x 是 张量 是 half, float32, float64, int32, int64, complex64, complex128 其中一种类型 y 是 张量 是 half, float32, float64, int32, int64, complex64, complex128 其中一种类型 name 否 string 运算名称
squared_difference( x, y, name=None )
示例代码
现在您可以在 /home/ubuntu 目录下创建源文件 squared_difference.py,内容可参考:
示例代码:/home/ubuntu/squared_difference.py
#!/usr/bin/python import tensorflow as tf import numpy as np initial_x = [[1.,1.],[2.,2.]] x = tf.Variable(initial_x,dtype=tf.float32) initial_y = [[3.,3.],[4.,4.]] y = tf.Variable(initial_y,dtype=tf.float32) diff = tf.squared_difference(x,y) init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) print(sess.run(diff))
然后执行:
python /home/ubuntu/squared_difference.py
执行结果:
[[ 4. 4.] [ 4. 4.]]
生成正态分布随机数
tf.truncated_normal
功能说明
产生截断正态分布随机数,取值范围为 [ mean - 2 * stddev, mean + 2 * stddev ]。
参数列表
参数名 必选 类型 说明 shape 是 1 维整形张量或 array 输出张量的维度 mean 否 0 维张量或数值 均值 stddev 否 0 维张量或数值 标准差 dtype 否 dtype 输出类型 seed 否 数值 随机种子,若 seed 赋值,每次产生相同随机数 name 否 string 运算名称
truncated_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None )
示例代码
现在您可以在 /home/ubuntu 目录下创建源文件 truncated_normal.py:
示例代码:/home/ubuntu/truncated_normal.py
import tensorflow as tf initial = tf.truncated_normal(shape=[3,3], mean=0, stddev=1) print(tf.Session().run(initial))
然后执行:
python /home/ubuntu/truncated_normal.py
执行结果:
将得到一个取值范围 [ -2, 2 ] 的 3 * 3 矩阵,您也可以尝试修改源代码看看输出结果有什么变化?