0%

使用tf进行基本的矩阵运算

前言

尝试根据b站大佬来扩充自己的知识面

本人使用的环境为tf2.0但是b站视频是1.0,因此与视频会稍有不符合

参考

B站视频

过程

代码片段1

这里仅贴出跟着b站视频写出来的代码,并在有些区域会有些许注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import tensorflow as tf
# data1 = tf.placeholder(tf.float32) # 该方法在2.0版本之后就已经被弃用
# data2 = tf.placeholder(tf.float32) # 该方法在2.0版本之后就已经被弃用


# 2.0之后使用
tf.compat.v1.disable_eager_execution() # 初始化新版本的模块化更新信息

data1 = tf.compat.v1.placeholder(tf.float32)
data2 = tf.compat.v1.placeholder(tf.float32)
dataAdd = tf.add(data1, data2)

# with tf.sesson() as sess: # 该方法已经在2.0之后弃用

# 2.0之后使用
with tf.compat.v1.Session() as sess:
print(sess.run(dataAdd, feed_dict={data1: 6, data2: 2}))
# feed_dict 为其中的内容进行赋值
print("end")

输出内容:

1
2
8.0
end

代码片段2

此部分代码表明Python的矩阵维度定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import tensorflow as tf

tf.compat.v1.disable_eager_execution() # 初始化新版本的模块化更新信息

data1 = tf.compat.v1.constant([[6, 6]]) # 一行两列
data2 = tf.compat.v1.constant([[2], [2]]) # 两行一列
data3 = tf.compat.v1.constant([[3, 3]]) # 一行两列
data4 = tf.compat.v1.constant([[1, 2], [3, 4], [5, 6]]) # 三行两列
data5 = tf.compat.v1.constant([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # 三行三列,为了更好区分,因此加了回车

print(data5.shape) # 打印矩阵维度

with tf.compat.v1.Session() as sess:
print(sess.run(data5)) # 输出整个矩阵
print(sess.run(data5[0])) # 输出矩阵的某一行
print(sess.run(data5[:, 0])) # 输出矩阵的某一列
print(sess.run(data5[0][0])) # 输出矩阵第一行第一列
# 矩阵的起始位置都是0

输出内容:

1
2
3
4
5
6
7
(3, 3)
[[1 2 3]
[4 5 6]
[7 8 9]]
[1 2 3]
[1 4 7]
1

片段

代码片段3

此段代码讲解矩阵乘法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 矩阵乘法
import tensorflow as tf
import os

os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"

tf.compat.v1.disable_eager_execution() # 初始化新版本的模块化更新信息

data1 = tf.compat.v1.constant([[6, 6]]) # 一行两列
data2 = tf.compat.v1.constant([[2], [2]]) # 两行一列
data3 = tf.compat.v1.constant([[3, 3]]) # 一行两列
data4 = tf.compat.v1.constant([[1, 2], [3, 4], [5, 6]]) # 三行两列
data5 = tf.compat.v1.constant([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # 三行三列,为了更好区分,因此加了回车
matMul = tf.matmul(data1, data2)
matMul2 = tf.multiply(data1, data2) # 类似于加法,对应元素相乘
matAdd = tf.add(data1, data3)
with tf.compat.v1.Session() as sess:
print(sess.run(matMul)) # 一维
print(sess.run(matAdd)) # 二维
print(sess.run(matMul2))
print(sess.run([matMul, matAdd])) # 可以通过中括号,一次性打印多个内容
# MK x KN = MN

运行结果:

1
2
3
4
5
[[24]]
[[9 9]]
[[12 12]
[12 12]]
[array([[24]], dtype=int32), array([[9, 9]], dtype=int32)]

代码片段4

如何定义一个基本矩阵

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import tensorflow as tf
import os

os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
tf.compat.v1.disable_eager_execution() # 初始化新版本的模块化更新信息

mat0 = tf.constant([[0, 0, 0], [0, 0, 0]]) # 自己动手,丰衣足食
mat1 = tf.zeros([2, 3]) # 定义一个三行两列的空矩阵
mat2 = tf.ones([3, 2]) # 定义一个三行两列的1矩阵
mat3 = tf.fill([2, 3], 15)
with tf.compat.v1.Session() as sess:
print(sess.run(mat0))
print(sess.run(mat1))
print(sess.run(mat2))
print(sess.run(mat3))

运行结果如下:

1
2
3
4
5
6
7
8
9
[[0 0 0]
[0 0 0]]
[[0. 0. 0.]
[0. 0. 0.]]
[[1. 1.]
[1. 1.]
[1. 1.]]
[[15 15 15]
[15 15 15]]

代码片段5

如何定义一个非基本矩阵

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 如何定义一个矩阵(非基础)
import tensorflow as tf
import os

os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
tf.compat.v1.disable_eager_execution() # 初始化新版本的模块化更新信息

mat1 = tf.constant([[2], [3], [4]])
mat2 = tf.zeros_like(mat1) # 定义一个全零矩阵,维度与mat1相同
mat3 = tf.linspace(0.0, 2.0, 11) # 创建一个从0-2的一个中间具有11个元素的矩阵
mat4 = tf.compat.v1.random_uniform([2, 3], -1, 2) # 创建一个2×3的矩阵,并且矩阵数字为 (-1)-2 之间
with tf.compat.v1.Session() as sess:
print(sess.run(mat2))
print(sess.run(mat3))
print(sess.run(mat4))

运行结果如下:

1
2
3
4
5
6
7
8
[[0]
[0]
[0]]
[0. 0.2 0.4 0.6 0.8 1. 1.2
1.4 1.6 1.8000001 2. ]
[[-0.988165 0.3698578 -0.68531 ]
[-0.7001637 1.0496833 1.1087246]]

在tf中矩阵的定义

在python中,定义一个矩阵可以采用以下方法进行定义:

1
2
3
# python中矩阵的定义
# 一行两列:[[6,6]]
# 两行两列:[[6,6],[6,6]]

什么是placeholder

Tensorflow中的palceholder,中文翻译为占位符,什么意思呢?

在Tensoflow2.0以前,还是静态图的设计思想,整个设计理念是计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,可以帮你优化整个session需要执行的代码。

在代码层面,每一个tensor值在graph上都是一个op,当我们将train数据分成一个个minibatch然后传入网络进行训练时,每一个minibatch都将是一个op,这样的话,一副graph上的op未免太多,也会产生巨大的开销;于是就有了tf.placeholder(),我们每次可以将 一个minibatch传入到x = tf.placeholder(tf.float32,[None,32])上,下一次传入的x都替换掉上一次传入的x,这样就对于所有传入的minibatch x就只会产生一个op,不会产生其他多余的op,进而减少了graph的开销。
——CSDN

其他

错误汇总

报错信息为AttributeError: module 'tensorflow' has no attribute 'placeholder'

由于本人使用的环境不同,根据CSDN上的信息而言,表明在tf版本2.0之后,该方法就已经被进行了弃用,因此我们需要寻找到2.0版本的对应方法,对应方法已经在相关代码片段中进行提及

-------------我也是有底线的哦如需更多,欢迎打赏-------------