Tensorflow系列--(一)基本概念与操作
这篇文章是Tensorflow系列文章中的第一篇,比较基础,主要想细致过一遍用到的Tensorflow的内容。主要参考但不限于书籍Nick McClure的 Tensorflow Machine Learning Cookbook 中文版《Tensorflow机器学习实战指南》(错误很多)。文中涉及到的代码的完整源码都放在了我的Github里MachineLearningNotes–Tensorflow当中了。
准备工作
系统环境 :Windows10 x64 / Ubuntu 16.04 x64
Python环境 :Python 3.5.4 / Python 3.5.2
Tensorflow环境 :Tensorflow1.8.0 / Tensorflow1.4.0
安装Tensorflow环境使用pip直接安装就好,douban的pip镜像速度很快,后面需要用到Keras,也可以用pip直接安装。 查看tensorflow的环境语句
import tensorflow as tf
print(tf.__version__)
若能正确输出版本号,基本是可以进行后面操作了。
Tensorflow中张量的操作
Tensorflow中主要数据结构是张量,常用张量来操作计算图。可以把 变量 或者 占位符 声明为张量。
1.固定张量
常有零张量、单位张量、指定常数填充张量和常数矩阵创建张量等几种。
#创建固定维度的零张量
zero_tsr =tf.zeros([row_dim,col_dim])
#创建指定维度的单位张量
ones_tsr =tf.ones([row_dim,col_dim])
#创建指定维度的常数填充张量
filled_tsr = tf.fill([row_dim,col_dim], 42)
#使用已知常数张量创建张量
constant_tsr = tf.constant([1,2,3])
2.相似张量
新建与已有张量类似的张量。
# 新建与已有张量类似的张量
zero_similar = tf.zeros_like(constant_tsr)
# ones_similar = tf.ones_like(constant_tsr)
3.序列张量
新建再指定序列内形成张量。
# 创建指定间隔的张量,包括结尾值
linear_tsr = tf.linspace(start=0.0,stop=1.0,num=7)
# when num=7, output is [0. 0.16666667 0.33333334 0.5 0.6666667 0.8333334 1. ]
# 随机取间隔递增值不包括结尾值
integer_seq_tsr = tf.range(start=6,limit=20,delta=3)
# when start=6,limit=20, delta =3, output is [ 6 9 12 15 18]
4.随机张量
新建不同分布的随机书形成张量。
# 生成均匀分布的随机数
randunif_tsr = tf.random_uniform([row_dim,col_dim], minval=0, maxval=2)
# when maxval=2, one row is [1.4330745 1.6743479 1.4814448 0.16386724 1.9783459 1.0236795
# 0.1930139 0.34939528 1.3543162 0.4354465 ]
# in this function, minval <= x < maxval
# 生成正态分布的随机数
randnorm_tsr = tf.random_normal([row_dim,col_dim], mean=0.0, stddev=1.0)
# 生成随机数位于指定期望到两个标准差之间的区间
runcnorm_tsr = tf.truncated_normal([row_dim,col_dim], mean=0.0, stddev=1.0)
5.张量调整与剪裁
# 随机调整张量参数的顺序
shuffled_output_tsr = tf.random_shuffle(constant_tsr)
oldconstant_tsr = tf.constant([[1,2,3],[4,5,6],[7,8,9]])
# 对原有张量进行随机裁剪
cropped_output_tsr = tf.random_crop(oldconstant_tsr,[3,1])
# 张量裁剪,要注意维数和通道数, 3*3 可被裁剪顶多是二维
# when size=[3,1], output is [[1] [4] [7]]
6.张量使用与输出
创建计算图,在计算图中运行并输出张量结果。
sess = tf.Session()
print(sess.run(oldconstant_tsr))
print('- - - - - - - - - - - - - - - - - - - -')
print(sess.run(cropped_output_tsr))
7.封装张量作为变量
Tensoeflow中的变量是通过tf.Variable( )函数得到的,过程是输入一个张量,返回一个变量。
# 创建好张量,使用tf.Variable()封装张量作为变量
print('- - - - - - - - - - - - - - - - - - - -')
first_zero_var = tf.Variable(zero_tsr)
sess.run(first_zero_var.initializer)
# 对已经初始化的变量进行初始化操作方式
8.全局变量初始化以及占位符操作
占位符 仅仅声明数据位置,用于传入数据到计算图。
initialize_option = tf.global_variables_initializer()
sess.run(initialize_option)
print('- - - - - - - - - - - - - - - - - - - -')
# 占位符形成
init_x = tf.placeholder(tf.float32, shape=[2,2])
# 占位符要声明数据格式
init_y = tf.identity(init_x)
x_vals = np.random.rand(2,2)
sess.run(init_y, feed_dict={init_x: x_vals})
Tensorflow中矩阵的操作
1.创建矩阵
indentity_matrix = tf.diag([1.0, 1.0, 1.0])
matrix_A = tf.truncated_normal([2, 3])
matrix_B = tf.fill([2,3], 5.0)
matrix_C = tf.random_uniform([3,2])
matrix_D = tf.convert_to_tensor(np.array([[1., 2., 3.],[-3., -7., -1.],[0., 5., -2.]]))
其中,tf.diag 为创建对角矩阵,tf.truncated_normal 为创建指定维数随机矩阵,tf.fill 为创建填充矩阵,tf.random_uniform 为创建0~1之间随机矩阵;tf.convert_to_tensor 可将numpy创建的矩阵转换成张量矩阵。
2.矩阵加减乘法运算
print('- - - - - - - - - - - - - - - - - - - -')
print(sess.run(matrix_A+matrix_B))
print('- - - - - - - - - - - - - - - - - - - -')
print(sess.run(matrix_A-matrix_B))
print('- - - - - - - - - - - - - - - - - - - -')
# 矩阵乘法
print(sess.run(tf.matmul(matrix_B,indentity_matrix)))
# 矩阵乘法注意矩阵前后次序,以及对应的阶次
print('- - - - - - - - - - - - - - - - - - - -')
# 矩阵转置
print(sess.run(tf.transpose(matrix_C)))
# 重新初始化会得到不同的值,
3.矩阵行列式与逆矩阵
print('- - - - - - - - - - - - - - - - - - - -')
# 矩阵行列式
print(sess.run(tf.matrix_determinant(matrix_D)))
print('- - - - - - - - - - - - - - - - - - - -')
# 矩阵的逆矩阵
print(sess.run(tf.matrix_inverse(matrix_D)))
# 矩阵的逆矩阵是用平方根法,
# 需要矩阵为对称正定矩阵或者可进行LU分解
print('- - - - - - - - - - - - - - - - - - - -')
# 矩阵分解法
print(sess.run(tf.cholesky(indentity_matrix)))
print('- - - - - - - - - - - - - - - - - - - -')
# 求矩阵特征值和特征向量
print(sess.run(tf.self_adjoint_eig(matrix_D)))
上述代码中,Tensorflow中使用 tf.matrix_inverse 求逆矩阵是采用平方根法,矩阵要能够进行LU分解。
4.矩阵分解与行列式
print('- - - - - - - - - - - - - - - - - - - -')
# 矩阵分解法
print(sess.run(tf.cholesky(indentity_matrix)))
print('- - - - - - - - - - - - - - - - - - - -')
# 求矩阵特征值和特征向量
print(sess.run(tf.self_adjoint_eig(matrix_D)))
在以上函数中,tf.self_adjoint_eig输出的结果,第一行为 特征值 ,后面为每个特征值对应的 特征向量,此为矩阵的特征分解。
Tensorflow中加入上述矩阵操作到计算图中进行张量计算,对于后面使用Tensorflow进行机器学习有很重要的作用。
评论