30天从入门到精通TensorFlow1.x 第二天,变量 tf.Variable()

文章目录

  • 一,接前一天
    • (1).内容前先弄清楚 `sess.run()` 函数
      • a. 该函数干嘛的
      • b. 该函数有哪些参数
      • c. 该函数的使用
    • (2).由库函数创建张量
    • (3).由库函数创建张量
  • 二、变量`tf.Variable()`
    • (1).啥是变量
    • (2).什么情况下会用该变量函数
    • (3).通过变量来创建张量
  • 三、变量 `tf.Variable()` 与 `tf.placeholder()` 的区别
    • 1.初始化
    • 2. 数据类型和形状
    • 3. 可训练性
    • 4. 更新方式
    • 总结:
  • 四、`tf.get_variable()`获取变量

一,接前一天

(1).内容前先弄清楚 sess.run() 函数

a. 该函数干嘛的

sess.run() 函数是 TensorFlow 中最核心的执行函数之一,用于在会话中执行计算图上的操作张量,并返回相应的结果。

看到了:该函数是用来创建一个会话对象。在这个会话中,我们可以执行模型中定义好的操作张量

b. 该函数有哪些参数

sess.run()
#来看下源代码
run(self, feed_dict=None, session=None)
'''
fetches(必选)也就是:需要执行的操作或张量,可以是单个张量、操作,也可以是由它们组成的列表、元组或字典等形式。
feed_dict(可选):用于传递数据的占位符字典。该参数默认为空字典,如果图中存在占位符,则 feed_dict 必须提供相应的数值,否则会抛出异常。

session=None:指定我们的回话对象,在进行初始化的时候,这里就要显式的说明
例如:
# 创建一个会话
test = tf.Session()
tf.global_variables_initializer().run(session=test)

'''

下面分别对这两个参数进行详细解释:

  1. fetches
    fetches 参数用于指定需要在会话中执行的操作或者张量,可以传入单个操作或者张量,也可以传入一个列表元组字典等形式。fetches 参数有以下几种常见的情况:
    –传入单个张量或操作,返回该张量或操作的计算结果。
    传入多个张量或操作的列表或元组,返回所有张量或操作的计算结果。
    –传入字典,键为字符串,值为张量或操作,返回字典中所有张量或操作的计算结果。
    例如,我们可以通过 sess.run() 函数来获取两个张量的值:
import tensorflow as tf
a = tf.constant(2)
b = tf.constant(3)
c = a + b
with tf.Session() as sess:
    print(sess.run([a, b]))
  1. feed_dict
    feed_dict 参数用于传递占位符的值,以便在会话中执行计算。在 TensorFlow 中,占位符是一种特殊的张量,它没有具体的数值,但在使用时必须提供相应的数据。feed_dict 参数可以是一个字典,其中占位符张量需要填充的数值
    例如,我们可以通过 feed_dict 参数来设置占位符变量的值:
import tensorflow as tf
x = tf.placeholder(tf.float32, shape=[None])
y = 2 * x
with tf.Session() as sess:
    result = sess.run(y, feed_dict={x: [1, 2, 3]})
    print(result)

c. 该函数的使用

我们来使用一下:

import tensorflow as tf

#创建占位符
x = tf.placeholder(tf.float32, shape=[None])
y = 2 * x

with tf.Session() as sess: 
#创建一个会话对象,赋值给sess
    result = sess.run(y, feed_dict={x: [1, 2, 3]})
    #在该会话中执行定义好的操作 和 张量
    print(result)

(2).由库函数创建张量

test3 = tf.zeros((2,3))
print('tensor test3:',test3)
print('run test3:',test.run(test3))

在这里插入图片描述

(3).由库函数创建张量

二、变量tf.Variable()

(1).啥是变量

在 TensorFlow 1.x 版本中,tf.Variable() 函数用于创建一个可训练的张量,也就是变量。变量在模型的训练过程中会被反复更新,用于存储更新模型参数与常规张量不同的是,变量创建时需要初始化并且可以持久化到磁盘上。通过变量,可以方便地定义和管理模型参数,从而加快模型训练的速度和效果。

(2).什么情况下会用该变量函数

神经网络模型中,我们通常需要定义一些可训练的参数,例如:权重偏置项等。这些参数会在模型的训练过程中被反复更新以优化模型性能。使用 tf.Variable() 函数可以方便地创建这些参数。

举个例子,假设我们要实现一个简单的线性回归模型 y = wx + b,其中 w 和 b 是待学习的参数。我们可以使用 tf.Variable() 函数来创建这两个变量:

import tensorflow as tf

# create w and b init 0.0
w = tf.Variable(0.0, name='weight')
b = tf.Variable(0.0, name='bias')

# create input and out
x = tf.placeholder(dtype=tf.float32, shape=[None])
out = tf.placeholder(dtype=tf.float32, shape=[None])

# create loss and opt
y = w * x + b
loss = tf.reduce_mean(tf.square(y - out))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.005)
train_op = optimizer.minimize(loss)

# train model
with tf.Session() as sess:
    tf.global_variables_initializer().run(session=sess)
    for i in range(1000):
        _, loss_val, w_val, b_val = sess.run(
            [train_op, loss, w, b],
            feed_dict={x: [1, 23, 4, 5, 7, 5, 7], out: [3, 5, 7, 9, 11, 13, 15]}
        ) #注意 输入的数据 形状要一致,避免输出与预测值得形状不一致问题
        if i % 100 == 0:
            print('Step {}: loss = {}, w = {}, b = {}'.format(i, loss_val, w_val, b_val))

在这里插入图片描述

(3).通过变量来创建张量

import tensorflow as tf
import numpy as np
from pprint import pprint

#TODO 创建一个会话
test = tf.Session()
w = tf.Variable([5.0],tf.float32)
b = tf.Variable([6.0],tf.float32)
x = tf.placeholder(tf.float32)

y = w * x + b

print('w:',w)
print('b:',b)
print('x:',x)
print('y:',y)
tf.global_variables_initializer().run(session = test)
print('run y:',test.run(y,feed_dict={x:[1,2,3,4]}))

在这里插入图片描述
使用tf.Variable()创建变量时,需要注意以下几点:

  1. 变量的初始值需要在创建时指定,可以是常量,也可以是随机数等
  2. 变量的类型需要与初始值相匹配,比如:创建一个整型变量时,初始值必须为整数。
  3. 在使用变量前,需要通过调用tf.global_variables_initializer()初始化所有变量。
  4. 变量在计算图中有自己的作用域,需要注意命名空间的规范,便于管理和调试。
  5. 变量的生命周期需要谨慎管理,避免内存泄漏或者过早释放。

三、变量 tf.Variable()tf.placeholder() 的区别

在 TensorFlow 中,tf.Variable() 和 tf.placeholder() 都是非常重要的变量类型,它们有以下几个不同点:

1.初始化

tf.Variable() 变量在创建时需要进行初始化,并且可以持久化到磁盘上。我们通常使用 tf.global_variables_initializer() 函数来初始化所有变量。例如:

import tensorflow as tf

# 创建变量 w 和 b
w = tf.Variable(0.0, name='weight')
b = tf.Variable(0.0, name='bias')

with tf.Session() as sess:
	# 初始化所有变量
    sess.run(tf.global_variables_initializer())

tf.placeholder() 变量没有具体的值只是一个占位符,因此也不需要进行初始化。它通常用于定义模型的输入和输出等信息。

2. 数据类型和形状

tf.Variable()tf.placeholder() 变量都可以指定数据类型和形状。在使用 tf.Variable() 创建变量时,我们需要明确指定变量的形状数据类型。例如:

import tensorflow as tf

# 创建一个形状为 [2, 3],数据类型为 float32 的变量
x = tf.Variable(tf.zeros([2, 3]), dtype=tf.float32)

而在使用 tf.placeholder() 时,我们可以通过 shape 参数来指定占位符的形状,数据类型则可以通过传入的数值来自动推断。例如:

import tensorflow as tf

# 定义一个形状为 [None, 3] 的占位符,数据类型自动推断
x = tf.placeholder(dtype=tf.float32, shape=[None, 3])

'''
自动推断的意思是:当我们使用占位符创建了指定数据类型,在给他传参的时候,无需一致,该函数会自动识别为 我们指定的数据类型
'''

3. 可训练性

tf.Variable() 变量是可训练的,它们在模型的训练过程中会被反复更新优化模型性能。而 tf.placeholder() 变量没有训练参数只是一个占位符,用于定义模型输入输出等信息。

4. 更新方式

对于 tf.Variable() 变量,我们可以使用 assignassign_add 等方法来更新变量的值。例如:

import tensorflow as tf

# 创建变量 w 和 b,并初始化为0.0
w = tf.Variable(0.0, name='weight')
b = tf.Variable(0.0, name='bias')

# 使用 assign 方法更新 w 的值
sess.run(w.assign(2.0))

在这里插入图片描述

而对于 tf.placeholder() 变量,其值不能直接更新,需要通过传递新的数值重新计算相应的张量操作

总结:

  1. 在 TensorFlow 中,tf.placeholder() 是一个占位符变量,它不是具体的数值只是一个形状和数据类型都已经确定的张量。在计算图中使用 tf.placeholder() 可以定义模型的输入和输出等信息,然后通过 feed_dict 参数传递具体的数值.
    例如:
import tensorflow as tf

# 创建一个形状为 [None, 3] 的占位符,数据类型为 float32
x = tf.placeholder(dtype=tf.float32, shape=[None, 3])

# 定义一个操作 y,将 x 向量与常量向量相加
y = x + tf.constant([1.0, 2.0, 3.0])

with tf.Session() as sess:
    # 将 [4, 5, 6] 作为 x 的值,计算 y 的结果
    result = sess.run(y, feed_dict={x: [[1, 2, 3], [4, 5, 6]]})
    print(result)
  1. tf.Variable() 则是一个具体的数值,它可以被更新持久化到磁盘上。在使用 tf.Variable() 创建变量时,我们需要指定变量的初始值数据类型
import tensorflow as tf

# 创建一个训练变量 w,初始值为 0.0
w = tf.Variable(0.0, dtype=tf.float32)

# 定义一个操作 loss,将 w 的平方与常量 2 相加
loss = tf.square(w) + 2

with tf.Session() as sess:
    # 初始化所有变量
    sess.run(tf.global_variables_initializer())

    # 计算 loss 的结果
    result = sess.run(loss)
    print(result)
  1. 在使用 tf.Variable() 变量时,需要给它传递一个初始值,并在计算前进行初始化才能保证正常计算。

注意:在 TensorFlow 中,使用 tf.Variable() 创建变量时需要为其指定一个初始值。如果在创建变量时给定了初始值,那么在计算前进行初始化之后,变量的值就会被更新。
那么为什么既然会被初始化更新掉还要给与初始值呢?

在 TensorFlow 中,给变量指定一个初始值的目的是为了在计算图中建立变量节点,并确定它的数据类型、形状和初值等属性。这样做有以下几个好处

原因二:确定变量的数据类型、形状和初值等属性,使得我们能够更方便地使用变量进行计算。

原因三:在计算图中明确地标记变量节点,使得我们能够更方便地对其进行操作和管理。

原因四:变量的初值可以作为一种默认值,在初始化时如果没有手动赋值,就会自动使用默认值进行初始化。

原因五:在实际的工作中,我们通常会需要手动给变量赋初值,并在计算前对变量进行初始化。这样做主要是为了保证变量的初值和计算结果符合预期。

四、tf.get_variable()获取变量

  1. tf.get_variable()的好处:
    一般来说:如果我们定义的变量名称在之前已经定义过,再次定义的时候那么TensorFlow就会报错。若果此时我们使用tf.get_variable()函数来替代tf.variable()函数,就会避免这种情况。使用tf.get_variable()后,如果变量已经定义过,该函数就会直接返回变量,若果变量之前未被定义,则该函数就会从新定义。
    例如:
import tensorflow as tf

# 定义一个变量 x
x = tf.Variable(tf.random_normal([10]), name='x')

# 使用 x 的名称来创建一个新变量 y,并共享 x 的值
y = tf.get_variable(name='x', shape=[10], dtype=tf.float32, initializer=tf.constant_initializer(0.0))

with tf.Session() as sess:
    # 初始化所有变量
    sess.run(tf.global_variables_initializer())

    # 输出变量 x 和 y 的数值
    print('x:', sess.run(x))
    print('y:', sess.run(y))

注意:由于我们使用了 tf.get_variable() 方法,因此在创建变量时需要指定变量的名称形状数据类型以及初始化器等参数

另外:
如果要通过 tf.get_variable() 方法继承已经定义的变量,那么必须要在创建计算图时指定 reuse=True 参数,以告知 TensorFlow 允许共享变量。如果没有指定 reuse=True,那么 TensorFlow 将会默认禁止变量共享,从而导致错误。

在分布式TensorFlow中, tf.get_variable() 获取得到全局变量,若要得到局部变量,则使用:tf.get_local_variable()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dart语法学习

最近在学习flutter相关方面的知识,里面用到了Dart语言,于是写下这篇博客记录学习的一门过程。如果你有其他编程语言的经验(尤其是Java和JavaScript),可以很快的上手Dart语言,Dart 在设计时应该是同时借鉴了…

AI注册流程

1、首先需要有一个OpenAI账号,如果有方法的,就可以自己先注册一下。如果没有方法的,还有一个付费版本的可以备选,亲测可用。 2、注册建议使用谷歌账号关联登录,最方便。微软账号太慢了,也可以使用。注册使用…

Git的安装和环境变量的配置

目录 前言一、下载Git二、安装Git三、检查是否安装成功四、 配置用户名和邮箱五、环境变量配置1. 获取git的安装路径2. 设置环境变量 前言 当我们第一次在新电脑上使用git命令的时候,会报错【git 不是内部或外部命令,也不是可运行的程序 或批处理文件】…

企业工程项目管理系统源码-专注项目数字化管理-Java工程管理-二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…

javaWeb 酒店民宿预定信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh酒店民宿预定信息管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为T…

【十一】设计模式~~~结构型模式~~~代理模式(Java)

【学习难度:★★★☆☆,使用频率:★★★★☆】 6.1. 模式动机 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起…

CTR预估之DNN系列模型:FNN/PNN/DeepCrossing

前言 在上一篇文章中 CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM,介绍了FMs系列模型的发展过程,开启了CTR预估系列篇章的学习。FMs模型是由线性项和二阶交互特征组成,虽然有自动学习二阶特征组合的能力,一定程度上避免了人工组合特征…

Springboot中使用mail邮件

Springboot中使用mail邮件发送 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务2、导入依赖和一些默认#配置新的3、发送邮件4、整合工具类 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务 这里使用的是QQ邮箱,进入设置-账户,开启下服务。 开启后获取授权码,保存…

智能路由器开发之OpenWrt简介

智能路由器开发之OpenWrt简介 1. 引言 1.1 智能路由器的重要性和应用场景 智能路由器作为网络通信的核心设备,具有重要的地位和广泛的应用场景。传统的路由器主要提供基本的网络连接功能,但随着智能家居、物联网和大数据应用的快速发展,对于…

Typora+PicGo+阿里云OSS搭建博客图床

✅作者简介:大家好,我是Cisyam,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Cisyam-Shark的博客 💞当前专栏: 程序日常 ✨特色专栏&…

每日一题——删除字符串中的所有相邻重复项

每日一题 删除字符串中的所有相邻重复项 题目链接 思路 这是一道用栈解决的典型题目 我们先来看看栈的基本性质: 栈:是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶&#xff0c…

【PC迁移与管理】上海道宁为每个用户和每个 PC 传输和迁移场景提供解决方案——PCmover

PCmover 是一款 可以自动将所有选定文件、 文件夹、设置、用户配置文件 甚至应用程序 从旧PC传输、恢复和升级到 新PC或操作系统的软件 而且由于 大多数迁移的应用程序 都已安装在新PC上即可使用 通常无需查找旧CD 以前下载的程序 序列号或许可证代码 开发商介绍 La…

Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程

1、客户端API操作 1.1 IDEA 环境搭建 前提&#xff1a;保证 hadoop102、hadoop103、hadoop104 服务器上 Zookeeper 集群服务端启动。 1、创建一个工程&#xff1a;Zookeeper 2、添加pom文件 <?xml version"1.0" encoding"UTF-8"?> <project …

Android Studio 2022.3 新版 flamingo 安装步骤及遇到的问题

下载地址: https://developer.android.google.cn/studio D盘中新建一个 Android 文件夹, 用来存储 Android studio 和 SDK 文件. 下载好之后, 运行 exe 文件, 点击 next 注意这个路径最好不要有空格,比如 program files这种目录,不然后面安装sdk的时候会有问题. 点击 instal…

【Linux】线程概述、创建线程、终止线程

目录 线程概述1、创建线程函数解析代码举例 2、终止线程函数解析代码举例 橙色 线程概述 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。 进程是 CPU 分配资源的最小单位&#xff0c;线程是操作系统调度执行的最小单位。…

Qt与Excel:从底层原理到上层应用的全面探索

Qt与Excel&#xff1a;从底层原理到上层应用的全面探索 一、Qt与Excel文件的交互基础&#xff08;Basics of Qt and Excel Interaction&#xff09;1.1 Qt与Excel文件的基本概念&#xff08;Basic Concepts of Qt and Excel Files&#xff09;1.2 Qt读取Excel文件的基本方法&am…

Python文件打包成exe文件

文章目录 背景安装pyinstaller开始打包总结 背景 今天因为在线将pdf转为word被收费了&#xff0c;有点不爽&#xff0c;所以自己动手撸一个pdf转word的小工具&#xff0c;想着打包成exe给朋友使用&#xff0c;万一哪天会用到呢&#xff1f; 安装pyinstaller 打开cmd命令窗口…

Homeassistant --openwrt docker 安装

openwrt homeassistant安装教程 前提&#xff1a;在N1盒子上面烧录 f大的openwrt系统 (安装81o 或者82o都可以) 一.进入openwrt系统 通常为192.168.1.1 打开网络配置 点击网络点击接口然后修改 这样网络是属于旁路由上网了 可以联通网络了 主要需要填写正确 二.点击docker …

【群智能算法改进】一种改进的沙丘猫群优化算法 改进沙丘猫群算法 改进SCSO[2]【Matlab代码#36】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始沙丘猫群优化算法2. 改进沙丘猫群算法2.1 非线性自适应参数2.2 Cauchy变异策略2.3 最优邻域扰动策略 3. 部分代码展示4. 仿真结果展示5. 资源获取6. 参考文献 【获取资源请见文章第5节&#xff1a;资源获取】 1.…

Java反射概述

2 反射 2.1 反射概述 Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展2.2 反射获取Class类的对象 我们要想通过反…