TensorFlow 1.x的学习

.为什么还有很多人都选择使用TensorFlow 1.x

  1. 兼容性问题: TensorFlow 1.x在一些旧项目中已经得到了广泛应用,这些项目可能依赖于1.x版本的特定API或行为。升级到2.x可能需要大量的代码修改和测试工作,对于一些已经稳定运行的项目,维护者可能不愿意承担这种风险。
  2. 性能要求: 在某些情况下,TensorFlow 1.x可能提供了更适合特定任务的性能优化。例如,对于需要极致计算性能的应用,1.x版本可能更好地满足这些需求。
  3. 熟悉度和学习曲线: 一些开发者可能对TensorFlow 1.x更熟悉,特别是那些在2.x发布之前就已经在使用TensorFlow的开发者。对于他们来说,继续使用1.x版本可能更加方便和高效。
  4. 遗留代码和生态系统: TensorFlow 1.x的生态系统中存在大量的代码库、教程和工具,这些资源可能不完全兼容2.x版本。对于一些用户来说,利用现有的资源和库可能比迁移到新版本更加实际。
  5. 特定功能的需求: TensorFlow 1.x可能提供了一些2.x版本中尚未完全实现或优化的功能。在这种情况下,用户可能会选择继续使用1.x版本,直到2.x版本能够提供相应的功能。
  6. 稳定性和成熟度: TensorFlow 1.x经过多年的发展和改进,已经非常稳定和成熟。对于一些对稳定性有高要求的应用场景,用户可能更倾向于使用经过时间验证的1.x版本。
  7. 迁移成本: 迁移到TensorFlow 2.x可能涉及到大量的工作,包括代码重构、测试和可能的性能调优。对于一些资源有限的团队或个人开发者来说,这可能是一个不小的挑战。

tf.Session含义

self.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True))
  • tf.Session 是用于执行图计算的核心接口

  • config=tf.ConfigProto 是一个配置对象,它允许用户设置会话的配置选项

  • allow_soft_placement=True: 这个选项的作用是在可能的情况下,允许TensorFlow在不同的设备上运行操作。例如,如果你的默认设备是CPU,但是你希望某个操作在GPU上运行,而这个操作在GPU上不可用,TensorFlow将尝试在可用的设备上执行这个操作。这个选项有助于提高代码的灵活性和鲁棒性。

  • log_device_placement=True: 当设置为 True 时,TensorFlow会在日志中输出:操作被放置在哪个设备上的信息。这对于调试和性能分析非常有用,因为它可以帮助开发者理解模型的计算是如何分布到不同的设备上的。


[图计算]----

图计算(Graph Computation)是一种计算模型,它将计算过程表示为一个由节点(nodes)和(edges)组成的图(graph)。节点通常表示计算任务或者操作,而边则表示数据或者信息的流动。

图计算被应用于神经网络的前向传播和反向传播过程。神经元(或层)作为节点权重连接作为边

TensorFlow中的计算是由图(Graph)表示的,图中的节点是各种操作(如加法、卷积等),边则表示操作之间的数据依赖关系。通过这种方式,TensorFlow可以优化计算流程,利用不同的设备(如CPU、GPU)执行计算,并且支持分布式计算。

TensorFlow 1.x版本使用静态图计算模型,这意味着在执行任何计算之前,必须先定义完整的计算图。


self.sess的调用

self.sess通常是一个对象的成员变量,它代表了一个tf.Session()的实例。

tf.Session()是TensorFlow中用于执行定义在计算图中的操作和计算张量的上下文。简而言之,self.sess是用于与TensorFlow图交互的会话对象。

初始化:

在类的构造函数中或者在需要使用会话之前,需要创建并初始化tf.Session()实例。

import tensorflow as tf

class MyModel:
    def __init__(self):
        self.graph = tf.Graph()
        self.sess = tf.Session(graph=self.graph)
        # 初始化图内的所有变量
        self.sess.run(tf.global_variables_initializer())

运行操作:

使用self.sess.run()来执行图内的操作或获取张量的值。

output = self.sess.run(some_operation, feed_dict={some_input: value})

其中,some_operation是想要执行的操作的TensorFlow对象,some_input是输入张量的占位符,value是想要传递给占位符的实际值。

关闭会话:

当不再需要会话时,应该关闭它以释放资源。

self.sess.close()

案例

在TensorFlow中,self.sess.run() 方法是用来执行图(Graph)中的操作(Operation)并获取张量(Tensor)值的主要方式。下面是一个详细的例子,展示了如何使用 self.sess.run() 方法。

假设我们有一个简单的神经网络模型,它包含一个输入层、一个隐藏层和一个输出层。我们想要训练这个模型来对一些数据进行拟合。

首先,我们需要定义模型的结构和损失函数:

import tensorflow as tf

# 定义模型参数
input_dim = 10
hidden_dim = 5
output_dim = 1

# 创建占位符
X = tf.placeholder(tf.float32, shape=[None, input_dim])
Y = tf.placeholder(tf.float32, shape=[None, output_dim])

# 创建模型的权重和偏置
W1 = tf.Variable(tf.random_normal([input_dim, hidden_dim]))
b1 = tf.Variable(tf.random_normal([hidden_dim]))
W2 = tf.Variable(tf.random_normal([hidden_dim, output_dim]))
b2 = tf.Variable(tf.random_normal([output_dim]))

# 创建模型的前向传播
hidden = tf.nn.relu(tf.matmul(X, W1) + b1)
output = tf.matmul(hidden, W2) + b2

# 定义损失函数
loss = tf.reduce_mean(tf.square(Y - output))

接下来,我们需要定义训练过程,这通常涉及到创建一个优化器来最小化损失函数:

# 定义优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(loss)

现在,我们可以创建一个 tf.Session() 实例,并在其中运行我们的图操作:

# 创建会话
self.sess = tf.Session()

# 初始化模型中的所有变量
self.sess.run(tf.global_variables_initializer())

在训练过程中,我们会使用 self.sess.run() 方法来执行训练操作,并传入真实的数据和标签:

# 假设我们有一些真实的数据和标签
real_X = ...  # 真实输入数据
real_Y = ...  # 真实输出标签

# 运行训练操作
self.sess.run(train_op, feed_dict={X: real_X, Y: real_Y})

在训练过程中,我们可能还想要监控损失函数的值。我们可以使用 self.sess.run() 方法来获取损失张量的值:

# 获取当前损失值
current_loss = self.sess.run(loss, feed_dict={X: real_X, Y: real_Y})
print("Current loss:", current_loss)

最后,当我们不再需要会话时,应该关闭它以释放资源:

# 关闭会话
self.sess.close()

这个例子展示了如何使用 self.sess.run() 方法来执行训练操作、获取张量的值以及初始化模型变量。

在实际应用中:

完整代码:

import tensorflow as tf
import numpy as np
from pyDOE import lhs
# 定义模型参数
input_dim = 2
hidden_dim = 5
output_dim = 1
# 创建占位符
X = tf.placeholder(tf.float32, shape=[None, input_dim])
Y = tf.placeholder(tf.float32, shape=[None, output_dim])
# 创建模型的权重和偏置
W1 = tf.Variable(tf.random_normal([input_dim, hidden_dim]))
b1 = tf.Variable(tf.random_normal([hidden_dim]))
W2 = tf.Variable(tf.random_normal([hidden_dim, output_dim]))
b2 = tf.Variable(tf.random_normal([output_dim]))
# 创建模型的前向传播
hidden = tf.nn.relu(tf.matmul(X, W1) + b1)
output = tf.matmul(hidden, W2) + b2
# 定义损失函数
loss = tf.reduce_mean(tf.square(Y - output))
# 定义优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.0006)
train_op = optimizer.minimize(loss)
# 创建会话
sess = tf.Session()
# 初始化模型中的所有变量
sess.run(tf.global_variables_initializer())
# 生成虚拟的数据
real_X = lhs(input_dim, 100)  # 假设有100个样本
real_Y = np.array(3 * real_X[:, 0] + 9 * real_X[:, 1]).reshape(-1, 1)  # 使用随机数据作为真实输出
# 训练模型
loss_history = []
try:
    for i in range(8000):  # 训练1000步
        # 运行训练操作
        sess.run(train_op, feed_dict={X: real_X, Y: real_Y})
        # 每隔100步打印一次损失值
        current_loss = sess.run(loss, feed_dict={X: real_X, Y: real_Y})
        loss_history.append(current_loss)
        if i % 100 == 0:
            print("Step: %d, Current loss: %f" % (i, current_loss))
    import matplotlib.pyplot as plt
    plt.plot(loss_history)
    plt.xlabel('epoch')
    plt.ylabel('loss_value')
    plt.show()

finally:
    # 关闭会话
    sess.close()

得出损失值随迭代次数变化情况:

……
Step: 7500, Current loss: 0.007287
Step: 7600, Current loss: 0.007191
Step: 7700, Current loss: 0.007090
Step: 7800, Current loss: 0.006992
Step: 7900, Current loss: 0.006899

在这里插入图片描述

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

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

相关文章

【观察】容器化部署“再简化”,云原生体验“再升级”

自2013年云原生概念被提出以来,云原生技术和架构在过去十多年得到了迅速的发展,并对数字基础设施、应用架构和应用构建模式带来了深刻的变革。根据IDC预测,到2024年,新增的生产级云原生应用在新应用的占比将从2020年的10%增加到60…

HTML5+JavaScript实现本地视频/音频播放器

HTML5JavaScript实现本地视频/音频播放器 HTML5 提供了本地视频和音频播放器的支持&#xff0c;通过 <video> 和 <audio> 标签&#xff0c;这些标签支持多种媒体格式&#xff0c;并且可以通过 JavaScript 进行控制&#xff0c;实现功能比较完整的本地视频音频播放器…

车载终端丨车载平板丨车载平板电脑丨提升车队管理水平

随着电商、互联网和智能制造等行业的快速发展&#xff0c;物流需求不断增加&#xff0c;车载终端作为物流企业管理的重要工具&#xff0c;具有广泛的市场需求。车载平板是一种集成了计算机和显示屏的设备&#xff0c;可以用于车辆管理、车队调度、运输监控等方面&#xff0c;可…

探索Java世界中的七大排序算法(上)

文章目录 排序的概念直接插入排序希尔排序( 缩小增量排序)选择排序堆排序冒泡排序 在计算机科学中&#xff0c;排序算法是一类重要的算法&#xff0c;它们用于将一组元素按照一定的顺序进行排列。在Java编程中&#xff0c;我们经常需要对数组或集合进行排序操作。本文将介绍Jav…

React Ant Design 简单实现如何选中图片

效果&#xff1a; 代码&#xff1a; 定义的初始值和方法 const [selected, setSelected] useState(0); // 表示当前选中的图片索引const handleClick (index) > {if (selected index) {setSelected(null); // 如果点击的是已选中的图片&#xff0c;则取消选中状态} else…

单节锂离子/锂聚合物电池保护IC SDG3JX

SDG3JX内置高精度电压检测电路和延迟电路&#xff0c;适用于锂离子/锂聚合物可充电电池的保护IC。SDG3JX 最适合于对单节锂离子/锂聚合物可充电电池组的过充电、过放电和过电流的保护。 特点  内置高精度电压检测电路 * 过充电检测电压:4.28V0.025V&#xff1b; * 过充电解除…

小例子Flask网站开发—Cookies(四)

Cookies是服务器保存在用户浏览器端的数据片段&#xff0c;用于跟踪和识别用户。Cookies是当您浏览网站时&#xff0c;网站可以在您的计算机或移动设备上存储的小型文本文件。它们通常以键值对&#xff08;key/value&#xff09;的形式存储信息&#xff0c;并且每次您访问特定网…

.Net RabbitMQ(消息队列)

文章目录 一.RabbitMQ 介绍以及工作模式1.RabbitMQ的介绍&#xff1a;2.RabbitMQ的工作模式&#xff1a; 二.RabbitMQ安装1.安装Erlang语言环境2.安装RabbitMQ 三.在.Net中使用RabbitMQ1.HelloWorld模式2.工作队列模式3.发布订阅模式4.Routing路由模式和Topics通配符模式 一.Ra…

安全开发实战(4)--whois与子域名爆破

目录 安全开发专栏 前言 whois查询 子域名 子域名爆破 1.4 whois查询 方式1: 方式2: 1.5 子域名查询 方式1:子域名爆破 1.5.1 One 1.5.2 Two 方式2:其他方式 总结 安全开发专栏 安全开发实战​​http://t.csdnimg.cn/25N7H 前言 whois查询 Whois 查询是一种用…

java.lang.OutOfMemoryError: WrappedJavaFileObject --idea启动项目内存溢出解决

java.lang.OutOfMemoryError 解决方案 现象 项目开发时&#xff0c;启动idea&#xff0c;报内存溢出错误&#xff0c;如下&#xff1a; java: java.lang.OutOfMemoryError: WrappedJavaFileObject.....解决 通过 调整idea 的 配置参数 来调整 jvm 大小解决。 -Xmx8192m-Xm…

C++进修——C++基础入门

初识C 书写HelloWorld #include <iostream> using namespace std;int main() {cout << "HelloWorldd" << endl;system("pause");return 0; }注释 作用&#xff1a;在代码中加一些说明和解释&#xff0c;方便自己或其他程序员阅读代码…

二分法问题

日升时奋斗&#xff0c;日落时自省 目录 1、二分法 2、二分法问题 2.1 、在排序数组中查找元素的第一个和最后一个位置 2.2、搜索插入位置 2.3、山脉数组的峰顶索引 2.4、0-n-1中缺失的数字 1、二分法 二分法是比较简单的一种查找算法&#xff0c;但是效率很高&#xff0…

【创建型模式】原型模式

一、原型模式概述 原型&#xff08;Prototype&#xff09;模式的定义&#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里&#xff0c;原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效&#xf…

【Qt】Qt安装包、源码、子模块(submodules)下载

1、Qt 4.0 ~ Qt5.14 Qt 4.0 ~ Qt5.14 离线安装包、源码和子模块(submodules)源码下载路径: https://download.qt.io/new_archive/qt/以Qt5.7.1为例,注意子模块都是源码,需要独立编译 2、Qt5.15 ~ Qt6.7 Qt5.15 ~ Qt6.7源码和子模块(submodules)源码下载路径: htt…

分类算法——决策树(五)

认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法。 决策树分类原理详解 为了更好理解决策树具体怎么分类的&#xff0c;通过一个问题例子&#xff1a; 问题…

【MIT6.824】lab3 Fault-tolerant Key/Value Service 实现笔记

引言 lab3A的实验要求如下&#xff1a; Your first task is to implement a solution that works when there are no dropped messages, and no failed servers. You’ll need to add RPC-sending code to the Clerk Put/Append/Get methods in client.go, and implement Pu…

HiveSql中的函数家族(二)

一、窗口函数 1、什么是窗口函数 在 SQL 中&#xff0c;窗口函数&#xff08;Window Functions&#xff09;是一种特殊的函数&#xff0c;它允许在查询结果集的特定窗口&#xff08;通常是一组行&#xff09;上执行聚合、分析和计算操作&#xff0c;而无需聚合整个结果集。窗口…

使用Python工具库SnowNLP对评论数据标注(二)

这一次用pandas处理csv文件 comments.csv import pandas as pd from snownlp import SnowNLPdf pd.read_csv("C:\\Users\\zhour\\Documents\\comments.csv")#{a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]}是个字典 emotions[] for txt in df[sentence]:s SnowNLP(…

接收区块链的CCF会议--ICSOC 2024 截止7.24

ICSOC是CCF B类会议&#xff08;软件工程/系统软件/程序设计语言&#xff09; 2023年长文短文录用率22% Focus Area 4: Emerging Technologies Quantum Service Computing Digital Twins 3D Printing/additive Manufacturing Techniques Blockchain Robotic Process Autom…

【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入&#xff1a; INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…