tensorflow基础操作

2023-11-06

目录

数据类型:

数据载体:

如何创建一个tensor

        创建随机数

tensor的性质

        检查维度

      检查tensorflow是用cpu还是gpu

      将tensor格式转换成numpy格式

        检查tensor的数据类型

转换tensor

        将格式转换成tensor格式

        tensor间的数据类型转换

         将tensor声明成可训练变量

          将tensor转换成numpy格式

 索引与切片

        两种索引方式

        切片

        选择索引

维度变换

tensor的运算规则

                前置知识

                 tensor的运算

                        加法

                        函数实现        

数学计算


数据类型:

        与C语言类似   - int (整型), float(单精度浮点型) ,double(双精度浮点型)

                                -bool(布尔型,也就是True,Flase)

                                -string(字符型)

数据载体:

        这块就是tensorflow和其他库大相径庭的地方。为了能更好的适应深度学习,具备自动求导,gpu加速等,tensorflow中设计的数据载体为:Tensor

                        零维,也就是scalar,如1.1,2,3之类的标量

                        一维,vector,被称为向量,矢量,因为需要具备方向和大小两种数据,,如[ 1.1],[2.2,1.1],需要注意的是,其与scalar在表现形式上的差别在于数据外面有没有加方括号。

                        二维,matrix,矩阵,方框之外还套着层方框。如[[1.1,2.2,3.3],[4,2,6],[8,5.5,3]].        

                         当维度大于二时(rank>2)时,就称为tensor

        而tensorflow这词也是因此而起,tensor在程序里不断地流动。

如何创建一个tensor

        

        1.tf.constant,如:

#整型
const = tf.constant(1)

#单精度浮点型
flo   = tf.constant(1.1)

#双精度浮点型
dou   = tf.constant( 2. , dtype = tf.double)

#字符型
str   = tf.constant("Hello , Tensorflow")

#布尔型
boo   = tf.constant([ True , Flase ])


        2. tf.convert_to_tensor()

        3. tf.zeros()   #此处函数传递的是shape而不是data

        4.tf.zeros_like() #此处函数传递的是data 其可等价为 

        5.tf.ones() #与3用法一样

        6.tf.oner_like()

        7.tf.fill ( [ 2,3 ] , 0)  #将创建一个矩阵将一个常数填满其中 

        创建随机数

         1. tf.random.normal( shape ,

                                             mean = 0.0 ,

                                              tddev = 1.0  ,

                                              dtype = tf.float32 ,

                                             seed = None , name  = None )                #具有正态分布概率的随机数

        ` shape: 张量类型,必填

        · mean :正态分布的均值 , 默认为0.0

         ·stddev : 正态分布的标准差, 默认为1.0

          ·dtype : 输出的类型 , 默认为tf.float32 

           `seed : 随机种子数,是一个整数,设置后,每次生成的随机数都一样

            `name : 操作的名字 

          2. tf.random.truncated_normal (shape ,mean = 0.0 , tddev = 1.0  ,dtype = tf.float32 , seed = None , name  = None)         #参数与上面如出一辙,不过随机值是从截断的正态分布中输出,生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择

                3. tf.random_uniform(   shape,

                                                        minval=0,

                                                        maxval=None,

                                                        dtype=tf.float32,

                                                        seed=None,

                                                        name=None)         #具有上下限的随数机

        ·minval : 最小值

        ·maxval : 最大值

       4. tf.random.shuffle(value,         

                                        seed = None,

                                        name = None )   #沿着零维打乱

        

a = tf.zeros( [2,5 ] )

tf.zeros_like( a )

#上下这二者等价
tf.zeros( a.shape ) 

tensor的性质

        检查维度

                   1.      .ndim()

                    2.    tf.rank()

                        

 a = tf.constant( 1.1)

 a.ndim()
 print(a.ndim())

 tf.rank(a)
 print(tf.rank(a))

      检查tensorflow是用cpu还是gpu

        .gpu()   .cpu()

      将tensor格式转换成numpy格式

           .numpy()

        检查tensor的数据类型

              1. tf.is_tensor()

              2. .dtype

              3. isinstance(a , tf.Tensor)

转换tensor

        将格式转换成tensor格式

        tf.convert_to_tensor( )

                 

a = tf.constant(1) 


flo_a =  tf.convert_to_tensor(a, dtype =tf.float32) 
print( type( flo_a ) )

dou_a = tf.convert_to_tensor(a , dtype =tf.double)
print( type( dou_a ) )

        

        tensor间的数据类型转换

               tf.cast( a, dtype = tf.  )

         将tensor声明成可训练变量

                 tf.Variable( a )

                注意:此处若是想用isconstance()检查是否为tensor格式,将无法检测出来

                

 a = tf.constant(1)

 a = tf.Variable(a)

 isinstance( a , tf.Tensor)#False

 isinstance( a , tf,Variable)#True

          将tensor转换成numpy格式

              1.  .numpy()

               2. int( a )  #直接用强制类型转换

 索引与切片

        两种索引方式

               1. Basic indexing  # [idx][idx]

               2. Same with Numpy         #[idx,idx] 

        切片

                需配合着第二种索引方式 ,形式为[ start:over  :  step]   #start 为起始下标,默认为0,over为结束下标,默认为最后一个数字+1,step为步长 。 step默认为1。注意,此处设定的切片是包含左左端,不包含右端,故给定数值时需注意

        

  a =tf.range( 5 )
  #[0 ,1, 2, 3, 4]
  
  a[ 1 : 5 : 2]
  #[1, 3]
 
  a[ -1 : -4 : 1 ]
  # [4, 3, 2]   

                 也可用...代替重复冗杂的数值

        

a =tf.random.normal([4,28,28,3])

a.shape
#[4,28,28,3]

a[1,2].shape
#[28,3]

a[0 , ...,0].shape
#[28,28]

a[0 , : : ,: : , 0].shape
#[28,28]

a[...,0].shape
#[4,28,28]

        选择索引

      1. tf.gather(params,

                        axis 

                        indices, 

                        validate_indices=None, 

                        batch_dims=0,

                        name=None )                #就是抽取出params的第axis维度上在indices里面所有的index

 a= tf.random.normal([4,28,28,3])

 tf.gather(a, axis =1 , indices = [4,2]).shape
 # [4,2,28,3]

        2.  tf.gather_nd(params,

                                indices,

                                name=None)

         #在params中的indices中的所有index

 a =tf.random.normal([4,28,28,3])

 tf.gather_nd(a , [0,1]).shape
 # [28,3]
 
 tf.gather_nd(a, [0,1,0]).shape
 #[3]
 

 tf.gather_nd(a, [ [0,0,0],[1,1,1] ]).shape
 #[2,6]

 tf.gather_nd(a , [[[0,0,0],[1,1,1],[2,2,2]]]).shape
 #[1,3,3]

             3.    tf.boolean_mask(
                                                            tensor,
                                                             mask,
                                                            name='boolean_mask',
                                                            axis=None
                                                        )

            

a = tf.random.normal([4,28,28,3]) 

 tf.boolean_mask(a,mask = [True,True,False,False],axis = 0).shape
 #[2,28,28,3]
 
b =tf.ones([2,3,4]) 
 
tf.boolean_mask(b , mask = [ [True,True,False],[True,False,True] ]).shape
 #[4,4]

维度变换

       1.  tf.reshape(

                                tensor,

                                 shape,

                                  name=None

                              )    #注意:只是转换了view而没转换content

        

a = tf.random.normal([4,28,28,3])

tf.reshape(a, [4,-1,3]).shape
#[4,28,28,3]

tf.reshape(a, [4,784,3]).shape
#[4,784,3]

       

     2.   transpose(
                  tensor,
                  perm=None,
                  name='transpose' 
                 )                 
                  
        #转置函数 此函数会将content转换。,若是不设定perm 参数,函数将默认将tensor倒置  
a  = tf.random.normal( [4,10,2])

tf.transpose(a ,[2,1,0]).shape
#[2,10,4]

tensor的运算规则

                此处涉及到线性代数方面的知识

                前置知识

                        两矩阵相加的条件是 两矩阵必须同阶,相加也就是对应位置的数值相加

                          \begin{bmatrix} 2 &2 \\ 3 &2 \end{bmatrix}\ +\begin{bmatrix} 2& 6 \\ 7 & 8 \end{bmatrix}=\begin{bmatrix} 4 &8 \\ 11& 10 \end{bmatrix}

        

                 tensor的运算

                         于是,但两个tensor运算时也需遵守这些规则。但值得注意的是,tensorflow中的乘法和加法会对tensor进行一定变化后才运算。

                        加法

                                两shape不同的tensor,符合最小维度相同也能够相加,如

                                                 \begin{bmatrix} 4 &5 \\ 2 & 2\\ 3&1 \end{bmatrix} + \begin{bmatrix} 1 &1 \end{bmatrix} 

      一个是[3,2] ,另一个是[1,2],它们最小的维度都为2 ,且不相同的维度其为1, tensorflow会将[1,2]转换成[3,2]若是  [3,2] +[2,2]就无法完成转换。

                                                \begin{bmatrix} 1 & 1 \end{bmatrix}  --->\begin{bmatrix} 1 &1 \\ 1&1 \\ 1 &1 \end{bmatrix} 。

                而对于更高维度的tensor加法,同样适用

                        函数实现        

用tf.broadcast_to的好处是:broadcast不会真将矩阵扩大,而是在运行时一个优化手段,既高效又省内存

                

 a =tf.random.normal([2,3,2,4])

 b =tf.random.normal([3,2,4])

 (a+b).shape
#[2,3,2,4]


'''
只要符合规则,tensor会自动变换,
但是这变换其实是有几个步骤,

比如说
a.shape = [3,2,4]  b.shape = [2,3,2,4]
a + b 

需要先将[3,2,4]expand,变成[1,3,2,4]
再tile , 变成[2,3,2,4]

'''
b =tf.random.normal([3,2,4])

b1  = tf.expand_dims(b , axis = 0)
#[1,3,2,4]
b1  = tf.till( b1, [2,1,1,1])
#[2,3,2,4]

#而brocast_to可以一步到位
b2 = tf.brocast_to(b , [2,3,2,4])

数学计算

               element-wise:

                      +(加), -(减), *(点乘,两个相同阶的矩阵,相对位置直接相乘),/(除),

                       **(次方) ,tf.pow(次方)  ,tf.square(平方) ,tf.sqrt(平方根)

                        //(整除),%(取余)

                       tf. exp(以e为底的幂函数),tf.math.log(以e为底的对数)        

                matrix-wise:

                        @(矩阵乘运算,叉乘),tf.matmul(矩阵乘运算) 比如[n,3,4]+[n,4,5] = [ n,3 ,5 ],需保证前个矩阵的列数和后个矩阵的行数相同,且最大的维度相同

                 dim-wise:

                        tf.reduce_mean/max/min/sum

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow基础操作 的相关文章

随机推荐

  • 确保Web地址 //ieframe.dll/dnserrordiagoff.htm#正确

    今天来解决一个新的问题 即在用 chm文件与visual studio做联机帮助时遇到的 确保Web地址 ieframe dll dnserrordiagoff htm 正确 如下图所示 em 这个错误确实让我无语住了 有点荒谬也很炸裂 原
  • 构建基础篇 2:webpack 在 CLI 3 中的应用

    鄙人已付费购买 粘贴出来给更多前端爱好者学习 若掘金小册禁止此类操作 请联系 webpack 作为目前最流行的项目打包工具 被广泛使用于项目的构建和开发过程中 其实说它是打包工具有点大材小用了 我个人认为它是一个集前端自动化 模块化 组件化
  • openwrt在命令行或脚本中实现毫秒级延时

    在Linux openwrt等嵌入式系统中在命令行或者脚本中只能实现秒级延时 比如sleep命令 可以通过头文件位于unistd h的usleep函数实现毫秒级延时 再将其封装为 命令即可 比如 xdelayms 100 100ms del
  • logback 自定义log字段(MDC)推送到logstash(spring boot + logback+ logstash)

    直接上代码 1 创建FIlter 往 MDC 里面追加内容 WebFilter Component public class LogBackFilter implements Filter Override public void init
  • Sharding-JDBC数据源初始化卡死在{dataSource-X} inited

    遇到一个问题 排查了比较久 如果有遇到类似的问题 可以参考一下 问题描述 Sharding JDBC在只有一个主从数据源的情况下会扫描数据库全表 如果该库建表较多 如 单库分1024张表 会造成数据源初始化接近半小时之久 解决方案 增加一个
  • VOC分析的实际流程

    VOC分析的实际流程 实际进行VOC分析的时候 应该做什么 怎么做呢 其大致流程如下图所示 接下来 将分别进行具体说明 明确目的 首先应该做的是明确 为了什么进行VOC分析 的目的 正如前文所述 VOC种类繁多 数量庞大 其分类和分析方法也
  • Python from import导包ModuleNotFoundError No module named,找不到模块问题

    在学习Flask框架的蓝图时 遇到导包时用到了 from 模块 import 对象 然后试了试直接 import会报错 直接告诉我找不到模块 发现问题以此记录 场景 有一个flask框架的项目 目录结构如下 有一个主包pro flask 然
  • Linux中find指令基本详解

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net caicai1617 article details 21512239 find指令的
  • 思普协同服务器不稳定,思普操作系统怎么样?

    思普操作系统怎么样呢 思普操作系统功能有哪些呢 思普操作系统有桌面版和服务器版两种 简单实用 具体思普操作系统怎么样 思普操作系统好用吗 我们一起来了解一下 思普操作系统怎么样 1 思普操作系统将办公 娱乐 通讯等开源软件一同封装到办公系统
  • git生成Key操作保存到GITHUB中

    https blog csdn net sinat 23880167 article details 78502528 1 在git中通过命令 ssh keygen Generating public private rsa key pai
  • Kali Linux 学习资源整理

    Kali Linux 官网 https www kali org Kali Linux官方教材 https kali training Penetration Testing Training with Kali Linux https w
  • cookies,session,token的区别和使用(接口参考)

    cookies session token的区别和使用 接口参考 1 依据和使用 基于cookie 因cookie的验证是有状态的 验证流程 用户输入登陆凭据 服务器验证凭据是否正确 并创建会话 然后把会话数据存储在数据库中 具有会话id的
  • Vue开发技巧总结

    1 路由参数解耦 通常在组件中使用路由参数 大多数人会做以下事情 export default methods getParamsId return this route params id 在组件中使用 route 会导致与其相应路由的高
  • 【管理学】作业与思考题

    绪论 管理学的研究对象是什么 在企业管理研究基础上抽象出的一般管理理论对其他组织的管理是否也具有指导意义 管理学的研究对象是人类的管理实践 从广义上来说 管理实践包括对个体活动的 管理和对群体活动的管理 任何个人即使在从事仅与自己相关的目标
  • [Github] GitKraken 简体中文翻译补丁

    GitKraken 简体中文翻译补丁 项目地址 项目原理 本项目通过将 rogeraabbccdd GitKraken zh tw 翻译包内的繁体中文文件转化为简体中文而成 采用了 Python3 9 作为转换工具并利用 Github Ac
  • 【高性能】Linux挂载GPT硬盘

    Linux挂载GPT硬盘 硬盘分区表存储了硬盘数据块的存储方式 根据分区表 可以将主流硬盘划分为MBR和GPT格式 其中MBR支持2T以下的硬盘 GPT则是新分区表标准 能支持2T以上的硬盘 64位Linux可以兼容MBR和GPT两类硬盘
  • 吉林大学计算机系高级语言程序设计(C语言)期末题目及解答(下)

    内容简介 因为正在准备考研复试 所以计划把吉大期末的C语言题目重新刷一遍 上机 做为笔记放在这里 有需要的朋友请自提 注 持续更新 因为文章过大所以分为了上下两篇 上篇也在我的博客列表里 本文所有代码均已测试通过 未通过的会在前面标注 未通
  • java 返回文件的二进制字符串给前端

    RequestMapping value fileToStream method RequestMethod GET ApiOperation 将文件转成流传给前端 public WebResponse fileToStream HttpS
  • java jar后台启动的三种方式

    java jar启动 linux中启动 java jar 后台运行程序 直接用java jar xxx jar 当退出或关闭shell时 程序就会停止掉 以下方法可让jar运行后一直在后台运行 java jar xxx jar 说明 在末尾
  • tensorflow基础操作

    目录 数据类型 数据载体 如何创建一个tensor 创建随机数 tensor的性质 检查维度 检查tensorflow是用cpu还是gpu 将tensor格式转换成numpy格式 检查tensor的数据类型 转换tensor 将格式转换成t