15- TensorFlow基础 (TensorFlow系列) (深度学习)

news2024/11/24 20:37:46

知识要点

  • TensorFlow是深度学习领域使用最为广泛的一个Google的开源软件库 .
  • TensorFlow中定义的数据叫做Tensor(张量), Tensor又分为常量和变量.
    • 常量一旦定义值不能改变
  • 定义常量: t = tf.constant([[1., 2., 3.], [4., 5., 6.]])
  • 定义变量: v = tf.Variable([[1., 2., 3.], [4., 5., 6.]])
  • tensor 转换为numpy 数组: print(t.numpy()) 
  • 常量里面是字符串时: d = tf.constant('abcd')
  • 创建不整齐的tensor: r = tf.ragged.constant([[11, 12], [21, 22, 23], [], [41]])
  • 拼接张量: print(tf.concat([r, r2], axis = 0))
  • s = tf.SparseTensor(indices=[[0, 1], [1, 0], [2, 3]], values = [1, 2, 3], dense_shape = [3, 4])   # 生成稀疏矩阵
  • 转换为稠密矩阵: print(tf.sparse.to_dense(s))
  • 定义变量: v = tf.Variable([[1, 2, 4], [3, 5, 6]])
  • 对变量的某个位置进行赋值: v[0, 1].assign(42)
  • 可以指定聚合的轴上的平均值: x_reduce_mean = tf.reduce_mean(x, axis=0)
  • 按列求和: print(x.sum(axis = 0))   # [16 15 20 21 16 22]
  • 矩阵运算: dot = tf.matmul(x, y)


1 TensorFlow简介

1.1 TensorFlow基础

  • TensorFlow是深度学习领域使用最为广泛的一个Google的开源软件库(最初由Google brain team进行开发的内部库,由于它的易用性Google决定把它开源出来).
  • 采取数据流图,用于数值计算.
    • 节点 —— 处理数据
    • 线 —— 节点间的输入输出关系
    • 数据流图中的数据叫做tensor, 表示张量, 即N维数据, tensor在数据流图中流动表示计算的过程, 这也是tensorflow名字的由来.

                        

  • 支持多种平台,GPU、CPU、移动设备

  • tensorflow特性:

    • 高度的灵活性: 只要能把数据的计算表示成数据流图就可以使用tensorflow

    • 真正的可移植性: 比如CPU、GPU、移动设备等等

    • 产品和科研结合

      • tensorflow研究最初是用于科研的,其实科研和工程还有一定的距离,科研的代码需要进一步各种各样的优化才能真正的做到产品上去,但是对于tensorflow则没有这个问题,Google团队把tensorflow优化的已经比较好了,做研究的代码可以无缝的用到产品上

    • 自动求微分

    • 多语言支持

      • tensorflow除了python以外,还支持各种各样的语言,比如说c++、java、javascript、R语言

    • 性能最优化

      • 在tensorflow刚刚出来的时候由于它运行的比较慢,很多深度学习库呢都会拿tensorflow来进行比较,然后来证明自己比tensorflow好多少倍,但是随着tensorflow一步一步的进行开发,这种情况一去不复返了,tensorflow现在应该是运行最快的一个库,对于分布式的tensorflow来说,它的加速比几乎是线性的

1.2 tensorflow 2.0 架构特点

tensorflow2.0 主要特性:

  • 使用 tf.keras eager mode(动态图模式)进行更简单的模型构建.

    • 使用tf.data加载数据

    • 使用tf.keras构建模型,也可使用premade, estimator来验证模型

      • 使用tensorflow hub进行迁移学习

    • 使用eager mode运行和调试

    • 使用分发策略来进行分布式训练

    • 导出到SavedMode

    • 使用TensorFlow Serve、Tensorflow Lite、Tensorflow.js部署模型

  • 鲁棒的跨平台模型部署

    • TensorFlow服务

      • 直接通过HTTP/RESR或GRPC/协议缓冲区

    • TensorFlow Lite——可部署到Android、iOS和嵌入式系统上

    • TensorFlow.js——在JavaScript中部署

    • 其他语言

      • C、Java、Go、C#、Rust、Julia、R等

  • 强大的研究试验

    • Keras功能API和子类API、允许创建复杂的拓扑结构

    • 自定义训练逻辑、使用tf.GraddientTapetf.custom_gradient进行更细粒度的控制

    • 底层API自始至终可以与高层结合使用、完全的可定制

    • 高级扩展:Ragged Tensor、Tensor2Tensor等

  • 清除不推荐使用的API和减少重复来简化API

2 基础API使用

TensorFlow中定义的数据叫做Tensor(张量), Tensor又分为常量和变量.

2.1 常量的定义和使用

常量一旦定义值不能改变.  使用tf.constant定义常量.

  • 使用tf.constant定义常量
# 常量一旦定义, 不能变, 不可更改
import tensorflow as tf
t = tf.constant([[1., 2., 3.], [4., 5., 6.]])
# 可以像numpy的ndarray一样使用tensor
print(t)     # tf.Tensor([[1. 2. 3.], [4. 5. 6.]], shape=(2, 3), dtype=float32)
print(t[:, 1:])    # tf.Tensor([[2. 3.], [5. 6.]], shape=(2, 2), dtype=float32)
print(t[..., 1])   # 或t[:, 1]  # tf.Tensor([2. 5.], shape=(2,), dtype=float32)
  • 常量的操作
print(t+10)   # 每个元素都加10
print(tf.square(t))   # 每个元素都做平方
print(t @ tf.transpose(t))   # @表示矩阵的点乘
  • 常量tensornumpy中的ndarray转化
    • tf.constant(numpy)     # 将numpy数组转换为tensor
import numpy as np
# .numpy()可以把tensor转化为ndarray
print(t.numpy())    # 转换为numpy数组  [[1. 2. 3.], [4. 5. 6.]]
print(np.square(t))    # 直接转换  [[ 1.  4.  9.], [16. 25. 36.]]
np_t = np.array([[1., 2., 3.], [4., 5., 6.]])
# 直接使用ndarray生成一个tensor
print(tf.constant(np_t))    # tf.Tensor([[1. 2. 3.], [4. 5. 6.]], shape=(2, 3))
  • 生成标量
# scalar
t = tf.constant(2.718)
print(t.numpy())    # 2.718
print(t.shape)     # ()
  • 切片
a[:, 1:].numpy()   # array([[2, 3], [5, 6]])
  • ... 表示逗号前所有的维度
# 特有的写法
# ... 表示逗号前所有的维度, 只取最后一个维度的值(二维时,取其中列的值)
a[..., 1:]
'''<tf.Tensor: shape=(2, 2), dtype=int32, numpy=array([[2, 3], [5, 6]])>'''
  • 使用字符串
t = tf.constant("cafe")  # # strings
print(t)  # tf.Tensor(b'cafe', shape=(), dtype=string)
print(tf.strings.length(t)) # 获取字符串的长度  tf.Tensor(4, shape=(), dtype=int32)
print(tf.strings.length(t, unit="UTF8_CHAR")) # 获取utf8编码的长度
print(tf.strings.unicode_decode(t, "UTF8")) # 把字符串转化为utf8编码  
  • 常量里面是字符串
# 常量里面是字符串时
d = tf.constant('abcd')
d   # <tf.Tensor: shape=(), dtype=string, numpy=b'abcd'>
  • 使用字符串数组
    • 字符串的一些方法: tf.strings.length(d)
    • utf8的编码长度: tf.strings.length(d, unit = 'UTF8_CHAR')
    • 字符编码方式的转化: tf.strings.unicode_decode(d, 'UTF8')
# string array
t = tf.constant(["cafe", "咖啡"])
print(tf.strings.length(t, unit="UTF8_CHAR"))  # tf.Tensor([4 2], shape=(2,))
r = tf.strings.unicode_decode(t, "UTF8")
print(r)    # <tf.RaggedTensor [[99, 97, 102, 101], [21654, 21857]]>
  • 创建ragged tensor  # ragged tensor 不整齐的tensor, 上面的tensor每个字符串长度不一致.
r = tf.ragged.constant([[11, 12], [21, 22, 23], [], [41]])
# index op
print(r)   # <tf.RaggedTensor [[11, 12], [21, 22, 23], [], [41]]>
print(r[1])  # tf.Tensor([21 22 23], shape=(3,), dtype=int32)
# 左闭右开
print(r[1:2])   # <tf.RaggedTensor [[21, 22, 23]]>
  • ragged tensor的操作: 拼接张量的函数
r2 = tf.ragged.constant([[51, 52], [], [71]])
# 拼接操作, axis=0按行拼接. 如果按列拼接会报错. 因为行数不一致.
print(tf.concat([r, r2], axis = 0))
'''<tf.RaggedTensor [[11, 12], [21, 22, 23], [], [41], [51, 52], [], [71]]>'''
  • 按列拼接
r3 = tf.ragged.constant([[13, 14], [15], [], [42, 43]])
print(tf.concat([r, r3], axis = 1))
'''<tf.RaggedTensor [[11, 12, 13, 14], [21, 22, 23, 15], [], [41, 42, 43]]>'''
  •  把 ragged tensor 转化为普通tensor
# 缺元素的地方会补0, 0在正常元素的后面.
print(r.to_tensor())
'''tf.Tensor(
[[11 12  0]
 [21 22 23]
 [ 0  0  0]
 [41  0  0]], shape=(4, 3), dtype=int32)'''
  •  创建 sparse tensor   # sparse tensor 稀疏 tensor, tensor中大部分元素是0, 少部分元素是非0.
# indices指示正常值的索引, 即哪些索引位置上是正常值. values表示这些正常值是多少.
# indices和values是一一对应的. [0, 1]表示第0行第1列的值是1, [1,0]表示第一行第0列的值是2,
# [2, 3]表示第2行第3列的值是3, 以此类推.
# dense_shape表示这个SparseTensor的shape是多少
s = tf.SparseTensor(indices = [[0, 1], [1, 0], [2, 3]],
                    values = [1., 2., 3.],
                    dense_shape = [3, 4])
print(s)
# 把sparse tensor转化为稠密矩阵 
print(tf.sparse.to_dense(s))

  • sparse tensor的运算
# 乘法
s2 = s * 2.0
print(s2)
try:
    s3 = s + 1   # 加法不支持.
except TypeError as ex:
    print(ex)
s4 = tf.constant([[10., 20.],
                  [30., 40.],
                  [50., 60.],
                  [70., 80.]])
# 得到一个3 * 2 的矩阵
print(tf.sparse.sparse_dense_matmul(s, s4))

  • 注意在定义sparse tensor的时候 indices 必须是排好序的. 如果不是, 定义的时候不会报错, 但是在to_dense的时候会报错
# [0, 2]在[0, 1]前面
s5 = tf.SparseTensor(indices = [[0, 2], [0, 1], [2, 3]],
                    values = [1., 2., 3.],
                    dense_shape = [3, 4])
print(s5)
# 可以通过reorder对排序, 这样to_dense就没问题了.
s6 = tf.sparse.reorder(s5)
print(tf.sparse.to_dense(s6))

2.2 变量的使用

变量和常量相对, 变量定义之后可以改变值.

  • 通过tf.Variable来定义变量
# 变量, 即内部的值可以变化, 比如神经网络中的w, b 就是变量
# tf.Variable 来定义即可
v = tf.Variable([[1, 2, 4], [3, 5, 6]])
print(v)
'''<tf.Variable 'Variable:0' shape=(2, 3) dtype=int32, numpy=
array([[1, 2, 4],
       [3, 5, 6]])>'''
  •  对变量进行赋值     # 注意: 变量赋值必须使用assign, 不能直接用=.
# 对变量之间赋值, 所有位置乘于2
v.assign(2*v)
print(v.numpy())     # [[ 2  4  8] [ 6 10 12]]
# 对变量的某个位置进行赋值
v[0, 1].assign(42)
print(v.numpy())     # [[ 2 42  8] [ 6 10 12]]
# 对变量的某一行赋值
v[1].assign([7, 8, 9])
print(v)   # array([[ 2, 42,  8], [ 7,  8,  9]])>

2.3 TensorFlow的数学运算

  •  在TensorFlow中既可以使用数学运算符号进行数学运算也可以使用TensorFlow定义的方法.
# 两种方式, 一种是直接用python的算术运算符, 另一种使用TensorFlow封装的数学运算函数
# 定义常量
a = tf.constant(2)
b = tf.constant(3)
c = tf.constant(5)

# 定义运算, 也可以直接使用python运算符+,-, * / ...
add = tf.add(a, b)
sub = tf.subtract(a, b)
mul = tf.multiply(a, b)
div = tf.divide(a, b)

# 打印运算结果
print("add =", add.numpy())    # add = 5
print("sub =", sub.numpy())    # sub = -1
print("mul =", mul.numpy())    # mul = 6
print("div =", div.numpy())    # div = 0.6666666666666666
print('数学+运算 a+b=', (a + b).numpy())  # 数学+运算 a+b= 5
  • 聚合运算
    • 用于计算张量tensor沿着指定的数轴上的的平均值: tf.reduce_mean(x)
x = np.random.randint(0,10, size=(3,6))
print(x)  
'''[[2 1 8 7 7 8]
    [6 7 6 6 1 8]
    [8 7 6 8 8 6]]'''
x_mean = tf.reduce_mean(x)
# 默认会聚合所有的维度
print(x_mean.numpy())    # 6
# 按列求和
print(x.sum(axis = 0))   # [16 15 20 21 16 22]
# 可以指定聚合的轴
x_reduce_mean = tf.reduce_mean(x, axis=0)
print(x_reduce_mean.numpy())   # [5 5 6 7 5 7]
  • 矩阵运算
# 矩阵运算
x = np.random.randint(0,10, size=(3,6))
y = np.random.randint(0,10, size=(6,4))
dot = tf.matmul(x, y)
# 矩阵乘法的简写: x @ y
print(dot.numpy())
''' [[ 59  85  65  96]
     [143 125 116 211]
     [ 83  83  89 116]]'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑盒测试用例设计方法-边界值分析法

一、边界值定义 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 长期的测试工作经验告诉我们&#xff0c;大量的错误是发生在输入或输出范围…

Vision Transformer(ViT)

1. 概述 Transformer[1]是Google在2017年提出的一种Seq2Seq结构的语言模型&#xff0c;在Transformer中首次使用Self-Atttention机制完全代替了基于RNN的模型结构&#xff0c;使得模型可以并行化训练&#xff0c;同时解决了在基于RNN模型中出现了长距离依赖问题&#xff0c;因…

TDG code

部分 数据集 参数设置 def setup_args(args None):args.algorithm_name TDG# args.algorithm_name HDGargs.user_num 1000000args.attribute_num 6args.domain_size 64args.epsilon 0.2args.dimension_query_volume 0.5args.query_num 20args.query_dimension 3运行…

leetcode 41~50 学习经历

leetcode 41~50 学习经历41. 缺失的第一个正数42. 接雨水43. 字符串相乘44. 通配符匹配45. 跳跃游戏 II46. 全排列47. 全排列 II48. 旋转图像49. 字母异位词分组50. Pow(x, n)小结41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的…

C语言数据结构(二)—— 受限线性表 【栈(Stack)、队列(Queue)】

在数据结构逻辑层次上细分&#xff0c;线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”&#xff0c;可以自由的删除或添加结点。受限线性表主要包括栈和队列&#xff0c;受限表示对结点的操作受限制。一般线性表详解&#xff0c;请参考文章&…

数据结构基础之栈和队列

目录​​​​​​​ 前言 1、栈 2、队列 2.1、实现队列 2.2、循环队列 前言 上一篇中我们介绍了数据结构基础中的《动态数组》&#xff0c;本篇我们继续来学习两种基本的数据结构——栈和队列。 1、栈 特点&#xff1a;栈也是一种线性结构&#xff0c;相比数组&#xff…

(汇总记录)电机控制算法

1.S曲线应用电机加减速 电机控制 | S曲线加减速 - Tuple - 博客园 (cnblogs.com) 如要将S型曲线应用到电机的加减速控制上&#xff0c;需要将方程在X、Y坐标系进行平移&#xff0c;同时对曲线进行拉升变化&#xff1a;即 Y A B / ( 1 exp( -ax b ) ) &#xff0c;则根据该…

Pandas怎么添加数据列删除列

Pandas怎么添加数据列 1、直接赋值 # 1、直接赋值df.loc[:, "最高气温"] df["最高气温"].str.replace("℃", "").astype("int32")df.loc[:, "最低气温"] df["最低气温"].str.replace("℃"…

Java异常架构与异常关键字

Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离&#xff0c;保证程序代码更加优雅&#xff0c;并提高程序健壮性。在有效使用异常的情况下&#xff0c;异常能清晰的回答what, where, why这3个问…

【编程入门】N种编程语言做个应用市场(appstore)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 本系列做了个应用市场&#xff0c;支持下载安装安卓…

Bootstrap系列之导航

Bootstrap导航 可以在 ul 元素上添加 .nav类&#xff0c;在每个 li 选项上添加 .nav-item 类&#xff0c;在每个链接上添加 .nav-link 类: 基本的导航 <div class"container mt-3"><h2>导航</h2><p>简单的水平导航:</p><ul class&…

基于yolov5与改进VGGNet的车辆多标签实时识别算法

摘 要 为了能快速、有效地识别视频中的车辆信息&#xff0c;文中结合YOLOv3算法和CNN算法的优点&#xff0c;设计了一种能实时识别车辆多标签信息的算法。首先&#xff0c;利用具有较高识别速度和准确率的YOLOv3实现对视频流中车辆的实时监测和定位。在获得车辆的位置信息后…

《亚马逊逆向工作法》读书笔记

文章目录书籍信息构件&#xff1a;领导力准则与机制亚马逊领导力准则机制&#xff1a;强化领导力准则年度计划&#xff1a;OP1与OP2S-Team目标亚马逊的薪酬制度&#xff1a;强化长期思维招聘&#xff1a;亚马逊独特的抬杆者流程抬杆者招聘流程组织&#xff1a;独立单线程领导模…

Redis-Java代码使用示例

在我之前的项目中&#xff0c;使用Redis是我们团队自己封装了一个Redis操作类&#xff0c;但是这只是在Spring提供的RedisTemplate上做了一层封装而已&#xff0c;当时使用不是很熟练&#xff0c;都是一边在网上查资料&#xff0c;一边使用&#xff1b;这篇文章会介绍两种使用方…

分布式一致性算法——Paxos 和 Raft 算法

写在前面 本文隶属于专栏《100个问题搞定大数据理论体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见100个问题搞定大数据理论体系 I. 简介 介绍Paxos…

局域网实现PC、Pad、Android互联

文章目录局域网实现PC、Pad、Android互联一、网络邻居1、 Windows 配置1.1 开启共享功能1.2 设置用户1.3 共享文件夹2、 Pad 连接二、 FTP & HTTP1、 电脑配置1.1 HTTP 服务1.2 FTP 服务2、 连接3、 电脑连接 FTP三、 其他方式局域网实现PC、Pad、Android互联 在我们使用多…

【micropython】SPI触摸屏开发

背景&#xff1a;最近买了几块ESP32模块&#xff0c;看了下mircopython支持还不错&#xff0c;所以买了个SPI触摸屏试试水&#xff0c;记录一下使用过程。硬件相关&#xff1a;SPI触摸屏使用2.4寸屏幕&#xff0c;常见淘宝均可买到&#xff0c;驱动为ILI9341&#xff0c;具体参…

windows服务器实用(2)——搭建本地文档管理(gitbit的部署)

windows服务器实用——部署gitbit 在日常的项目管理中&#xff0c;无论是文档还是代码&#xff0c;一般都是存在本地。但是本地的文件存在一定的不确定性&#xff0c;尤其是当文档经常改动的时候&#xff0c;如果要找回之前改动的文件是很困难的。如果每次的改动都存在本地&am…

数据结构与算法之链表

目录单链表概念单链表操作循环链表概念循环链表操作双向循环链表概念双向循环链表操作单链表 概念 单链表也叫单向链表&#xff0c;是链表中最简单的一种形式&#xff0c;它的每个节点包含两个域&#xff0c;一个信息域&#xff08;元素域&#xff09;和一个链接域。这个链接…

微信投票-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-5】 微信投票 【任务介绍】 1.任务描述 如今微信聊天已经普及到几乎每一个人&#xff0c;在聊天中&#xff0c;经常会有人需要帮忙在某个APP中投票。本案例要求编写一个模拟微信投票的程序&#xff0c;通过在控制台输入指令&#xff0c;实现添加候选人、查看当前投票…