TensorFlow 基础 (03)

项目再忙碌, 还是要抽出时间来学习的.

最近到整一些数据清洗小工具, 数据导入数据库工具等... 有种感觉是, 之前我做分析师的时候, 啥工具都没有, 全部我自己造, 数据表整理, 业务整理, 建库建表, 自己写 web , 前端(数据展示) ... 反而是我都自己干完了, 而且配置也不全; 而现在, 配置全了, 有后台前台展示工具 BI , 后台有 ETL 团队, 我自己也能开发... 结果现在反而效率降低了... 总是各种问题...真是感到, 还不是自己弄...所有的东西都掌握到自己的手里, 不至于这样东搞西搞, 难受的一批...

继续学习一波, 不管了. 这篇来练习 张量 tensor 的创建.

从Array, List 对象创建 Tensor

Python 的这些 "容器" 或者数据结构, 用的最多的必然是 List 了, 各种骚操作哇. 然后做数据分析处理, Pandas 啥的, 用的基本的都是 Numpy 的 ndarray 数组. 因此, 二者直接转为 Tensor 是非常自然的.

通过 tf.convert_to_tensor ( ) 即可将 array 和 list 转为 张量.

import numpy as np
import tensorflow as tf 

lst = [1, 2, 3, 4]
print(tf.convert_to_tensor(lst))

arr = np.array([[1, 2, 3.14], [4, 5, 6]])
print(tf.convert_to_tensor(arr))
tf.Tensor([1 2 3 4], shape=(4,), dtype=int32)

tf.Tensor(
[[1.   2.   3.14]
 [4.   5.   6.  ]], shape=(2, 3), dtype=float64)

Numpy 浮点数, 默认使用 float 64 精度来存储数据, 即转为 Tensor 类型为 tf.float64. 可以通过 tf.cast( ) 转换为 tf.float32 等.

可以发现, tf.constant( ) 和 tf.convert_to_tensor( ) 都能讲 array 或 list 转为 tensor. 版本问题吧, 就是取名的差别.

创建 全 0 或 全 1 张量

通过 tf.zeros( ) 和 tf.ones( ) 来创建.

这种场景几乎都是参数初始化. 比如线性变换 \(y = Wx + b\) ,将 权值矩阵 W 初始化全 1 的矩阵, 偏置 b 全为 0 向量.

tf.zeros([]), tf.ones([])
(<tf.Tensor: id=3, shape=(), dtype=float32, numpy=0.0>,
 <tf.Tensor: id=4, shape=(), dtype=float32, numpy=1.0>)

创建全为 0, 全1 的向量, 参数 [ ] 用来指定 shape.

print(tf.zeros([1]))
print(tf.ones([1]))

创建全 0 或 1 的矩阵.

# 2x3 的矩阵, 值全为 0
print(tf.zeros([2,3]))

# 2x3 的矩阵, 值全为 1
print(tf.ones([2,3]))
tf.Tensor(
[[0. 0. 0.]
 [0. 0. 0.]], shape=(2, 3), dtype=float32)
 
tf.Tensor(
[[1. 1. 1.]
 [1. 1. 1.]], shape=(2, 3), dtype=float32)

创建自定义数值张量

通过 tf.fill(shape, value) 可以创建自定义 value 的张量.

# 创建 shape 为 0, 值为 -1 的 tensor (标量)
print(tf.fill([], -1))

# 创建 shape 为 5, 值为 -1 的 tensor (向量)
print(tf.fill([1], -1))

# 创建 shape 为 (3, 3) 值为 666 的 tensor (矩阵)
print(tf.fill([3,3], 666))

# 创建 shape 为 (3, 2, 2) 值为 999 的 tensor (3维张量)
print(tf.fill([3, 2, 2], 999))
tf.Tensor(-1, shape=(), dtype=int32)

tf.Tensor([-1], shape=(1,), dtype=int32)

tf.Tensor(
[[666 666 666]
 [666 666 666]
 [666 666 666]], shape=(3, 3), dtype=int32)
 
tf.Tensor(
[[[999 999]
  [999 999]]

 [[999 999]
  [999 999]]

 [[999 999]
  [999 999]]], shape=(3, 2, 2), dtype=int32)

创建概率分布的 Tensor

通过 tf.random.normal( ) 和 tf.random.uniform () 来生成最为常见的 高斯分布 和 均匀分布.

场景一般是用来做测试和辅助网络训练. 如在卷积神经网络中, 卷积核张量 \(W\) 初始化为高斯分布, 则非常有网络参数的训练. 再如在 GAN (对抗性生成网络) 中, 隐变量 z 一般采样自 均匀分布.

tf.random.normal (shape, mean=0.0, stddev=1.0) 即 \(N(\mu, \sigma)\)

tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32) 均匀分布哇.

# 生成 2 x 3 标准(0,1) 高斯分布的矩阵
print(tf.random.normal([2,3]))

# 生成 2 x 3 均值为 1, 标准差为 2 的高斯分布
print(tf.random.normal([2,3], 1, 2))

# 生成 1 x 3 的 [1, 10] 均匀分布向量
print(tf.random.uniform([1,3], 1, 10))

# 生成 2 x 2 的 [1, 100] 整形, 且为均匀分布 的矩阵
print(tf.random.uniform([2,2], 1, 100, dtype=tf.int32))
tf.Tensor(
[[ 0.2804165  -0.08695418 -0.243429  ]
 [ 1.5735217   0.91768235  1.2737458 ]], shape=(2, 3), dtype=float32)

tf.Tensor(
[[-0.5737424  -0.19066274 -0.9355514 ]
 [ 4.6325927   0.62451375 -0.69557965]], shape=(2, 3), dtype=float32)
 
tf.Tensor([[7.61883   2.2297285 6.51745  ]], shape=(1, 3), dtype=float32)

tf.Tensor(
[[20 23]
 [67 11]], shape=(2, 2), dtype=int32)

创建序列张量

通过 tf.range() 来实现序列. 其中 tf.range(limit, delta=1)

# 跟 Python 的 range() 函数是一样的
print(tf.range(10))

print(tf.range(5, 10))

print(tf.range(1, 10, 2))
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
tf.Tensor([5 6 7 8 9], shape=(5,), dtype=int32)
tf.Tensor([1 3 5 7 9], shape=(5,), dtype=int32)

小结

  • tf.constant() 和 tf.convert_to_tensor() 方法可将 array 和 list 转为 tensor
  • tf.zeros() 和 tf.ones() 可用来生成自定义 shap , 值全为 0 或 1 的张量
  • 自定义值的张量, 则可以通过 tf.fill() 来实现
  • tf.random.normal( ) 和 tf.random.uniform () 来生成最为常见的 高斯分布 和 均匀分布.
  • tf.range() 来生成序列的张量, 跟Python是一样的用法哦.

时间有限, 先到这了, 即便碎片化学习, 也是要贵在坚持, 持之以恒, 每天进步一点点.

相关推荐