【2】tensorflow基本概念及变量函数

news2024/12/23 17:40:58

目录

1 tensorflow运行机制

  1.1 搭建计算图模型

计算图的概念

 计算图的使用

新建计算图

1.2 在会话中执行计算图

会话的启动方式

 1.3 指定计算图的运行设备

2 tensorflow数据模型

2.1 认识张量及属性

张量的类型

张量的阶

2.2 张量类型转换和形状变换

张量类型转换

 张量形状变换

3 变量的定义与使用

3.1 定义与使用变量

变量定义

 初始化变量

3.2 参数初始化变量

使用常量初始化

初始化为常量

初始化为正态分布

4 变量管理与模型数据喂入

4.1 变量管理

tf.get_variable获取变量

 tf.variable_scope指定作用域

tf.name_scope命名空间管理

4.2喂入数据模型

占位符创建变量

 模型喂入数据


1 tensorflow运行机制

  1.1 搭建计算图模型

计算图的概念

tensor表示张量,其实质是某种类型的多维数组,flow表示张量在不同节点之间流动转换。

例如实现两个张量的相加:

 计算图的使用

tensorflow程序通常被组织成计算图的构建阶段和执行阶段。

import tensorflow as tf

a = tf.constant([4,8],dtype=tf.int32)
b = tf.constant([3,6],dtype=tf.int32)
result=tf.add(a,b)
print(result)

新建计算图

可以使用默认计算图

tf.get_default_graph()

也可以通过tf.Graph生成新的计算图

import tensorflow as tf

# 新建计算图g1
g1 = tf.Graph()
# 新建计算图g2
g2 = tf.Graph()
with g1.as_default():
    # 在g1图中新建张量v
    v = tf.constant([1.0,2.0], name="v", dtype=tf.float32)
with g2.as_default():
    # 在g2中新建装量v
    v = tf.constant([3.0,4.0], name="v", dtype=tf.float32)
tensor1 = g1.get_operation_by_name("v")
tensor2 = g2.get_operation_by_name("v")
# 打印张量
print("g1:",tensor1)
print("g2:",tensor2)

1.2 在会话中执行计算图

1.1中的例子并没有执行计算,是因为计算图只有在会话提供的上下文环境中才能启动。

会话的启动方式

# 导入tensorflow类库
import tensorflow as tf
# 定义张量m
m = tf.constant([[4,8,3],[12,16,5]],dtype=tf.int32)
# 定义张量b
n = tf.constant([[5,10,4],[8,14,6]],dtype=tf.int32)
# 实现两个张量的加法运算
result = m + n
print(result)
with tf.Session() as sess:
    print(sess.run(result))
Tensor("add:0", shape=(2, 3), dtype=int32)
[[ 9 18  7]
 [20 30 11]]

计算图与会话的关系:

 1.3 指定计算图的运行设备

如果没有指定的话,tensorflow会自动检测并找到cpu执行操作,如果电脑中有多块cpu的话,还可以用with...device语句用来指派指定的CPU操作:

import tensorflow as tf
import os
# 指定使用第1块GPU
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
v1 = tf.constant([1.0, 2.0, 3.0], shape=[3], name='v1')
v2 = tf.constant([1.0, 2.0, 3.0], shape=[3], name='v2')
sum = v1 + v2
with tf.Session() as sess:
    print(sess.run(sum))

2 tensorflow数据模型

2.1 认识张量及属性

tensor(张量)用来表示tensorflow程序中的所有数据。可以把tensor看成一个n维数组或列表。

每个张量有三个属性:

类型:数据类型

阶:张量维数的数量描述

形状:张量有几行几列

张量的类型

张量的阶

 简单方法:看往一个方向的中括号数,有几个就是几阶。

2.2 张量类型转换和形状变换

张量类型转换

 张量形状变换

import tensorflow as tf

c1=tf.constant([1,2,3,4,5,6,7,8,9,10,11,12],dtype=tf.float32,name="c1")
c2=tf.reshape(c1,(3,4))
c3=tf.reshape(c1,(2,-1,3))
with tf.Session() as sess:
    print(sess.run(c1))
    print(sess.run(c2))
    print(sess.run(c3))
[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12.]
[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 9. 10. 11. 12.]]
[[[ 1.  2.  3.]
  [ 4.  5.  6.]]

 [[ 7.  8.  9.]
  [10. 11. 12.]]]

3 变量的定义与使用

3.1 定义与使用变量

变量定义

变量也是一种张量,但是变量存在于会话调用的上下文之外,主要用于保存和更新模型的参数。

 初始化变量

 在tensorflow中,在运行模型中其他操作之前,必须先对所有的变量进行初始化,常用的方法是调用tf.global_variables_initializer()函数进行全局初始化。

import tensorflow as tf

a=tf.Variable(tf.constant(0.0),dtype=tf.float32)
b=tf.assign(a,10)
c=b
init_op=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    print(a.eval())
    print(b.eval())
    print(c.eval())
0.0
10.0
10.0

实现一个计数器:

import tensorflow as tf

# 创建一个Op变量my_state,并初始化为0
my_state = tf.Variable(0, name ="counter")
# 创建一个Op常量赋值为1
one = tf.constant(1)
# 通过tf.add将my_state的值加1
new_value = tf.add(my_state, one)
# 通过tf.assign更新my_state的值
update = tf.compat.v1.assign(my_state, new_value)
# tf.global_variables_initializer()会返回一个操作,初始化计算图中所有Variable对象
init_Op = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as sess:
    # 在session中,调用sess.run(init_op)初始化所有的变量
    sess.run(init_Op)
    for i in range(3):
        # 更新update状态值
        sess.run(update)
        # 输出mysate的值
        print(sess.run(my_state))
1
2
3

3.2 参数初始化变量

使用常量初始化

import tensorflow as tf

value=[0,1,2,3,4,5,6,7]
init=tf.constant_initializer(value)
x=tf.get_variable('x',shape=[2,4],initializer=init)
with tf.Session() as sess:
    sess.run(x.initializer)
    print(x.eval())
[[0. 1. 2. 3.]
 [4. 5. 6. 7.]]

初始化为常量

当需要初始化的常量的维数很多时,一个一个指定每个值很不方便,tensorflow提供了初始化全为0和全为1的张量对象:

import tensorflow as tf

# 使用0初始化
init_zeros = tf.zeros_initializer()
# 使用1初始化
init_ones = tf.ones_initializer()
x = tf.get_variable('x', shape=[2, 3], initializer=init_zeros)
y = tf.get_variable('y', shape=[2, 8], initializer=init_ones)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print(x.eval())
    print(y.eval())
[[0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1.]]

初始化为正态分布

# 导入tensorflow类库
import tensorflow as tf

# 声明2行3列张量
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.truncated_normal(shape=[2, 3], stddev=1, mean=0))
w3 = tf.Variable(tf.random_uniform((2, 3), minval=1.0, maxval=2.0, dtype=tf.float32))
init_op = tf.global_variables_initializer()
# 在会话中运行计算图
with tf.Session()as sess:
    sess.run(init_op)
    print("w1:", sess.run(w1))
    print("w2:", sess.run(w2))
    print("w3:", sess.run(w3))

w1: [[-0.8113182   1.4845989   0.06532937]
 [-2.4427042   0.09924842  0.5912243 ]]
w2: [[-0.6599848  -0.4042017   0.4803355 ]
 [ 0.9102025  -0.12323765 -1.4945283 ]]
w3: [[1.1368059 1.4242172 1.3239204]
 [1.3977511 1.0472989 1.9397585]]

4 变量管理与模型数据喂入

4.1 变量管理

tf.get_variable获取变量

tf.get_variable拥有变量检查机制,如果已经存在的变量如果设置为共享变量,那么tensorflow运行到第二个拥有相同名字的变量时就会报错。例如:

# 导入tensorflow类库
import tensorflow as tf

# 声明一个变量
a1 = tf.get_variable(name='a', initializer=2)
# 获取变量
a2 = tf.get_variable(name='a', initializer=2)
init_op = tf.global_variables_initializer()
with tf.Session()as sess:
    sess.run(init_op)
    print(sess.run(a1))
    print(sess.run(a2))
ValueError: Variable a already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined at:

 tf.variable_scope指定作用域

可以让不同作用域内的变量有相同的命名,包括tf.get_variable得到的变量,以及tf.Variable创建的变量。即使名称相同,由于作用域不同,不会产生冲突。

import tensorflow as tf
# 定义命名空间V1
with tf.variable_scope('V1'):
    a1 = tf.get_variable(name='a1', shape=[1])
# 定义命名空间V2
with tf.variable_scope('V2'):
    a2 = tf.get_variable(name='a1', shape=[1])

init_op=tf.global_variables_initializer()
with tf.compat.v1.Session() as sess:
    sess.run(init_op)
    print(a1)
    print(a2)
<tf.Variable 'V1/a1:0' shape=(1,) dtype=float32_ref>
<tf.Variable 'V2/a1:0' shape=(1,) dtype=float32_ref>

tf.variable_scope还有一个resuse=True的属性,表示使用已经定义过的变量,这时tf.get_variable都不会创建新的变量,而是直接获取已经创建的变量。

import tensorflow as tf
# 定义命名空间V1
with tf.variable_scope('V1'):
    a1 = tf.get_variable(name='a1', shape=[1], initializer=tf.constant_initializer(1))
# 定义命名空间V2
with tf.compat.v1.variable_scope('V2'):
    a2 = tf.get_variable(name='a1', shape=[1], initializer=tf.constant_initializer(1))
# 重新使用V2命名空间
with tf.variable_scope('V2', reuse=True):
    a3 = tf.get_variable(name='a1', shape=[1])
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(a1)
    print(a2)
    print(a3)
<tf.Variable 'V1/a1:0' shape=(1,) dtype=float32_ref>
<tf.Variable 'V2/a1:0' shape=(1,) dtype=float32_ref>
<tf.Variable 'V2/a1:0' shape=(1,) dtype=float32_ref>

tf.name_scope命名空间管理

import tensorflow as tf

with tf.name_scope('foo'):
    a = tf.Variable([1.0, 2.0], name='weights')
with tf.name_scope('bar'):
    b = tf.Variable([4.0, 2.0], name='weights')
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    print(a.name)
    print(b.name)

foo/weights:0
bar/weights:0

4.2喂入数据模型

占位符创建变量

占位符实质上也是一种张量, tf.placeholder创建,但是占位符并没有初始值,只会分配必要的内存,其值是在会话中由用户调用run方法传递的。

 模型喂入数据

import tensorflow as tf

a = tf.placeholder(dtype=tf.int16)
b = tf.placeholder(dtype=tf.int16)
add = tf.add(a, b)
mul = tf.multiply(a, b)
with tf.Session() as sess:
    print("相加: %i" % sess.run(add, feed_dict={a: 3, b: 4}))
    print("相乘: %i" % sess.run(mul, feed_dict={a: 3, b: 4}))
相加: 7
相乘: 12

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

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

相关文章

TwinCAT ENI 数据详解

使用倍福TwinCAT工具可以生成ENI&#xff0c;先对ENI的cyclic frame数据进行解释说明 需要提前了解EtherCAT报文格式&#xff0c;可参考下面文章 EtherCAT报文格式详解_ethercat listtype 1_EtherCat技术研究的博客-CSDN博客https://blog.csdn.net/gufuguang/article/details/…

理解HAL_UARTEx_ReceiveToIdle_IT的工作过程

先只看没错误发生, 没开DMA时候的情况 将会面临3种结局, 收满数据时候IDLE正好发生, 数据发多了, 数据已经收满时候IDLE还没发生IDLE发生了数据没收满, 首先: 接收开始 主要的动作是 1. status UART_Start_Receive_IT(huart, pData, Size); 开始中断接口 2.…

【国产虚拟仪器】基于 ZYNQ 的电能质量系统高速数据采集系统设计

随着电网中非线性负荷用户的不断增加 &#xff0c; 电能质量问题日益严重 。 高精度数据采集系统能够为电能质 量分析提供准确的数据支持 &#xff0c; 是解决电能质量问题的关键依据 。 通过对比现有高速采集系统的设计方案 &#xff0c; 主 控电路多以 ARM 微控制器搭配…

1992-2022年经过矫正的夜间灯光数据

夜间灯光数据是我们在各项研究中经常使用的数据&#xff01;我们平时使用的夜间灯光数据主要来源于NPP/VIIRS和DMSP/OLS两种渠道&#xff0c;我们之前也分享过这两种来源的夜间灯光数据&#xff0c;包括&#xff1a; 2012-2021年逐年的NPP/VIIRS夜间灯光数据2012-2021年逐月的…

MySQL查询性能优化之索引覆盖、索引下推、索引潜水、索引合并

索引覆盖 什么是索引覆盖 select的数据列只用从索引中就能够取得&#xff0c;不必读取数据行&#xff0c;换句话说查询列要被所建的索引覆盖。 如何实现索引覆盖&#xff1f; 最常见的方法就是&#xff1a;将被查询的字段&#xff0c;建立到联合索引&#xff08;如果只有一…

python---变量(2)

此处&#xff0c;首次使用“”对a进行设置值&#xff0c;也就是对a的初始化。 后续位置对a使用“”&#xff0c;实际上是对a赋值。 因此两行代码得到的结果显然是不同的&#xff01; 变量的种类 1.整数-int-根据数据大小自动扩容 python中的变量类型不需要显示声明&#…

关于 arduino 中的 constrain(x, a, b)函数

当我们需要将一个变量的值限制在某个范围内时&#xff0c;可以使用 constrain(x, a, b) 函数来实现。该函数可以将参数 x 的值限制在区间 [a, b] 之间&#xff0c;如果 x 小于 a&#xff0c;则返回 a&#xff0c;如果 x 大于 b&#xff0c;则返回 b&#xff0c;否则返回 x。下面…

第五篇、基于Arduino uno,获取超声波(HC04)传感器的距离数据——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;显示的是一个距离值&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;虽然超声波传感器形态各异&#xff0c;但是原理和代码都是适用的。 2、连线 说明&#xff1a;只…

材料力学-剪力和弯矩方向规定及关系

剪力和弯矩的方向规定方法 对水平梁的某一指定截面来说&#xff0c; 剪力&#xff1a;在它左侧的向上外力&#xff0c;或右侧的向下外力&#xff0c;将产生正的剪力&#xff1b;反之&#xff0c;即产生负的剪力。 自己的记法&#xff08;可以不按我的来&#xff09;&#xff1…

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时之网络安全新总结

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 网络安全新总结 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序&#xff0c;是人工智能技术驱动的自…

ChatGPT在数据分析中的应用

最近&#xff0c;机器学习和人工智能技术在数据分析领域中发挥着越来越大的作用。而chatgpt正是这个领域最受欢迎的仿人聊天 AI 。但是&#xff0c;对于许多数据科学家和分析师来说&#xff0c;chatgpt并不是他们首选的工具。相反&#xff0c;pandas、sk-learn是数据科学家的最…

一起来聊聊ERP

聊聊ERP 哈喽&#xff0c;哈喽&#xff0c;大家好&#xff01;今天开始&#xff0c;我们就来讲ERP了。 什么是ERP ERP是Enterprise Resource Planning 的缩写&#xff0c;中文含义是企业资源计划。它代表了当前在全球范围内应用最广泛、最有效的一种企业管理方法&#xff0c;…

JVM系列-第12章-垃圾回收器

垃圾回收器 GC 分类与性能指标 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中&#xff0c;因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器&#xff0c;…

gym不渲染画面的解决方案(gym版本号0.26.2)

确认gym版本号 我安装了新版gym&#xff0c;版本号是0.26.2&#xff0c;不渲染画面的原因是&#xff0c;新版gym需要在初始化env时新增一个实参render_mode‘human’&#xff0c;并且不需要主动调用render方法&#xff0c;官方文档入门教程如下 import gym import numpy as n…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(第一章——FreeRTOS的基本框架)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

day15 Servlet-Request-Response

请求对象(request) **请求对象的作用&#xff1a;**封装了所有请求的数据&#xff0c;有服务器实现这个对象&#xff0c;我们直接调用sercive&#xff08;&#xff09;方法 HttpServletRequest对象的常用方法 request请求方法描述request.getMethod()获得请求方式post\getre…

基于SpringBoot+Uniapp的微信小程序二手购物商城(用户手册+测试报告+详细设计文档)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 这个微信小程序二手购…

LangChain使用调研

目录 一、LangChain是什么 二、LangChain提供的主要模块 三、Agent使用例子 四、zero-shot-react-description在ChatGPT和LLaMA-7B效果对比 一、LangChain是什么 LangChain是一个程序框架&#xff0c;它允许用户围绕LLM&#xff08;基座&#xff09;快速构建应用程序。 La…

多维时序 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的多变量时间序列预测

多维时序 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的多变量时间序列预测 目录 多维时序 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-BiLSTM遗传算法优化双向长短…

宏工科技“全面”发力CIBF,助推电池智造“高效提质”

5月16-18日&#xff0c;第十五届中国国际电池技术展览会&#xff08;CIBF2023&#xff09;在深圳盛大举行。宏工科技携电池材料与电池匀浆领域的创新产品和系统解决方案精彩亮相。 据了解&#xff0c;宏工科技在新能源行业的业务涉及电池材料整线产线、电池匀浆、电池回收三个…