张量(Tensor)
在Tensorflow中,变量统一称作张量(Tensor)。
张量(Tensor)是任意维度的数组。
- 0阶张量:纯量或标量 (scalar), 也就是一个数值,例如,\'Howdy\' 或 5
- 1阶张量:向量 (vector)或矢量,也就是一维数组(一组有序排列的数),例如,[2, 3, 5, 7, 11] 或 [5]
- 2阶张量:矩阵 (matrix),也就是二维数组(有序排列的向量),例如,[[3.1, 8.2, 5.9][4.3, -2.7, 6.5]]
- 3阶张量:三维的矩阵,也就是把矩阵有序地叠加起来,成为一个“立方体”
- 以此类推,等等。
在大多数情况下,只会使用一个或多个低维张量(2阶及以下)。
典型 TensorFlow 程序中的大多数代码行都是指令,张量也是计算图中的一种指令。
张量可以作为常量或变量存储在图中。
- 常量是始终会返回同一张量值的指令,存储的是值不会发生更改的张量。
- 变量是会返回分配给它的任何张量的指令,存储的是值会发生更改的张量。
TensorFlow指南:
张量的定义
1 1 # coding=utf-8 2 2 import tensorflow as tf 3 import os 4 5 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 6 7 x = tf.constant([5.6], name="x_const") # tf.constant定义标量整数常量并传入值 8 y = tf.Variable([0], name="y_Variable") # tf.Variable定义变量并传入默认值 9 y = y.assign([3]) # 分配一个值 10 11 with tf.Session() as sess: # 图必须在会话中运行,会话存储了它所运行的图的状态 12 initialization = tf.global_variables_initializer() # 使用tf.Variable时,必须在会话开始时明确初始化变量 13 print("x: {}".format(sess.run(x))) 14 print("y: {}".format(sess.run(y)))
运行结果:
1x: [5.6] 2y: [3]
常量相加
1 1 # coding=utf-8 2 2 import tensorflow as tf 3 import os 4 5 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 6 7 g = tf.Graph() # 创建图,虽然TensorFlow提供一个默认图,仍建议创建自己的Graph,以便跟踪状态 8 9 with g.as_default(): # 将定义的图作为默认 10 x = tf.constant(8, name="x_const") # tf.constant定义标量整数常量并传入值 11 y = tf.constant(5, name="y_const") 12 z = tf.constant(4, name="z_const") 13 sum1 = tf.add(x, y, name="x_y_sum") # tf.add相加 14 sum2 = tf.add(z, sum1, name="x_y_z_sum") 15 with tf.Session() as sess: # 图必须在会话中运行 16 print("sum1: {}".format(sum1.eval())) 17 print("sum2: {}".format(sum2.eval()))
运行结果:
1sum1: 13 2sum2: 17
矢量相加、张量形状与广播
1 1 # coding=utf-8 2 2 import tensorflow as tf 3 3 import os 4 4 5 5 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 6 6 7 7 try: 8 8 tf.contrib.eager.enable_eager_execution() 9 9 print("# TF imported with eager execution!") 1010 except ValueError: 1111 print("# TF already imported with eager execution!") 1212 1313 # ### 矢量(一维张量)加法 1414 primes = tf.constant([2, 3, 5, 7, 11, 13], dtype=tf.int32) # 包含质数的primes矢量 1515 ones = tf.ones([6], dtype=tf.int32) # 值全为1的ones矢量 1616 just_beyond_primes = tf.add(primes, ones) # 通过对前两个矢量执行元素级加法而创建的矢量 1717 twos = tf.constant([2, 2, 2, 2, 2, 2], dtype=tf.int32) 1818 primes_doubled = primes * twos # 通过将primes矢量中的元素翻倍而创建的矢量 1919 print("primes: ", primes) 2020 print("ones: ", ones) 2121 print("just_beyond_primes: ", just_beyond_primes) 2222 print("primes_doubled: ", primes_doubled) 2323 2424 some_matrix = tf.constant([[1, 2, 3], [4, 5, 6]], dtype=tf.int32) 2525 print("some_matrix: ", some_matrix) # 输出张量将返回其值、形状以及存储在张量中的值的类型 2626 print("value of some_matrix is:\n", some_matrix.numpy()) # 调用张量的numpy方法会返回该张量的值(以NumPy数组形式) 2727 2828 # ### 张量形状 2929 scalar = tf.zeros([]) # 标量 3030 vector = tf.zeros([3]) # 值全为0的矢量 3131 matrix = tf.zeros([2, 3]) # 值全为0的2行3列矩阵 3232 print('scalar has shape:', scalar.get_shape(), 'and value:\n', scalar.numpy()) 3333 print('vector has shape:', vector.get_shape(), 'and value:\n', vector.numpy()) 3434 print('matrix has shape:', matrix.get_shape(), 'and value:\n', matrix.numpy()) 3535 3636 # ### 广播 3737 primes2 = tf.constant([2, 3, 5, 7, 11, 13], dtype=tf.int32) 3838 ones2 = tf.ones(1, dtype=tf.int32) # 使用的是标量值(不是全包含1矢量)和广播 3939 just_beyond_primes2 = tf.add(primes2, ones2) 4040 twos2 = tf.constant(2, dtype=tf.int32) # 使用的是标量值(不是全包含 2 的矢量)和广播 4141 primes_doubled2 = primes2 * twos2 4242 print("primes2: ", primes2) 4343 print("ones2: ", ones2) 4444 print("just_beyond_primes2: ", just_beyond_primes2) 4545 print("primes_doubled2: ", primes_doubled2) 4646 4747 # ### 矢量加法 4848 # 可以对张量执行很多典型数学运算:https://www.tensorflow.org/api_docs/python/tf/math; 4949 # 输出张量将返回其值、形状以及存储在张量中的值的类型; 5050 # 调用张量的numpy方法会返回该张量的值(以NumPy数组形式); 5151 # 5252 # ### 张量形状(shape) 5353 # 形状(shape)用于描述张量维度的大小和数量; 5454 # 张量的形状表示为list,其中第i个元素表示维度i的大小; 5555 # 列表的长度表示张量的阶(即维数); 5656 # 5757 # ### 广播 5858 # TensorFlow支持广播(一种借鉴自NumPy的概念); 5959 # 利用广播,元素级运算中的较小数组会增大到与较大数组具有相同的形状;
运行结果:
1# TF imported with eager execution! 2primes: tf.Tensor([ 2 3 5 7 11 13], shape=(6,), dtype=int32) 3ones: tf.Tensor([1 1 1 1 1 1], shape=(6,), dtype=int32) 4just_beyond_primes: tf.Tensor([ 3 4 6 8 12 14], shape=(6,), dtype=int32) 5primes_doubled: tf.Tensor([ 4 6 10 14 22 26], shape=(6,), dtype=int32) 6some_matrix: tf.Tensor( 7[[1 2 3] 8 [4 5 6]], shape=(2, 3), dtype=int32) 9value of some_matrix is: 10 [[1 2 3] 11 [4 5 6]] 12scalar has shape: () and value: 13 0.0 14vector has shape: (3,) and value: 15 [0. 0. 0.] 16matrix has shape: (2, 3) and value: 17 [[0. 0. 0.] 18 [0. 0. 0.]] 19primes2: tf.Tensor([ 2 3 5 7 11 13], shape=(6,), dtype=int32) 20ones2: tf.Tensor([1], shape=(1,), dtype=int32) 21just_beyond_primes2: tf.Tensor([ 3 4 6 8 12 14], shape=(6,), dtype=int32) 22primes_doubled2: tf.Tensor([ 4 6 10 14 22 26], shape=(6,), dtype=int32)
矩阵相乘、张量变形
1 1 # coding=utf-8 2 2 import tensorflow as tf 3 3 import os 4 4 5 5 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 6 6 7 7 try: 8 8 tf.contrib.eager.enable_eager_execution() 9 9 print("# TF imported with eager execution!") 1010 except ValueError: 1111 print("# TF already imported with eager execution!") 1212 1313 # ### 矩阵相乘 1414 x = tf.constant([[5, 2, 4, 3], [5, 1, 6, -2], [-1, 3, -1, -2]], dtype=tf.int32) # 3行4列矩阵 1515 y = tf.constant([[2, 2], [3, 5], [4, 5], [1, 6]], dtype=tf.int32) # 4行2列矩阵 1616 matrix_multiply_result = tf.matmul(x, y) # 矩阵相乘的结果是3行2列矩阵 1717 print("matrix_multiply_result: ", matrix_multiply_result) 1818 1919 # ### 张量变形 2020 matrix = tf.constant([[1, 2], [3, 4], [5, 6], [7, 8]], dtype=tf.int32) # 4行2列的矩阵 2121 reshaped_2x4_matrix = tf.reshape(matrix, [2, 4]) # 将4x2张量变形为2x4张量 2222 reshaped_1x8_matrix = tf.reshape(matrix, [1, 8]) 2323 reshaped_2x2x2_tensor = tf.reshape(matrix, [2, 2, 2]) # 将4x2张量变形为三维2x2x2张量 2424 one_dimensional_vector = tf.reshape(matrix, [8]) # 将4x2张量变形为一维8元素张量 2525 print("Original matrix (4x2):\n", matrix.numpy()) 2626 print("Reshaped matrix (2x4):\n", reshaped_2x4_matrix.numpy()) 2727 print("Reshaped matrix (1x8):\n", reshaped_1x8_matrix.numpy()) 2828 print("reshaped_2x2x2_tensor:\n", reshaped_2x2x2_tensor.numpy()) 2929 print("one_dimensional_vector:\n", one_dimensional_vector.numpy()) 3030 3131 # ### 矩阵相乘 3232 # 在线性代数中,当两个矩阵相乘时,第一个矩阵的列数必须等于第二个矩阵的行数,否则是无效的; 3333 # 3434 # ### 张量变形 3535 # 可以使用tf.reshape方法改变张量的形状和维数(“阶”); 3636 # 例如,可以将4x2张量变形为2x4张量; 3737 # 例如,可以将4x2张量变形为三维2x2x2张量或一维8元素张量;
运行结果:
1# TF imported with eager execution! 2matrix_multiply_result: tf.Tensor( 3[[35 58] 4 [35 33] 5 [ 1 -4]], shape=(3, 2), dtype=int32) 6Original matrix (4x2): 7 [[1 2] 8 [3 4] 9 [5 6] 10 [7 8]] 11Reshaped matrix (2x4): 12 [[1 2 3 4] 13 [5 6 7 8]] 14Reshaped matrix (1x8): 15 [[1 2 3 4 5 6 7 8]] 16reshaped_2x2x2_tensor: 17 [[[1 2] 18 [3 4]] 19 20 [[5 6] 21 [7 8]]] 22one_dimensional_vector: 23 [1 2 3 4 5 6 7 8]
变量、初始化和赋值
1 1 # coding=utf-8 2 2 import tensorflow as tf 3 3 import os 4 4 5 5 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 6 6 7 7 try: 8 8 tf.contrib.eager.enable_eager_execution() 9 9 print("# TF imported with eager execution!") 1010 except ValueError: 1111 print("# TF already imported with eager execution!") 1212 1313 v1 = tf.contrib.eager.Variable([3]) # 创建一个初始值为3的标量变量 1414 v2 = tf.contrib.eager.Variable( 1515 tf.random_normal(shape=[1, 4], # 形状为1行4列,必选项 1616 mean=1.0, # 正态分布的均值,默认为0 1717 stddev=0.35, # 正态分布的标准差,默认为1.0 1818 dtype=tf.float64, # 输出的类型,默认为tf.float32 1919 seed=1, # 每次产生的随机数结果是否相同,如果固定seed值为一个整数则相同,默认为None(不相同) 2020 name="test") # 操作的名称 2121 ) # 创建一个初始值为正态分布的1*4矢量变量 2222 tf.assign(v1, [7]) # 使用assign更改变量的值 2323 2424 print("v1:", v1.numpy()) 2525 print("v2:", v2.numpy()) 2626 2727 # ### 变量、初始化和赋值 2828 # 在TensorFlow中可以定义Variable对象(变量),其值可以更改; 2929 # 创建变量时,可以明确设置一个初始值,也可以使用初始化程序(例如分布); 3030 # 使用assign更改变量的值,向变量赋予新值时,其形状必须和之前的形状一致; 3131 # 3232 # ### tf.random_normal()函数 3333 # 用于从服从指定正太分布的数值中取出指定个数的值;
运行结果:
1# TF imported with eager execution! 2v1: [7] 3v2: [[1.08498964 0.87645062 0.70722227 0.91475084]]