源式羽语 2020-06-02
项目再忙碌, 还是要抽出时间来学习的.
最近到整一些数据清洗小工具, 数据导入数据库工具等... 有种感觉是, 之前我做分析师的时候, 啥工具都没有, 全部我自己造, 数据表整理, 业务整理, 建库建表, 自己写 web , 前端(数据展示) ... 反而是我都自己干完了, 而且配置也不全; 而现在, 配置全了, 有后台前台展示工具 BI , 后台有 ETL 团队, 我自己也能开发... 结果现在反而效率降低了... 总是各种问题...真是感到, 还不是自己弄...所有的东西都掌握到自己的手里, 不至于这样东搞西搞, 难受的一批...
继续学习一波, 不管了. 这篇来练习 张量 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. 版本问题吧, 就是取名的差别.
通过 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)
通过 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)
时间有限, 先到这了, 即便碎片化学习, 也是要贵在坚持, 持之以恒, 每天进步一点点.