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 tfclass 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 pltplt.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

在这里插入图片描述

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

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

相关文章

实现iOS App代码混淆

简介 在开发iOS应用程序时,保护代码安全是至关重要的。代码混淆是一种常用的技术,可以增加逆向工程的难度,防止他人对代码的篡改和盗用。本文将介绍如何实现iOS App代码混淆的步骤和操作方法。 整体流程 下面是实现iOS App代码混淆的整体流…

创维:在博鳌论坛 叩响世界之门

出走半生,归来仍是少年。 2024年4月8日,一个离开海南近半个世纪的“少年”回到琼海博鳌,“下一站,1000亿!”,他的承诺掷地有声。“1000亿”,意指创维集团在2025年前冲击千亿营收,这…

【JavaWeb】Day45.Mybatis——入门程序

什么是MyBatis? MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。 (持久层:指的是就是数据访问层(dao),是用来操作数据库的。) (框架:是一个半成品软件,是一套可重用的、通用…

如何定义系统无故障运行维度的能力(高可用、高可靠、高稳定、高容错),及对应衡量指标

1、哪些概念能定义系统无故障运行维度的能力 高可用性、高可靠性、高稳定性和高容错性 这 4 个概念经常用于定义系统无故障运行维度的能力。 它们之间存在区别。具体如下: 高可用性:指的是系统或服务能够保持长时间运行,即使遇到故障也能迅…

vue2动画

vue2动画 在Vue.js 2中&#xff0c;动画和过渡是通过<transition>和<transition-group>组件来实现的 <transition> 组件 <transition> 组件包裹单个元素或组件&#xff0c;并在它们渲染、更新或从DOM中移除时触发过渡效果。这个组件不会渲染为任何额…

【企业动态】瑞芯微高级业务总监来访东胜物联,共探新能源汽车市场合作

近日&#xff0c;瑞芯微高级业务总监阙金珍一行来访东胜物联参观交流&#xff0c;并就深化合作进行讨论。 东胜物联与瑞芯微建有长期稳固的合作关系&#xff0c;基于RK3588、RK3399、RK3568等处理器&#xff0c;推出了多款嵌入式核心硬件产品&#xff0c;包括核心板、网关等&a…

添加usb function <一>

1、usb描述信息 struct usb_interface_descriptor {__u8 bLength;__u8 bDescriptorType;__u8 bInterfaceNumber;__u8 bAlternateSetting;__u8 bNumEndpoints;__u8 bInterfaceClass;__u8 bInterfaceSubClass;__u8 bInterfaceProtocol;__u8 iInterface; }/* 接口描述信…

工业物联网网关

在数字化浪潮席卷全球的今天&#xff0c;工业物联网&#xff08;IIoT&#xff09;作为连接物理世界与数字世界的桥梁&#xff0c;正在逐渐改变传统工业的面貌。而作为IIoT的核心枢纽&#xff0c;工业物联网网关发挥着至关重要的作用。今天&#xff0c;我们就来深入了解一下工业…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮&#xff0c;没有一个属于自己的组件库&#xff0c;那岂不是狮子没有了牙齿&#xff0c;士兵没有了武器&#xff0c;姑娘没有了大宝SOD蜜&#xff0c;你没有了我.... 言归正传&#xff0c;下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

【c 语言】声明了一个指针,会给指针分配内存吗?

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

租用境外服务器,越南服务器的优势有哪些

自从中国加入世界贸易组织之后&#xff0c;国内经济增加速度非常快&#xff0c;同时越来越多的人选择去东南亚国家发展&#xff0c;因为当地的中国人很多&#xff0c;所以中国企业在当地面临着更小的文化差异。东南亚地区也是最新的经济体&#xff0c;互联网正处于蓬勃发展的阶…

Git 实用技巧1——从 Git 中停止追踪「被追踪的文件」 | 修改远程仓库地址

1. 从 Git 中停止追踪「被追踪的文件」 若误将 .idea, .vscode 中的本地配置文件添加到 git 中&#xff0c;会导致每次编译时&#xff0c;IDE 会提示 git 修改。为了减少/消除提示&#xff0c;需要将该文件取消追踪&#xff0c;但不能将其从本地删除&#xff0c;以取消对 work…

http、https、json编程

文章目录 1、http编程2、https编程3、json编程 1、http编程 HTTP 编程 http&#xff0c;归属于应用层的超文本传输协议 状态码&#xff1a;2xx(没问题) 3xx(重定向问题) 4xx(客户端问题) 5xx(服务端问题) 请求格式&#xff1a; 请求行 举例&#xff1a;GET /index.html HTTP/1…

docker服务无法启动

背景&#xff1a;断电重启经常会导致磁盘io错误&#xff0c;甚至出现磁盘坏块 这时可以使用xfs_repair来修复磁盘&#xff0c;但是修复过程可能会导致部分数据丢失 xfs_repair -f -L /dev/sdc问题一&#xff1a; Apr 15 19:27:15 Centos7.6 systemd[1]: Unit docker.service e…

linux安装weblogic

版本 Linux: Red Hat Enterprise Linux Server 6.9 64bit(安装了图形界面) JDK: 1.8U361 64bit weblogic: fmw_14.1.1.0.0_wls.jar 安装手顺 安装配置JDK 下载jdk压缩包 下载取得jdk-8I361-linux-x64.tar.gz将压缩包放置到linux,并解压缩到指定目录tar xvf jdk-8u201-…

【十一】MyBatis Plus 原理分析

MyBatis Plus 原理分析 摘要 Java EE开发中必不可少ORM框架&#xff0c;目前行业里最流行的orm框架非Mybatis莫属了&#xff0c;而Mybatis框架本身没有提供api实现&#xff0c;所以市面上推出了Mybatis plus系列框架&#xff0c;plus版是mybatis增强工具&#xff0c;用于简化My…

嵌入式系统及应用-1.1嵌入式

嵌入式系统 定义&#xff1a;看不见的计算机&#xff0c;一般不能被用户编程&#xff0c;它有一些专用的I/O设备&#xff0c;对用户的接口是应用专用的 通常将嵌入式计算机系统简称为嵌入式系统。 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础、软件硬件可裁剪、…

transformer上手(6)—— 微调预训练模型

1 加载数据集 以同义句判断任务为例&#xff08;每次输入两个句子&#xff0c;判断它们是否为同义句&#xff09;&#xff0c;构建我们的第一个 Transformers 模型。我们选择蚂蚁金融语义相似度数据集 AFQMC 作为语料&#xff0c;它提供了官方的数据划分&#xff0c;训练集 / …

记录一下如何腾讯云服务器用客户端连MySQL

我一般喜欢用IDEA连数据库&#xff0c;别问我为啥&#xff08;就喜欢用一个软件解决所有问题&#xff09; 当然写SQL语句个人还是觉得sqlyog体验最佳&#xff01;

【C/C++】什么是内存泄漏?如何检测内存泄漏?

一、内存泄漏概述 1.1 什么是内存泄漏 内存泄漏是在没有自动 gc 的编程语言里面&#xff0c;经常发生的一个问题。 自动垃圾回收&#xff08;Automatic Garbage Collection&#xff0c;简称 GC&#xff09;是一种内存管理技术&#xff0c;在程序运行时自动检测和回收不再使用…