Tensorflow常量变量与张量

Tensorflow常量变量与张量

我们今天要讲的是Tensorflow2.0的一些基本操作。在了解Tensorflow之前,我们需要先来了解一下常量变量与张量

常量变量

推荐阅读博客 https://sowhat.blog.csdn.net/article/details/79188449 下面摘抄一些核心的概念和例子

常量就是constant,被声明之后无法改变。变量是variable,声明之后仍能改变。张量则是一个比较大的概念。

几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶向量

张量是现代机器学习的基础。它的核心是一个数据容器,多数情况下,它包含数字,有时候它也包含字符串,但这种情况比较少。因此把它想象成一个数字的水桶。

数学实例 代码实例
0 纯量(只有大小) s =123
1 向量(有大小和方向) v = [1.1,2.2,3.3]
2 矩阵(数据表) m = [[1,2,3],[4,5,6],[7,8,9]]
3 3阶张量(数据立体) t = [[[2],[4],[6]],[[8],[10],[12]],[[14], [16],[18]]]
n n阶 n维的一个空间

现在我们来熟悉一下在Tensorflow中怎么声明常量变量与张量

定义常量

1
2
tensor_20 = tf.constant([[23,4],[32,51]])
tensor_20

打印结果如下:

1
2
3
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[23, 4],
[32, 51]])>

如果要查看tensor的形状,我们可以这样写:

1
tensor_20.shape

打印: TensorShape([2, 2])

数值与Tensorflow的常量之间的相互转换

利用 tensor_20.numpy()可以将刚刚定义的tf常量用一个普通的二维数组的形式呈现出来。我们也可以通过这个方法直接来得到常量的值

1
2
array([[23,  4],
[32, 51]])

要将普通的numpy数组转换成tf的常量,也非常简单,利用 tf.constant() 即可。这种转换是tensorflow2.0的最新特性,非常方便

1
2
3
numpy_tensor = np.array([[23,4],[32,51]])
tensor_from_numpy = tf.constant(numpy_tensor)
tensor_from_numpy

打印结果如下:

1
2
3
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[23, 4],
[32, 51]])>

变量

声明一个变量和声明一个常量只需要将 tf.constant() 改成 tf.Variable() 即可,但是要注意这个Variable 只能是大写V。

1
2
tf2_variable = tf.Variable([[1.,2.,3.],[4.,5.,6.]])
tf2_variable

打印如下:

1
2
3
<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy=
array([[1., 2., 3.],
[4., 5., 6.]], dtype=float32)>

那么变量也是可以通过 .numpy 来转换成numpy数组的

1
2
3
tf2_variable.numpy()
array([[1., 2., 3.],
[4., 5., 6.]], dtype=float32)

修改变量的值

我们可以通过定位到变量中某一个位置并通过 .assign() 的方法将变量中的某个值修改。

1
2
3
4
5
tf2_variable[0,2].assign(100)
# 打印得到
<tf.Variable 'UnreadVariable' shape=(2, 3) dtype=float32, numpy=
array([[ 1., 2., 100.],
[ 4., 5., 6.]], dtype=float32)>

张量运算

tensorflow定义的常量和变量都属于张量。现在我们对我们定义的张量进行一些运算操作

首先我们来定义一个常量张量,这个常量张量并不会被修改但是仍然可以参与运算

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

addition

利用 tensor+2 可以让tensor中所有的元素都加上2

1
2
3
4
5
tensor+2
# 打印如下
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[3, 4],
[5, 6]])>

Multiplication

利用 tensor*5 可以让tensor中所有的元素都乘上5

1
2
3
4
5
tensor*5
# 打印如下
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 5, 10],
[15, 20]])>

Using Numpy functions on Tensorflow tensors

我们也可以用numpy的一些数学方法来计算Tensorflow中的张量,但是得到的数据类型不是tensor而是numpy array

1
2
3
np.square(tensor)
array([[ 1, 4],
[ 9, 16]], dtype=int32)
1
2
3
np.sqrt(tensor)
array([[1. , 1.41421356],
[1.73205081, 2. ]])

两个张量之间的点乘

使用 dot 方法,就可以计算两个张良之间的点乘

1
2
3
4
5
6
7
8
9
10
11
12
print(tensor)
print(tensor_20)
np.dot(tensor, tensor_20)
# 打印如下
tf.Tensor(
[[1 2]
[3 4]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[23 4]
[32 51]], shape=(2, 2), dtype=int32)
array([[ 87, 106],
[197, 216]])

字符串

.constant() 方法并不仅仅能定义一个常量张量。还能创建一个字符串常量.一般来说我们不会经常使用到 tensorflow来创建字符串,除了用它来做NLP之外。

1
2
3
4
tf_string = tf.constant("TensorFlow")
tf_string
# 打印结果
<tf.Tensor: id=62, shape=(), dtype=string, numpy=b'TensorFlow'>

简单的字符串操作

我们可以用 strings.length() 方法来求出字符串的长度。其中 numpy=10 的意思就是说这个字符串的长度为10

1
2
3
tf.strings.length(tf_string)
# 打印结果
<tf.Tensor: id=49, shape=(), dtype=int32, numpy=10>

我们还可以利用strings.unicode_decode()对字符串进行重新编码。比如将其设置为 UTF8 编码格式的话,打印结果如下: 我们看到字符串变成了一个长为10的数字数组,因为UTF-8格式会将字符串的每一个字母编码成一个数字。

1
2
3
4
5
6
7
tf.strings.unicode_decode(tf_string, "UTF8")
# 打印结果
<tf.Tensor:
id=58, shape=(10,),
dtype=int32,
numpy=array([ 84, 101, 110, 115, 111, 114, 70, 108, 111, 119],
dtype=int32)>

字符串数组

下面这个写法是如何用 tensorflow来实现一个字符串数组的。这里创建的是一个一维的字符串数组

1
tf_string_array = tf.constant(["TensorFlow", "Deep Learning", "AI"])

通过遍历我们可以打印出字符串数组中的每一个元素

1
2
3
4
5
6
for string in tf_string_array:
print(string)
# 打印结果
tf.Tensor(b'TensorFlow', shape=(), dtype=string)
tf.Tensor(b'Deep Learning', shape=(), dtype=string)
tf.Tensor(b'AI', shape=(), dtype=string)
-------------本文结束,感谢您的阅读-------------