TensorFlow: 张量的运算

来自CloudWiki
跳转至: 导航搜索


参考文档: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 矩阵,您也可以尝试修改源代码看看输出结果有什么变化?