最近都面临一个问题是, 要用纯 sql 来实现所有的逻辑, 其实 union 呀, 嵌套, 子查询呀, 这些都还好, 但那带有逻辑判断的, 这就整不好整了, 就多分支的, 再分支这种... 也不知为啥, 一年前写 sql , 都没有超过 20行... 自从搞了一段时间 BI , 这尼玛, 现在随便写的几百行 sql... 逻辑其实不算复杂, 就是一层层嵌套, 子查询, 当做一个表取 as 别名.... 这尼玛, 越写越多... 总是感觉越发复杂和, 渐渐明白, ETL 的那些兄弟的意义就是, 帮忙做中间表, 做宽表, 做调度 .. 虽然这部分,我自己写程序也能做, 但现在是没有接入编程语言.. 要一通 sql 来做.. 实在有点难受... 看了一个兄弟, 一个逻辑, 2000多行的sql ...我在想这些人是中什么样的境界....

都停滞好几天自己的学习了, 困惑中, 就很难去集中精力搞自己的事情, 因此周末还要给续上一点的. 这篇主要学一波 张量的直观用.

标量

标量在 TF 中, 就是一个 维度为 0 , shape 为 [ ] 的数字. 我觉得这些概念, 回归数学概念来理解会更加地直观和自然. 标量典型应用是一些指标, 如误差值的测量表示, 如 准确度 (Accuracy) , 精度 (Precision) , 召回率 (Recall) 等.

# 随机模拟网络输出
out = tf.random.uniform([1, 10]) # 随机构造真实样本标签
y = tf.constant([1, 3, 2, 5, 5])
# one-hot 编码
y = tf.one_hot(y, depth=10)
print(y) # 计算每个样本的MSE, 是个向量
loss = tf.keras.losses.mse(y, out)
print('loss:', loss) # 均方误 MSE, 是个标量
loss = tf.reduce_mean(loss)
print("loss_mes:", loss)
tf.Tensor(
[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]], shape=(5, 10), dtype=float32) loss: tf.Tensor([0.14861506 0.17281498 0.18253241 0.07795892 0.07795892], shape=(5,), dtype=float32) loss_mes: tf.Tensor(0.13197607, shape=(), dtype=float32)

向量

向量在 TF 中, 就一个, 维度为1, shape 为 [n, ] 的一维数组. 跟数学上的向量还是有点区别的. 数学中更加广泛, 矩阵, 包括张量, 从线性代数的角度看, 都是向量, 当然线性代数的核心研究点, 如线性空间, 线性变换 .. 这些的基础点都是向量. 矩阵也是向量, 当然,矩阵也可以看做一个函数, 这里不扯了, 这些在我前几年上大学就已经弄明白了, 已经毕业了哈...

在神经网络中, 向量是做为一个特别重要的数据载体, 因为网络的输入, 要求必须是一个 一维的向量, 然后进行 WX + b, 再激活函数, softmax ... 误差反向传播 等... 这些都很基础不谈了, 然后用代码来模拟一下, 全连接层 和 偏置 的小示范, 大家就明白了.

# z = wx 模拟激活函数的输入 z
z = tf.random.normal([4,2])
# 创建偏置向量
b = tf.ones([2])
# 累加上偏置向量
z + b
<tf.Tensor: id=45, shape=(4, 2), dtype=float32, numpy=
array([[2.5850847 , 1.0067246 ],
[2.1504483 , 1.7368696 ],
[2.1437292 , 0.74127305],
[0.37799203, 1.2619207 ]], dtype=float32)>

这段代码, 我搬运的时候, 也是看着很奇怪的. z 的 shap 是 (4, 2) , 而 b 的 shape 是 (2, ) 这两兄弟的 shape 都不一会竟然能相加, 诡异得很... 先记下这个问题, 后面查波资料再说吧..

在 TF 中, 通过高层接口类 Dense ( ) 来创建网络层, 张量 W 和 b 的内部, 由类自动创建并管理. 可以通过全连接层的 bias 成员变量(属性) 来查看偏置 b. 比如来创建一个, 节点数为 4, 输出节点为 3 的线性网络层, 即其 bias 的长度为 3嘛, 代码是这样玩的.

# 创建一层 Wx + b, 输出节点为 3
my_layer = tf.keras.layers.Dense(3) # 通过 build 方法创建 W, b 张量, 输入节点为 4
my_layer.build(input_shape=(4, 2)) my_layer.bias
<tf.Variable 'bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>

可以看到, 类的偏置 bias 是长度为 3 的向量, 初始值全为 0. 同时, bias 的类型为 Variable, 因为 W, b 都是待优化参数嘛, 需要进行自动求导的哦.

矩阵

在神经网络中, 层与层之间的, 权值 W, 就是一个 权值矩阵嘛, 不多说了, 直接看段代码就明白了.

# 2行4列, 即表示 2个样本, 每个样本有 4 个特征
x = tf.random.normal([2, 4]) # 定义权值矩阵 W 矩阵乘法: mxn * nxp -> m x p
w = tf.ones([4, 3]) # 定义偏置向量 b, 长度为 3 即 2x4 * 4*3 -> 2*3
b = tf.zeros([3]) # @ 就点乘 dot 的作用, 为了简化, 这里没设置 激活函数哈
o = x @ w + b
o
<tf.Tensor: id=83, shape=(2, 3), dtype=float32, numpy=
array([[0.4589759, 0.4589759, 0.4589759],
[1.8880281, 1.8880281, 1.8880281]], dtype=float32)>

这就实现了一个线性变换的网络层, 当然这么没有激活函数, 一般自己写个就好啦, 非线性, 映射到 0-1 之间的函数, 随便弄. \(\sigma(X@W + b)\) 也可以被称为全连接层. 在 TF 中通过 tf.keras.layers.Dense( ) 来实现. 像这里的激活函数 sigma 为空时, 该全连接层也称为 线性层.

最常用的激活函数 sigmoid: \(\sigma(x) = \frac {1}{1+e^{-x}}\)

作用是把一个值, 映射到 (0-1) , 逻辑回归会用到, 用其来作为一个概率值来弄的, 反正也不难, 我都推导 好多次了.

{再来一把, 通过 Dense() 类来创建一个, 输入 4 个节点, 输出 3 个节点 的网络层.

# 输出节点数为 3
my_layer = tf.keras.layers.Dense(3) # 全连接层输入节点为 4
my_layer.build(input_shape=(2,4)) # 查看权值矩阵的 W, 和 b
print('W:',my_layer.kernel)
print('b:', my_layer.bias)
W:
<tf.Variable 'kernel:0' shape=(4, 3) dtype=float32, numpy=
array([[-0.0026896 , 0.8679098 , -0.91239446],
[-0.38716274, -0.23643166, -0.20897073],
[-0.91767067, 0.7481936 , 0.45598388],
[-0.15754491, -0.04295635, 0.37723374]], dtype=float32)>
b:
<tf.Variable 'bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>

还有 3维张量, 4维张量, 就先不讨论, 都是后面的重点关注对象嘛, NLP 呀, 图片这, 这些都是都是要用 张量 来表示的, 我自己觉得, 理解起来, 不是那么容易, 包括现在也更多停留在, 初步理解的层面上, 它不像对编程的数组, 列表, 字符串,这些有比较深刻的认识, 就不在这里瞎误导了.

初步了解了一波, TF 的 一些 "数据结构" , 就已经是我比较满意的了, 标量, 向量, 矩阵, 张量这些, 其实从编程和数学的视角来看待, 我是觉得非常自然的, 也是非常佩服我们人类的智慧, 能够让只能识别高低电压的 0, 1 计算机去尝试理解, 人类的自然语言, 大自然的画卷图案. 与我自己在学习中, 也非常好奇和向往. 虽然我每天工作都是 搬砖, 写脚本, 拼 sql , 背锅这些小事情, 但, 学无止境嘛, 这也是我受大学教育给的我最为重要的知识.

TensorFlow 基础 (04)的更多相关文章

  1. javaSE基础04

    javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...

  2. javascript基础04

    javascript基础04 1.循环语句 1.While 语句: while (exp) { //statements; } var i = 1; while(i < 3){ alert(i) ...

  3. Linux命令工具基础04 磁盘管理

    Linux命令工具基础04 磁盘管理 日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩: 查看磁盘空间 查看磁盘空间利用大小 df -h -h: huma ...

  4. TensorFlow基础

    TensorFlow基础 SkySeraph  2017 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com Over ...

  5. TensorFlow基础笔记(0) 参考资源学习文档

    1 官方文档 https://www.tensorflow.org/api_docs/ 2 极客学院中文文档 http://www.tensorfly.cn/tfdoc/api_docs/python ...

  6. TensorFlow基础笔记(3) cifar10 分类学习

    TensorFlow基础笔记(3) cifar10 分类学习 CIFAR-10 is a common benchmark in machine learning for image recognit ...

  7. TensorFlow基础剖析

    TensorFlow基础剖析 一.概述 TensorFlow 是一个使用数据流图 (Dataflow Graph) 表达数值计算的开源软件库.它使 用节点表示抽象的数学计算,并使用 OP 表达计算的逻 ...

  8. 小白之Python-基础中的基础04

    继续.. ------------------------华丽的分界线----------------------------- Python-基础中的基础04 --之方法 格式:对象.方法() 1. ...

  9. 05基于python玩转人工智能最火框架之TensorFlow基础知识

    从helloworld开始 mkdir mooc # 新建一个mooc文件夹 cd mooc mkdir 1.helloworld # 新建一个helloworld文件夹 cd 1.helloworl ...

  10. tensorflow基础练习:线性模型

    TensorFlow是一个面向数值计算的通用平台,可以方便地训练线性模型.下面采用TensorFlow完成Andrew Ng主讲的Deep Learning课程练习题,提供了整套源码. 线性回归 多元 ...

随机推荐

  1. 用 solon-ai 写个简单的 deepseek 程序(构建全国产 ai 智能体应用)

    用国产应用开发框架(及生态),对接国产 ai.构建全国产 ai 智能体应用. 1.先要申请个 apiKey 打开 https://www.deepseek.com 官网,申请个 apiKey .(一万 ...

  2. Gradle的安装及换源详细教程

    Gradle是一个基于JVM的构建工具,用于自动化构建.测试和部署项目. 1. 安装Gradle a. 首先,确保你已经安装了Java Development Kit (JDK),并且已经配置了JAV ...

  3. python文件不显示cmd黑窗口,打包py,pyw文件为exe文件

    问题描述:编写的python文件为定时任务,需要长时间运行,但是打开的cmd黑色窗口看起来很不舒服,于是打包为exe文件,隐藏cmd黑色窗口 步骤:1.使用pip install pyinstalle ...

  4. Anoii之UDP与多路复用

    代码连接:https://github.com/Afeather2017/anoii/blob/master/src/udp_peer.cc 以往写了TCP的多路复用,发现它还挺难写对的.现在写UDP ...

  5. Win10 非正常断电重启后出现长时间磁盘100%活动占用

    老毛病,以往半个小时左右会正常,这次上电1s发现风扇被卡马上关机,在启动结果硬生生卡了1h:应该是触发了微软某些后台的某些服务进程,记录一下 可疑涉事进程记录: svchost:Win服务主进程,是层 ...

  6. Web前端入门第 13 问:HTML 标签和属性是否区分大小写?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 注意:以下截图都来源于 Chrome 浏览器,不同浏览器可能会产生不同的渲染结果. 思考一个问题:英文写法都分大 ...

  7. ant-design-pro 自定义表单 rules规则

    表单输入 <ProFormText name="id" label={intl.formatMessage({ id: 'pages.secret.form.id' })} ...

  8. Joker 智能开发平台:低代码开发的革新力量

    在软件开发领域,开发效率与灵活性始终是开发者们追求的核心目标.随着技术的迅猛发展,低代码开发平台逐渐成为行业焦点,而 Joker 智能开发平台凭借其卓越的性能和创新的功能,脱颖而出,为开发者们带来了前 ...

  9. SpringBoot集成亚马逊的S3对象存储

    依赖导入:aws-java-sdk-s3 <dependencyManagement> <dependencies> <dependency> <groupI ...

  10. UNIX 系统

    UNIX 系统的历史,UNIX 是操作系统的开山鼻祖,是操作系统的发源地,后来的 Windows 和 Linux 都参考了 UNIX. 有人说,这个世界上只有两种操作系统: UNIX 和类 UNIX ...