当前位置: 首页 > news >正文

【Python深入浅出㊸】解锁Python3中的TensorFlow:开启深度学习之旅

目录

  • 一、TensorFlow 简介
    • 1.1 定义与背景
    • 1.2 特点
  • 二、Python 3 与 TensorFlow 的关系
    • 2.1 版本对应
    • 2.2 为何选择 Python 3
  • 三、安装 TensorFlow
    • 3.1 安装步骤
    • 3.2 验证安装
  • 四、TensorFlow 基本概念与使用方法
    • 4.1 计算图(Graph)
    • 4.2 会话(Session)
    • 4.3 张量(Tensor)
    • 4.4 变量(Variable)
    • 4.5 占位符(Placeholder)
  • 五、TensorFlow 高级应用
    • 5.1 构建神经网络
    • 5.2 迁移学习
    • 5.3 模型保存与加载
  • 六、案例实战
    • 6.1 图像分类
    • 6.2 回归问题
  • 七、总结与展望


一、TensorFlow 简介

1.1 定义与背景

TensorFlow 是由 Google 开发和维护的一个开源的端到端机器学习平台,它为开发者提供了构建、训练和部署机器学习模型的强大工具和框架。该框架最初于 2015 年开源,一经推出便在机器学习和深度学习领域引起了巨大的反响,迅速成为了最受欢迎的框架之一。

TensorFlow 这个名字来源于其核心概念:张量(Tensor)和流(Flow)。

  • 张量是一种多维数组,是 TensorFlow 中数据的基本表示形式。在深度学习中,数据通常以张量的形式进行处理,例如图像数据可以表示为一个三维张量(高度、宽度、通道数),而文本数据可以通过特定的编码方式转换为张量。
  • 流则表示张量在计算图中的流动过程。计算图是 TensorFlow 的另一个核心概念,它是由一系列节点(表示操作)和边(表示数据流向)组成的有向图。在计算图中,张量从输入节点开始,沿着边流动,经过各种操作节点(如加法、乘法、卷积、激活函数等)的处理,最终到达输出节点,这个过程就像水流在管道中流动一样,因此得名 “TensorFlow”。

这种基于张量和计算图的设计,使得 TensorFlow 能够高效地处理各种复杂的计算任务,并且便于进行分布式计算和硬件加速。

1.2 特点

  1. 灵活性:TensorFlow 的计算图模型赋予了开发者极高的灵活性。开发者可以自由地定义计算图的结构,根据不同的需求设计出各种复杂的神经网络模型。无论是简单的线性回归模型,还是复杂的卷积神经网络(CNN)、循环神经网络(RNN)及其变体(如 LSTM、GRU 等),都可以轻松地在 TensorFlow 中实现。而且,当现有的 API 无法满足需求时,开发者还可以通过自定义操作,编写底层的 C++ 代码,然后将其添加到 TensorFlow 中,进一步扩展框架的功能。这种灵活性使得 TensorFlow 能够适应各种不同的应用场景和研究需求,为开发者提供了广阔的创作空间。
  2. 跨平台性:TensorFlow 支持在多种硬件平台和操作系统上运行,包括 CPU、GPU、TPU(张量处理单元)等硬件设备,以及 Windows、Linux、macOS 等常见操作系统,甚至还可以在移动设备(如 Android 和 iOS)上运行。这意味着开发者可以根据自己的硬件资源和应用场景选择最合适的平台来部署模型。例如,在模型开发和调试阶段,可以使用 CPU 进行计算,方便快捷;而在模型训练阶段,当数据量较大且计算复杂时,可以利用 GPU 的并行计算能力来加速训练过程,大大缩短训练时间;对于大规模的深度学习任务,TPU 则能提供更强大的计算性能。在移动设备上运行 TensorFlow 模型,可以实现诸如图像识别、语音助手等功能,为用户带来更加便捷的体验。这种跨平台的特性使得 TensorFlow 的应用范围得到了极大的拓展,无论是在学术研究、工业生产还是日常生活中,都能发挥重要作用。
  3. 高性能:为了实现高性能计算,TensorFlow 采用了多种优化技术。它拥有强大的线性代数编译器 XLA(Accelerated Linear Algebra),XLA 可以对计算图进行优化,将计算图中的操作转换为高效的机器代码,减少计算时间和内存消耗,从而显著提高计算效率。TensorFlow 支持自动并行化,能够根据硬件资源和计算图的结构,自动将计算任务分配到多个 CPU 核心或 GPU 上并行执行,充分利用硬件的计算能力。在训练深度学习模型时,通常会涉及大量的矩阵运算,TensorFlow 能够自动将这些矩阵运算并行化处理,加速模型的训练过程。此外,TensorFlow 还对 GPU 进行了深度优化,能够充分发挥 GPU 的并行计算优势,使得在处理大规模数据和复杂模型时,也能保持高效的计算速度。这些优化技术使得 TensorFlow 在处理大规模机器学习和深度学习任务时表现出色,能够满足各种对计算性能要求苛刻的应用场景。
  4. 丰富的生态系统:经过多年的发展,TensorFlow 已经形成了一个庞大而丰富的生态系统。它拥有众多的工具和库,如 TensorBoard、TensorFlow Hub、TensorFlow Lite 等。TensorBoard 是一个可视化工具,它可以帮助开发者直观地了解模型的训练过程,包括损失函数的变化、准确率的提升、梯度的分布等信息,通过可视化的方式,开发者能够更方便地调试和优化模型;TensorFlow Hub 提供了大量的预训练模型,开发者可以直接使用这些预训练模型进行迁移学习,大大减少了模型训练的时间和成本,例如在图像分类任务中,可以使用 TensorFlow Hub 上的预训练模型,只需对模型的最后几层进行微调,就可以快速实现对特定图像类别的分类;TensorFlow Lite 则专门用于将 TensorFlow 模型部署到移动设备和嵌入式设备上,使得在资源受限的环境中也能运行高效的机器学习模型。此外,TensorFlow 还有活跃的社区支持,开发者可以在社区中分享经验、交流问题、获取最新的技术资讯和开源项目,这为 TensorFlow 的发展和应用提供了强大的动力。

二、Python 3 与 TensorFlow 的关系

2.1 版本对应

在使用 TensorFlow 时,确保其版本与 Python 3 的版本相互匹配至关重要,不匹配的版本可能会导致安装失败、运行时错误或功能缺失等问题。以下是一些常见的 TensorFlow 版本与 Python 3 版本的对应关系:

  • TensorFlow 1.15.x:支持 Python 3.4 - 3.6 版本。在这个版本区间内,开发者可以稳定地使用 TensorFlow 1.15.x 进行项目开发,利用其提供的各种机器学习和深度学习功能。例如,在一些对模型稳定性要求较高,且项目所依赖的其他库也与 Python 3.4 - 3.6 兼容的情况下,选择 TensorFlow 1.15.x 与相应 Python 版本搭配是一个不错的选择。
  • TensorFlow 2.x:支持 Python 3.5 - 3.8 版本。TensorFlow 2.x 在 API 设计和使用方式上有了较大的改进,更加简洁和易用,同时对 Python 3.5 及以上版本提供了良好的支持。以 Python 3.6、3.7 版本为例,很多基于 TensorFlow 2.x 的深度学习项目,如图像识别、自然语言处理等,都能顺利开发和运行,充分发挥 TensorFlow 2.x 的新特性和优势。

需要注意的是,这只是大致的对应关系,具体的版本兼容性可能因发行版和操作系统的不同而有所差异。因此,在安装和使用 TensorFlow 之前,务必查阅官方文档或发布说明,以获取准确的版本兼容性信息。比如,在 Windows 操作系统上安装 TensorFlow 时,某些特定版本可能会对 Python 版本有更细致的要求;而在 Linux 系统中,不同的发行版(如 Ubuntu、CentOS 等)也可能会影响 TensorFlow 与 Python 版本的兼容性。

2.2 为何选择 Python 3

  1. 语法简洁:Python 3 的语法设计以简洁、易读为目标,采用了缩进来表示代码块,避免了使用复杂的符号,使得代码结构更加清晰,逻辑更加一目了然。这对于深度学习领域复杂的算法实现和模型构建来说,大大降低了代码的编写难度和阅读成本。例如,在定义一个简单的函数时,Python 3 的语法如下:
def add_numbers(a, b):return a + b

相比其他一些编程语言,Python 3 的这种简洁语法使得开发者能够更专注于算法和模型的实现,而不是被繁琐的语法规则所困扰。在构建深度学习模型时,开发者可以使用 Python 3 简洁的语法轻松地定义神经网络的层结构、损失函数和优化器等。例如,使用 Keras 库(TensorFlow 的高级 API)构建一个简单的全连接神经网络模型,代码如下:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Densemodel = Sequential([Dense(64, activation='relu', input_shape=(input_dim,)),Dense(1, activation='sigmoid')
])

这种简洁的语法使得模型的构建过程清晰明了,易于理解和维护。

  1. 丰富库:Python 3 拥有庞大而丰富的库资源,这为深度学习开发提供了极大的便利。在数据处理方面,NumPy 库提供了高效的多维数组操作和数学函数,使得对大规模数据的处理变得高效而便捷;Pandas 库则擅长处理各种结构化数据,能够方便地进行数据读取、清洗、转换和分析,为深度学习模型准备高质量的数据。在机器学习和深度学习领域,Scikit - learn 库提供了丰富的传统机器学习算法和工具,如分类、回归、聚类等算法,可用于模型的评估和比较;而 TensorFlow 本身就是一个强大的深度学习框架,结合 Python 3 的其他库,能够实现各种复杂的深度学习模型。例如,在进行图像识别任务时,可以使用 OpenCV 库进行图像的读取、预处理和特征提取,然后结合 TensorFlow 构建卷积神经网络模型进行图像分类。代码示例如下:
import cv2
import numpy as np
from tensorflow.keras.models import load_model# 读取图像
image = cv2.imread('image.jpg')
# 图像预处理
image = cv2.resize(image, (224, 224))
image = image / 255.0
image = np.expand_dims(image, axis=0)# 加载模型
model = load_model('image_classification_model.h5')
# 预测
prediction = model.predict(image)
  1. 活跃社区:Python 3 拥有一个庞大且活跃的社区,这是其在深度学习领域广受欢迎的重要原因之一。在社区中,开发者们可以分享自己的经验、知识和代码,遇到问题时也能够迅速获得帮助。社区中还不断涌现出各种优秀的开源项目和工具,为深度学习的发展提供了强大的动力。例如,在 Stack Overflow 等技术论坛上,有大量关于 Python 3 和 TensorFlow 的问题和解答,开发者们可以在这里找到解决各种技术难题的思路和方法。此外,GitHub 上也有众多基于 Python 3 和 TensorFlow 的开源项目,如知名的图像识别项目、自然语言处理项目等,开发者可以参考这些项目的代码,学习先进的技术和架构设计,加速自己的项目开发进程。

三、安装 TensorFlow

3.1 安装步骤

  1. CPU 版本:如果你的计算机没有 NVIDIA GPU,或者不需要使用 GPU 加速,可以安装 CPU 版本的 TensorFlow。在命令行中运行以下命令即可安装最新版本的 CPU 版本 TensorFlow:
pip install tensorflow

如果需要安装指定版本的 TensorFlow,可以在命令中指定版本号,例如安装 2.10.0 版本的 TensorFlow:

pip install tensorflow==2.10.0
  1. GPU 版本:如果你的计算机配备了 NVIDIA GPU,并且希望利用 GPU 的强大计算能力加速 TensorFlow 的计算过程,可以安装 GPU 版本的 TensorFlow。安装 GPU 版本的 TensorFlow 需要满足一些额外的条件,包括安装 NVIDIA 驱动程序、CUDA Toolkit 和 cuDNN 库。首先,需要确保你的 NVIDIA GPU 支持 CUDA 计算。可以通过 NVIDIA 官方网站查询你的 GPU 型号是否支持 CUDA。然后,根据 TensorFlow 官方文档中关于 GPU 支持的版本对应关系,下载并安装相应版本的 NVIDIA 驱动程序、CUDA Toolkit 和 cuDNN 库。例如,若要安装 TensorFlow 2.10.0 的 GPU 版本,需要 CUDA 11.2 和 cuDNN 8.1。安装完成后,在命令行中运行以下命令安装 GPU 版本的 TensorFlow:
pip install tensorflow-gpu

同样,如果需要安装指定版本的 GPU 版本 TensorFlow,可以指定版本号,如:

pip install tensorflow-gpu==2.10.0

在安装过程中,可能会遇到一些问题。例如,网络连接不稳定可能导致安装失败,可以尝试更换网络环境或使用国内的镜像源,如清华镜像源(https://pypi.tuna.tsinghua.edu.cn/simple ),命令如下:

pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple

如果安装过程中出现依赖包冲突的问题,可以根据错误提示信息,手动安装或升级相关的依赖包,或者尝试创建一个新的虚拟环境,在虚拟环境中安装 TensorFlow,以避免依赖包冲突。

3.2 验证安装

安装完成后,可以通过以下代码来验证 TensorFlow 是否安装成功。在 Python 交互式环境或新建的 Python 脚本中输入以下代码:

import tensorflow as tf
# 打印TensorFlow版本
print(tf.__version__)
# 创建一个简单的张量并执行计算
tensor = tf.constant([[1.0, 2.0], [3.0, 4.0]])
result = tf.reduce_sum(tensor)
print(result)

运行上述代码,如果没有报错,并且能够正确打印出 TensorFlow 的版本号以及计算结果,说明 TensorFlow 已经成功安装。如果出现ModuleNotFoundError: No module named 'tensorflow’错误,说明 Python 无法找到 TensorFlow 模块,可能是安装过程中出现了问题,或者 Python 环境配置不正确,可以检查安装步骤和 Python 环境变量设置。

四、TensorFlow 基本概念与使用方法

4.1 计算图(Graph)

在 TensorFlow 中,计算图是一个有向图,用于表示计算任务。它由节点(Nodes)和边(Edges)组成,节点表示操作(Operations,简称 ops),边表示张量(Tensors)在操作之间的流动。计算图描述了计算的过程和依赖关系,它将计算过程抽象为一个数学模型,使得 TensorFlow 能够高效地执行各种计算任务。

计算图的构建和执行分为两个阶段。在构建阶段,开发者通过调用 TensorFlow 的 API 来定义各种操作和张量,这些操作和张量会被添加到计算图中,形成一个描述计算过程的图结构。在这个阶段,并不会真正执行计算,只是定义了计算的逻辑和步骤。例如,定义两个张量的加法操作,在构建阶段只是将这个加法操作和相关的张量添加到计算图中,而不会立即计算出结果。

在执行阶段,需要创建一个会话(Session)来启动计算图。会话负责将计算图中的操作分发到 CPU、GPU 等设备上执行,并管理计算过程中的资源。在会话中,通过调用run方法来执行计算图中的操作,此时才会根据计算图的定义进行实际的计算,并返回计算结果。
以一个简单的加法运算为例,展示计算图的构建过程:

import tensorflow as tf# 定义两个常量张量
a = tf.constant(2, name='a')
b = tf.constant(3, name='b')# 定义加法操作
result = tf.add(a, b, name='add_result')# 获取默认计算图
graph = tf.get_default_graph()
print(graph)

在上述代码中,首先定义了两个常量张量a和b,然后通过tf.add操作定义了它们的加法运算,得到结果张量result。在这个过程中,TensorFlow 自动将这些操作和张量添加到了默认的计算图中。通过tf.get_default_graph函数可以获取当前的默认计算图。

4.2 会话(Session)

会话(Session)在 TensorFlow 中扮演着至关重要的角色,它是执行计算图的上下文环境。会话拥有并管理 TensorFlow 程序运行时的所有资源,包括计算设备(如 CPU、GPU)的分配、张量的内存管理等。所有的计算操作都必须在会话中才能被执行,它负责将计算图中的操作映射到具体的硬件设备上,并协调各个操作的执行顺序。

在 TensorFlow 中,使用会话的方式主要有以下两种:

  1. 显式创建和关闭会话:通过调用tf.Session()来创建一个会话对象,在使用完会话后,需要显式调用close()方法来关闭会话,释放资源。例如:
import tensorflow as tf# 定义两个常量张量
a = tf.constant(2, name='a')
b = tf.constant(3, name='b')# 定义加法操作
result = tf.add(a, b, name='add_result')# 创建会话
sess = tf.Session()# 执行计算图操作,获取结果
output = sess.run(result)
print(output)  # 输出:5# 关闭会话
sess.close()
  1. 使用上下文管理器:利用 Python 的上下文管理器with语句来创建会话,这种方式更加简洁和安全。当with块中的代码执行完毕后,会话会自动关闭,避免了因忘记关闭会话而导致的资源泄露问题。例如:
import tensorflow as tf# 定义两个常量张量
a = tf.constant(2, name='a')
b = tf.constant(3, name='b')# 定义加法操作
result = tf.add(a, b, name='add_result')# 使用上下文管理器创建会话
with tf.Session() as sess:# 执行计算图操作,获取结果output = sess.run(result)print(output)  # 输出:5

在上述代码中,无论是显式创建和关闭会话,还是使用上下文管理器,都通过session.run(result)来执行计算图中的加法操作,并获取结果。在实际应用中,推荐使用上下文管理器的方式来管理会话,以提高代码的可读性和健壮性。

4.3 张量(Tensor)

张量(Tensor)是 TensorFlow 中的核心数据结构,它表示一个多维数组,是执行操作时的输入和输出数据。在 TensorFlow 中,所有的数据都以张量的形式进行处理和传递。

张量具有以下几个重要的概念:

  1. 数据类型:张量中的元素具有相同的数据类型,常见的数据类型包括tf.float32(32 位浮点数)、tf.int32(32 位整数)、tf.string(字符串)等。不同的数据类型在内存占用和计算精度上有所不同,开发者需要根据具体的应用场景选择合适的数据类型。例如,在深度学习中,通常使用tf.float32来表示神经网络的权重和输入数据,以平衡计算精度和计算效率。
  2. 秩(Rank):张量的秩表示张量的维度数量,也称为阶数。零阶张量表示标量(scalar),即一个单独的数值;一阶张量表示向量(vector),是一维数组;二阶张量表示矩阵(matrix),是二维数组;以此类推,n 阶张量表示一个 n 维数组。例如,一个形状为[2, 3]的张量是二阶张量,它可以看作是一个 2 行 3 列的矩阵。
  3. 形状(Shape):张量的形状描述了每个维度的大小。形状是一个元组,其中每个元素表示对应维度的长度。例如,张量a = tf.constant([[1, 2, 3], [4, 5, 6]])的形状为[2, 3],表示它是一个 2 行 3 列的矩阵。通过张量的shape属性可以获取其形状信息。

使用代码示例展示张量的创建:

import tensorflow as tf# 创建一个常量张量,数据类型为tf.float32,形状为[2, 3]
tensor1 = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], dtype=tf.float32)
print(tensor1)# 创建一个全零张量,数据类型为tf.int32,形状为[3, 4]
tensor2 = tf.zeros([3, 4], dtype=tf.int32)
print(tensor2)# 创建一个全一张量,数据类型为tf.float32,形状为[2]
tensor3 = tf.ones([2], dtype=tf.float32)
print(tensor3)# 创建一个随机正态分布的张量,数据类型为tf.float32,形状为[1, 2]
tensor4 = tf.random.normal([1, 2], mean=0.0, stddev=1.0)
print(tensor4)

在上述代码中,通过tf.constant创建了一个指定值的常量张量,通过tf.zeros创建了一个全零张量,通过tf.ones创建了一个全一张量,通过tf.random.normal创建了一个服从随机正态分布的张量。这些函数都可以指定张量的数据类型和形状。

4.4 变量(Variable)

变量(Variable)在 TensorFlow 中用于维护模型的状态,特别是在机器学习和深度学习中,用于存储模型的参数,如神经网络的权重(weights)和偏置(biases)。与张量不同,变量的值在计算过程中可以被更新,这使得模型能够通过训练不断优化参数,以提高模型的性能。

变量的创建通常使用tf.Variable函数,在创建时需要指定初始值。例如,创建一个用于表示神经网络权重的变量:

import tensorflow as tf# 创建一个变量,初始值为一个形状为[2, 3]的随机正态分布张量
weights = tf.Variable(tf.random.normal([2, 3], mean=0.0, stddev=1.0), name='weights')
print(weights)

在上述代码中,使用tf.random.normal生成一个形状为[2, 3]的随机正态分布张量作为变量weights的初始值,并指定变量的名称为weights。

变量在使用前需要进行初始化。在 TensorFlow 中,可以通过tf.global_variables_initializer()来初始化所有的变量。例如:

import tensorflow as tf# 创建变量
weights = tf.Variable(tf.random.normal([2, 3], mean=0.0, stddev=1.0), name='weights')
biases = tf.Variable(tf.zeros([3]), name='biases')# 初始化所有变量
init = tf.global_variables_initializer()with tf.Session() as sess:# 运行初始化操作sess.run(init)# 打印变量的值print(sess.run(weights))print(sess.run(biases))

在上述代码中,首先创建了变量weights和biases,然后通过tf.global_variables_initializer()创建了一个初始化操作init。在会话中,通过run方法执行初始化操作,使得变量被初始化,然后可以获取并打印变量的值。

在模型训练过程中,变量的值会根据优化算法不断更新。例如,在使用梯度下降算法训练神经网络时,会根据计算得到的梯度来更新权重和偏置变量的值,以最小化损失函数。

4.5 占位符(Placeholder)

占位符(Placeholder)是 TensorFlow 中一种特殊的张量,它主要用于在构建计算图时为模型的输入数据预留位置。占位符允许在运行时动态地传入数据,而不是在构建计算图时就确定数据的值。这使得模型能够处理不同的数据集,增加了模型的灵活性和通用性。

占位符的主要用途是为模型提供输入数据。在训练模型时,需要将训练数据输入到模型中进行计算和参数更新;在评估模型时,需要将测试数据输入到模型中计算预测结果。使用占位符可以方便地实现数据的输入,并且可以根据不同的需求传入不同大小和形状的数据。

使用代码示例展示如何使用占位符为模型输入数据:

import tensorflow as tf# 定义占位符,用于输入数据,数据类型为tf.float32,形状为[None, 2]
x = tf.placeholder(tf.float32, shape=[None, 2], name='x')
# 定义占位符,用于输入标签,数据类型为tf.float32,形状为[None, 1]
y = tf.placeholder(tf.float32, shape=[None, 1], name='y')# 定义权重变量,初始值为随机正态分布
weights = tf.Variable(tf.random.normal([2, 1], mean=0.0, stddev=1.0), name='weights')
# 定义偏置变量,初始值为0
biases = tf.Variable(tf.zeros([1]), name='biases')# 定义模型的预测结果
prediction = tf.matmul(x, weights) + biases# 定义损失函数(这里使用均方误差)
loss = tf.reduce_mean(tf.square(y - prediction))# 创建会话
with tf.Session() as sess:# 初始化变量sess.run(tf.global_variables_initializer())# 准备输入数据input_data = [[1.0, 2.0], [3.0, 4.0]]input_labels = [[5.0], [6.0]]# 运行计算图,传入数据,计算损失loss_value = sess.run(loss, feed_dict={x: input_data, y: input_labels})print(loss_value)

在上述代码中,首先定义了两个占位符x和y,分别用于输入数据和标签。然后定义了模型的权重和偏置变量,以及模型的预测结果和损失函数。在会话中,通过feed_dict参数将实际的输入数据和标签传入占位符,从而可以计算损失值。feed_dict是一个字典,它将占位符作为键,将实际的数据作为值,实现了数据的动态输入。

五、TensorFlow 高级应用

5.1 构建神经网络

以手写数字识别(MNIST)任务为例,我们来详细介绍使用 TensorFlow 构建、训练和评估神经网络的具体步骤。MNIST 数据集是一个经典的手写数字图像数据集,包含 60,000 张训练图像和 10,000 张测试图像,每张图像都是 28x28 像素的灰度图,对应 0 - 9 中的一个数字。

  1. 数据加载与预处理:首先,使用tensorflow.keras.datasets模块加载 MNIST 数据集。加载后的数据需要进行预处理,将图像数据的像素值归一化到 0 - 1 之间,以加快模型训练的收敛速度。同时,将标签数据进行独热编码(One - Hot Encoding),将每个数字标签转换为一个长度为 10 的向量,其中对应数字的位置为 1,其余位置为 0。例如,数字 3 的独热编码为[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]。以下是代码示例:
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical# 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 数据预处理
train_images = train_images.reshape((-1, 28, 28, 1)).astype('float32') / 255.0
test_images = test_images.reshape((-1, 28, 28, 1)).astype('float32') / 255.0# 标签独热编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
  1. 构建神经网络模型:这里我们构建一个简单的卷积神经网络(CNN)模型。CNN 在图像识别任务中表现出色,它通过卷积层、池化层和全连接层的组合,能够自动提取图像的特征。在这个模型中,我们使用两个卷积层和池化层来提取图像特征,然后通过 Flatten 层将多维数据展平为一维,再连接两个全连接层进行分类预测。代码如下:
model = tf.keras.Sequential([# 第一个卷积层,32个3x3卷积核,激活函数为ReLU,输入形状为(28, 28, 1)tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),# 最大池化层,池化窗口为2x2tf.keras.layers.MaxPooling2D((2, 2)),# 第二个卷积层,64个3x3卷积核,激活函数为ReLUtf.keras.layers.Conv2D(64, (3, 3), activation='relu'),# 最大池化层,池化窗口为2x2tf.keras.layers.MaxPooling2D((2, 2)),# Flatten层,将多维数据展平为一维tf.keras.layers.Flatten(),# 第一个全连接层,128个神经元,激活函数为ReLUtf.keras.layers.Dense(128, activation='relu'),# 输出层,10个神经元,对应10个数字类别tf.keras.layers.Dense(10, activation='softmax')
])
  1. 编译模型:在构建好模型后,需要对模型进行编译。编译过程中,我们需要指定优化器、损失函数和评估指标。这里我们使用 Adam 优化器,它是一种自适应学习率的优化算法,在深度学习中被广泛应用。损失函数选择交叉熵损失函数categorical_crossentropy,因为这是一个多分类问题。评估指标选择准确率accuracy,用于衡量模型在训练和测试过程中的预测准确性。代码如下:
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
  1. 训练模型:使用model.fit方法进行模型训练。在训练过程中,我们将训练数据train_images和对应的标签train_labels传入模型,同时指定训练的轮数epochs和每次训练的批次大小batch_size。为了监控模型的训练效果,我们还可以传入验证数据test_images和test_labels,模型会在每一轮训练结束后计算验证集上的损失和准确率。代码如下:
model.fit(train_images, train_labels, epochs=5, batch_size=64,validation_data=(test_images, test_labels))
  1. 评估模型:训练完成后,使用model.evaluate方法在测试集上评估模型的性能。该方法会返回测试集上的损失和准确率,通过这些指标可以评估模型的泛化能力,即模型在未见过的数据上的表现。代码如下:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")

5.2 迁移学习

迁移学习是一种机器学习技术,它的核心思想是将在一个任务或数据集上学习到的知识(通常是模型的参数或特征表示)迁移到另一个相关的任务或数据集上,从而加快新任务的学习速度,提高模型的性能,尤其是在新任务数据量较少的情况下。迁移学习基于这样一个假设:不同任务之间存在一定的相关性,在一个任务中学习到的通用特征在其他相关任务中也具有一定的价值。例如,在大规模图像数据集(如 ImageNet)上训练的图像分类模型,学习到了各种图像的通用特征,如边缘、形状、纹理等。当我们需要解决一个新的图像分类任务时,即使新任务的数据集较小,也可以利用这些预训练模型已经学习到的通用特征,而无需从头开始训练模型。

以在新数据集上微调预训练模型为例,展示迁移学习的实现步骤。假设我们有一个预训练的图像分类模型(如 VGG16),现在要将其应用于一个新的图像分类任务,新任务的数据集包含不同类别的图像。

  1. 加载预训练模型:使用tensorflow.keras.applications模块加载预训练的 VGG16 模型。这里我们加载在 ImageNet 数据集上预训练的 VGG16 模型,并设置include_top=False,表示不加载模型的顶层全连接层,因为我们要根据新任务的类别数重新定义顶层。代码如下:
from tensorflow.keras.applications.vgg16 import VGG16# 加载预训练的VGG16模型,不包含顶层全连接层
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
  1. 冻结预训练层:为了避免在微调过程中改变预训练模型已经学习到的通用特征,我们可以选择冻结预训练模型的部分或全部层。这里我们冻结所有层,使它们的参数在训练过程中不被更新。代码如下:
for layer in base_model.layers:layer.trainable = False
  1. 添加自定义顶层:根据新任务的类别数,添加自定义的顶层全连接层。这里我们假设新任务是一个 5 分类问题,因此添加一个包含 5 个神经元的全连接层,并使用softmax激活函数进行分类预测。代码如下:
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Flatten, Dense# 添加自定义顶层
x = base_model.output
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(5, activation='softmax')(x)# 构建新模型
model = Model(inputs=base_model.input, outputs=predictions)
  1. 编译模型:与构建新模型时一样,需要对迁移学习得到的模型进行编译,指定优化器、损失函数和评估指标。这里我们根据新任务的特点选择合适的优化器和损失函数。代码如下:
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
  1. 微调模型:使用新的数据集对模型进行微调训练。在微调过程中,预训练模型的底层参数保持不变,只有新添加的顶层参数会被更新。通过微调,模型可以逐渐适应新任务的数据分布和特征。代码如下:
# 假设已经准备好新的训练数据和标签
# train_images, train_labels为新的训练数据和标签
# validation_images, validation_labels为验证数据和标签
model.fit(train_images, train_labels, epochs=10, batch_size=32,validation_data=(validation_images, validation_labels))

5.3 模型保存与加载

在 TensorFlow 中,保存和加载模型是非常重要的操作,它可以帮助我们在训练完成后保存模型的参数和结构,以便在后续的应用中使用,或者在不同的环境中部署模型。同时,保存模型也可以用于断点续训,即在训练过程中暂停训练,然后从保存的模型状态继续训练。

  1. 保存模型:TensorFlow 提供了多种保存模型的方法,其中常用的是保存整个模型和保存模型的权重。保存整个模型时,会将模型的结构、权重、优化器状态和编译配置等信息都保存下来。可以使用model.save方法将模型保存为一个 HDF5 文件(.h5后缀)。例如:
model.save('my_model.h5')

保存模型权重时,只保存模型的权重参数,不包括模型的结构和其他信息。可以使用model.save_weights方法将模型权重保存为一个 HDF5 文件。例如:

model.save_weights('my_model_weights.h5')
  1. 加载模型:加载保存的模型也有相应的方法。如果保存的是整个模型,可以使用tf.keras.models.load_model方法加载模型,加载后可以直接使用模型进行预测或继续训练。例如:
from tensorflow.keras.models import load_model# 加载整个模型
loaded_model = load_model('my_model.h5')如果保存的是模型权重,需要先构建与原模型相同结构的模型,然后使用load_weights方法加载权重。例如:
# 构建与原模型相同结构的模型
new_model = build_model()  # build_model是自定义的构建模型函数
# 加载模型权重
new_model.load_weights('my_model_weights.h5')

保存整个模型和保存模型权重各有优缺点。保存整个模型的优点是使用方便,加载后可以直接使用,不需要重新构建模型结构;缺点是文件较大,包含了较多的信息。保存模型权重的优点是文件较小,只保存了关键的权重参数;缺点是需要在加载前先构建好模型结构,并且如果模型结构发生变化,可能会导致权重加载失败。在实际应用中,需要根据具体需求选择合适的保存和加载方式。

六、案例实战

6.1 图像分类

以 CIFAR - 10 数据集为例,展示使用 TensorFlow 实现图像分类的完整流程。CIFAR - 10 数据集是一个常用的图像数据集,包含 10 个不同类别的 60000 张 32x32 的彩色图像,其中 50000 张用于训练,10000 张用于测试。这 10 个类别分别是飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。

  1. 数据加载与预处理:使用tf.keras.datasets模块加载 CIFAR - 10 数据集。加载后的数据需要进行预处理,将图像数据的像素值归一化到 0 - 1 之间,以加快模型训练的收敛速度。同时,将标签数据进行独热编码(One - Hot Encoding),将每个数字标签转换为一个长度为 10 的向量,其中对应数字的位置为 1,其余位置为 0。以下是代码示例:
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical# 加载CIFAR - 10数据集
(train_images, train_labels), (test_images, test_labels) = cifar10.load_data()# 数据预处理
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0# 标签独热编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
  1. 构建神经网络模型:这里构建一个简单的卷积神经网络(CNN)模型。CNN 在图像识别任务中表现出色,它通过卷积层、池化层和全连接层的组合,能够自动提取图像的特征。在这个模型中,使用多个卷积层和池化层来提取图像特征,然后通过 Flatten 层将多维数据展平为一维,再连接两个全连接层进行分类预测。代码如下:
model = tf.keras.Sequential([# 第一个卷积层,32个3x3卷积核,激活函数为ReLU,输入形状为(32, 32, 3)tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),# 最大池化层,池化窗口为2x2tf.keras.layers.MaxPooling2D((2, 2)),# 第二个卷积层,64个3x3卷积核,激活函数为ReLUtf.keras.layers.Conv2D(64, (3, 3), activation='relu'),# 最大池化层,池化窗口为2x2tf.keras.layers.MaxPooling2D((2, 2)),# 第三个卷积层,64个3x3卷积核,激活函数为ReLUtf.keras.layers.Conv2D(64, (3, 3), activation='relu'),# Flatten层,将多维数据展平为一维tf.keras.layers.Flatten(),# 第一个全连接层,64个神经元,激活函数为ReLUtf.keras.layers.Dense(64, activation='relu'),# 输出层,10个神经元,对应10个数字类别tf.keras.layers.Dense(10, activation='softmax')
])
  1. 编译模型:在构建好模型后,需要对模型进行编译。编译过程中,需要指定优化器、损失函数和评估指标。这里使用 Adam 优化器,它是一种自适应学习率的优化算法,在深度学习中被广泛应用。损失函数选择交叉熵损失函数categorical_crossentropy,因为这是一个多分类问题。评估指标选择准确率accuracy,用于衡量模型在训练和测试过程中的预测准确性。代码如下:
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
  1. 训练模型:使用model.fit方法进行模型训练。在训练过程中,将训练数据train_images和对应的标签train_labels传入模型,同时指定训练的轮数epochs和每次训练的批次大小batch_size。为了监控模型的训练效果,还可以传入验证数据test_images和test_labels,模型会在每一轮训练结束后计算验证集上的损失和准确率。代码如下:
model.fit(train_images, train_labels, epochs=10, batch_size=64,validation_data=(test_images, test_labels))
  1. 评估模型:训练完成后,使用model.evaluate方法在测试集上评估模型的性能。该方法会返回测试集上的损失和准确率,通过这些指标可以评估模型的泛化能力,即模型在未见过的数据上的表现。代码如下:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")

6.2 回归问题

以房价预测为例,说明如何使用 TensorFlow 解决回归问题,包括数据预处理、模型构建和训练。这里使用波士顿房价数据集,该数据集包含 506 个样本,每个样本有 13 个特征,如犯罪率、每个住宅的平均房间数、高速公路可达性等,目标是预测房屋价格的中位数,单位是千美元。

  1. 数据加载与预处理:使用tf.keras.datasets模块加载波士顿房价数据集。加载后的数据需要进行预处理,将每个特征进行标准化处理,即减去特征的平均值并除以标准差,使特征的均值为 0,标准差为 1。这样可以避免不同特征的取值范围差异过大对模型训练的影响。以下是代码示例:
import tensorflow as tf
from tensorflow.keras.datasets import boston_housing
import numpy as np# 加载波士顿房价数据集
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()# 数据预处理
mean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data /= stdtest_data -= mean
test_data /= std
  1. 构建神经网络模型:由于样本数量较少,为了避免过拟合,使用一个较小的网络,包含两个隐藏层,每层有 64 个单元。网络的最后一层只有一个单元,没有激活函数,是一个线性层,用于输出连续的预测值。代码如下:
def build_model():model = tf.keras.Sequential([tf.keras.layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],)),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(1)])model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])return model
  1. 训练模型:使用 K 折交叉验证来评估模型。将数据划分为 K 个分区(这里 K 取 4),实例化 K 个相同的模型,将每个模型在 K - 1 个分区上训练,并在剩下的一个分区上进行评估。模型的验证分数等于 K 个验证分数的平均值。代码如下:
import numpy as npk = 4
num_val_samples = len(train_data) // k
num_epochs = 100
all_scores = []for i in range(k):print(f'processing fold #{i}')val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples]val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]partial_train_data = np.concatenate([train_data[:i * num_val_samples],train_data[(i + 1) * num_val_samples:]], axis=0)partial_train_targets = np.concatenate([train_targets[:i * num_val_samples],train_targets[(i + 1) * num_val_samples:]], axis=0)model = build_model()model.fit(partial_train_data, partial_train_targets, epochs=num_epochs, batch_size=1, verbose=0)val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)all_scores.append(val_mae)print(all_scores)
print(np.mean(all_scores))

通过以上案例,我们可以看到 TensorFlow 在图像分类和回归问题等实际应用中的强大能力,能够帮助我们解决各种复杂的机器学习任务。

七、总结与展望

在本文中,我们深入探索了 Python 3 环境下的 TensorFlow 深度学习框架。从 TensorFlow 的基本概念,如计算图、会话、张量、变量和占位符,到高级应用,包括构建神经网络、迁移学习以及模型的保存与加载,再到图像分类和回归问题的案例实战,全面展示了 TensorFlow 在机器学习和深度学习领域的强大功能和广泛应用。

通过这些内容,我们了解到 TensorFlow 不仅提供了高效的计算模型和丰富的 API,还拥有强大的社区支持和丰富的生态系统,使得开发者能够轻松地构建和训练各种复杂的深度学习模型,解决实际问题。在图像分类任务中,利用 TensorFlow 构建的卷积神经网络能够准确地识别图像中的物体类别;在回归问题中,通过构建合适的神经网络模型,可以实现对房价等连续值的有效预测。

展望未来,随着人工智能技术的不断发展,TensorFlow 有望在更多领域取得突破。在模型性能方面,将不断优化算法和计算效率,以支持更大规模的数据和更复杂的模型;在应用领域,将进一步拓展到医疗、金融、交通等各个行业,推动这些行业的智能化发展。在医疗领域,TensorFlow 可以帮助医生进行疾病诊断、药物研发等工作;在金融领域,能够用于风险评估、投资决策等。

对于读者来说,深度学习是一个充满无限可能的领域,TensorFlow 则是开启这扇大门的钥匙。希望大家通过本文的学习,能够对 TensorFlow 有更深入的理解和掌握,在未来的学习和工作中,不断探索和实践,利用 TensorFlow 创造出更多有价值的应用,为推动人工智能技术的发展贡献自己的力量。

相关文章:

【Python深入浅出㊸】解锁Python3中的TensorFlow:开启深度学习之旅

目录 一、TensorFlow 简介1.1 定义与背景1.2 特点 二、Python 3 与 TensorFlow 的关系2.1 版本对应2.2 为何选择 Python 3 三、安装 TensorFlow3.1 安装步骤3.2 验证安装 四、TensorFlow 基本概念与使用方法4.1 计算图(Graph)4.2 会话(Sessio…...

CMakeLists使用

1.预定义宏 宏 功能 PROJECT_SOURCE_DIR 使用cmake命令后紧跟的目录,一般是工程的根目录 PROJECT_BINARY_DIR 执行cmake命令的目录 CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径…...

P7201 [COCI 2019/2020 #1] Džumbus

题目背景 Marin 是一个心地善良的人,因此他将为他的 N 个朋友组织 Q 次宴会。宴会上唯一的饮料被称为 džumbus。 每位朋友对这种饮料的需求量是已知的。在这些朋友中,有 M 组朋友。每一组中的两位在同时满足他们各自的需求量后,将开始互相核对自己对往届 COCI 题目的答案…...

网络性能测试工具ipref

文章目录 一、ipref的介绍二、iperf安装配置三、iperf使用四、iperf常见故障处理 一、ipref的介绍 ipref是一种常用的网络性能测试工具,用于评估网络带宽、延迟和吞吐量等性能指标。它通过在客户端和服务器之间发送数据流来测量网络的性能,可以帮助管理…...

C# Dictionary的实现原理

在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个基于哈希表&#xff08;Hash Table&#xff09;实现的键值对集合。它提供了高效的插入、删除和查找操作&#xff0c;平均时间复杂度接近 O(1)。下面是 Dictionary 的核心实现原理&#xff1a; 1. Dictionary 的核心数…...

在项目中操作 MySQL

在现代Web开发中&#xff0c;Node.js因其非阻塞I/O模型和高效的性能成为了构建后端服务的热门选择之一。与此同时&#xff0c;MySQL作为最流行的关系型数据库管理系统之一&#xff0c;凭借其稳定性、可靠性和易用性&#xff0c;在数据存储方面扮演着重要角色。本文将详细介绍如…...

第6章 6.4 ASP.NET Core Web API各种技术及选择

6.4.1 控制器父类用哪个 6.2小节和6.3小节所演示的ASP.NET Core Web API 的控制器类都继承自ControllerBase&#xff0c;而6.1中MVC的控制器继承自Controller&#xff0c;Controller又继承自ControllerBase。 所以&#xff0c;一般情况下&#xff0c;编写的WebAPI控制器类继承…...

DeepSeek本地化部署【window下安装】【linux下安装】

一、window 本地安装指导 1.1、下载window安装包 https://ollama.com/download/OllamaSetup.exe 1.2、点击下载好的安装包进行安装 检测安装是否成功&#xff1a; C:\Users\admin>ollama -v ollama version is 0.5.7有上面的输出&#xff0c;则证明已经安装成功。 配置…...

字玩FontPlayer开发笔记14 Vue3实现多边形工具

目录 字玩FontPlayer开发笔记14 Vue3实现多边形工具笔记整体流程临时变量多边形组件数据结构初始化多边形工具mousedown事件mousemove事件监听mouseup事件渲染控件将多边形转换为平滑的钢笔路径 字玩FontPlayer开发笔记14 Vue3实现多边形工具 字玩FontPlayer是笔者开源的一款字…...

kkFileView二开之pdf转图片接口

kkFileView二开之Pdf转图片接口 1 kkFileView源码下载及编译2 Pdf转图片接口2.1 背景2.2 分析2.2 接口开发2.2.1 编写Pdf转图片方法2.2.2 编写转换接口 2.3 接口测试2.3.1 Pdf文件准备2.3.2 pdf2Image 3 部署 1 kkFileView源码下载及编译 前文 【kkFileView二开之源码编译及部…...

达梦tpcc压测

造数 在这个日志输出中&#xff0c;主要执行了一系列数据库操作&#xff0c;涵盖了数据库信息检查、表的创建与数据加载、索引的添加、数据验证等步骤。具体分析如下&#xff1a; 数据库信息检查&#xff1a; 查询了数据库的版本、实例名称、日志文件大小、字符集等信息。 删…...

计算机毕业设计PySpark+hive招聘推荐系统 职位用户画像推荐系统 招聘数据分析 招聘爬虫 数据仓库 Django Vue.js Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

DeepSeek正重构人形机器人和具身大模型赛道!

中国人工智能公司DeepSeek&#xff08;深度求索&#xff09;以“低成本、高效率、强开放”的研发范式横空出世&#xff0c;火遍并震撼全球科技圈&#xff1b;DeepSeek展现出来的核心竞争力&#xff0c;除了低成本及推理能力&#xff0c;更重要的是开源模型能力追赶上了最新的闭…...

第1章 信息化发展(一)

1.1信息与信息化 1.1.1信息基础 1.信息的定义 信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。它以物质介质为载体&#xff0c;传递和反映世界各种事物存在方式、运动状态等的表征。信息不是物质也不是能量&#xff0c;它以一种普遍形式&#xff0c;表达…...

面试经典150题——字典树

文章目录 1、实现 Trie (前缀树)1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、添加与搜索单词 - 数据结构设计2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词搜索 II3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 对于字典树而言&#xff0c;之前做过…...

【前端 DevOps】GitHub Actions 与 GitLab CI 实战:实现前端项目的自动化测试与部署

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

SQLMesh系列教程-3:SQLMesh模型属性详解

SQLMesh 的 MODEL 提供了丰富的属性&#xff0c;用于定义模型的行为、存储、调度、依赖关系等。通过合理配置这些属性&#xff0c;可以构建高效、可维护的数据管道。在 SQLMesh 中&#xff0c;MODEL 是定义数据模型的核心结构&#xff0c;初学SQLMesh&#xff0c;定义模型看到属…...

【Maven】多module项目优雅的实现pom依赖管理

【Maven】多module项目优雅的实现pom依赖管理 【一】方案设计原则【二】项目结构示例【三】实现思路【1】可能的问题点&#xff1a;【2】解决方案的思路&#xff1a;【3】需要注意的地方&#xff1a;【4】可能的错误&#xff1a; 【四】实现案例【1】父POM设计&#xff08;pare…...

【数字】异步FIFO面试的几个小问题与跨时钟域时序约束

入门数字设计的时候&#xff0c;跨时钟域的数据处理是绕不开的课题&#xff0c;特别是多比特数据跨时钟域时&#xff0c;都会采用异步FIFO的方法。 异步FIFO中涉及较多的考点这里记录几个以供大家参考。 1. 异步FIFO的空满判断分别在哪个域&#xff1f; 根据异步FIFO的结构&…...

云原生时代的开发利器

云原生时代的开发工具集之中&#xff0c;至少应有这样一种利器&#xff1a;基于微服务架构的低代码开发平台&#xff0c;同时与业界标准的云原生技术支撑设施能够完全协同和融合。低代码开发平台的构建不仅仅是采用微服务开发框架&#xff0c;更加重要的是符合当前主流的中台和…...

利用IDEA将Java.class文件反编译为Java文件:原理、实践与深度解析

文章目录 引言&#xff1a;当.class文件遇到源代码缺失第一章&#xff1a;反编译技术基础认知1.1 Java编译执行原理1.2 反编译的本质1.3 法律与道德边界 第二章&#xff1a;IDEA内置反编译工具详解2.1 环境准备2.2 三步完成基础反编译2.3 高级反编译技巧2.3.1 调试模式反编译2.…...

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

2.7 静态方法/构造函数Mock

静态方法/构造函数Mock 在单元测试中&#xff0c;静态方法和构造函数的Mock是相对复杂的需求&#xff0c;因为Mockito的核心设计基于对象实例的模拟。然而&#xff0c;通过扩展工具或特定技巧&#xff0c;可以实现对这些场景的处理。本章详解两种主流方案&#xff1a;PowerMoc…...

注册Gmail如何跳过手机验证环节?

很多小伙伴在注册Gmail的时候都会遇到一个难题&#xff1a;手机号码验证&#xff0c;有可能包括了“手机号无法验证” “国内手机号验证失败” “收不到验证码”等等问题&#xff0c;但 根据真实案例&#xff0c;还有部分人则是“幸运地”没有手机号验证环节&#xff0c;那么今…...

【算法专场】哈希表

目录 前言 哈希表 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 算法分析 算法代码 面试题 01.02. 判定是否互为字符重排 ​编辑算法分析 算法代码 217. 存在重复元素 算法分析 算法代码 219. 存在重复元素 II 算法分析 算法代码 解法二 算法代码 算法…...

5、pod 详解 (kubernetes)

pod 详解 &#xff08;kubernetes&#xff09; Pod 的基础概念pause 容器Pod 的分类与创建自主式 Pod控制器管理的 Pod静态 Pod Pod容器的分类基础容器&#xff08;infrastructure container&#xff09;初始化容器&#xff08;initcontainers&#xff09;应用容器&#xff08;…...

二叉树详解:Java实现与应用

在计算机科学中&#xff0c;数据结构是构建高效算法的基石&#xff0c;而二叉树作为一种基础且重要的树形结构&#xff0c;在诸多领域都有着广泛应用&#xff0c;如数据库索引、文件系统、编译器设计等。本文将从基础概念入手&#xff0c;带你逐步深入理解二叉树&#xff0c;并…...

GPT和BERT

笔记来源&#xff1a; Transformer、GPT、BERT&#xff0c;预训练语言模型的前世今生&#xff08;目录&#xff09; - B站-水论文的程序猿 - 博客园 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频&#xff08;RNN模型与NLP应用&#xff09; 一、GPT 1.1 GPT 模型的…...

【工业安全】-CVE-2024-30891- Tenda AC18路由器 命令注入漏洞

1.漏洞描述 2.漏洞复现 2.1 qemu-user 模拟&#xff1a; 2.2 qemu-system模拟&#xff1a; 3.漏洞分析 4.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2024-30891 漏洞名称&#xff1a;Tenda AC18 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1a;Ten…...

如何从0开始将vscode源码编译、运行、打包桌面APP

** 网上关于此的内容很少&#xff0c;今天第二次的完整运行了&#xff0c;按照下文的顺序走不会出什么问题。最重要的就是环境的安装&#xff0c;否则极其容易报错&#xff0c;请参考我的依赖版本以及文末附上的vscode官方指南 ** 第一步&#xff1a;克隆 VSCode 源码 首先…...

登录弹窗效果

1&#xff0c;要求 点击登录按钮&#xff0c;弹出登录窗口 提示1&#xff1a;登录窗口 display:none 隐藏状态&#xff1b; 提示2&#xff1a;登录按钮点击后&#xff0c;触发事件&#xff0c;修改 display:block 显示状态 提示3&#xff1a;登录窗口中点击关闭按钮&#xff0…...

wps或office的word接入豆包API(VBA版本)

直接上代码&#xff0c;由于时间匆忙&#xff0c;以后写个详细的教程 #If VBA7 ThenPrivate Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As…...

深入浅出 Python Logging:从基础到进阶日志管理

在 Python 开发过程中&#xff0c;日志&#xff08;Logging&#xff09;是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题&#xff0c;还能提供丰富的数据支持&#xff0c;让应用更具可观测性。本文将带你全面了解 Python logging 模块&#xff0c;涵盖…...

系统巡检脚本分享:守护服务器的“健康卫士”

在日常的运维工作中&#xff0c;系统巡检是一项至关重要的任务。它可以帮助我们及时发现服务器的潜在问题&#xff0c;确保系统的稳定运行。今天&#xff0c;我想和大家分享一个实用的系统巡检脚本&#xff0c;它能够帮助我们快速、全面地检查服务器的健康状况。 一、为什么需…...

【Elasticsearch】运行时字段(Runtime Fields)索引时定义运行时字段

在 Elasticsearch 中&#xff0c;运行时字段&#xff08;Runtime Fields&#xff09;是一种在查询时动态计算的字段&#xff0c;而不是在索引时预先存储的字段。运行时字段为数据处理提供了极大的灵活性&#xff0c;尤其是在处理结构不固定的日志数据或需要动态生成字段值的场景…...

C++从入门到实战(四)C++引用与inline,nullptr

C从入门到实战&#xff08;四&#xff09;C引用与inline&#xff0c;nullptr 前言一、C 引用&#xff08;一&#xff09;什么是引用&#xff08;二&#xff09;引用的特点&#xff08;三&#xff09;引用作为函数参数&#xff08;四&#xff09;引用作为函数返回值&#xff08;…...

DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

Azure Synapse Dedicated SQL Pool统计指定表中各字段的空值、空字符串或零值比例

-- 创建临时表存储结果 CREATE TABLE #Results (DatabaseName NVARCHAR(128),TableName NVARCHAR(128),ColumnName NVARCHAR(128),DataType NVARCHAR(128),NullOrEmptyCount INT,TotalRows INT,Percentage DECIMAL(10,2) );DECLARE db_name SYSNAME DB_NAME(); -- 获取当前数…...

【深度学习】计算机视觉(CV)-目标检测-SSD(Single Shot MultiBox Detector)—— 单次检测多框检测器

&#x1f539; SSD&#xff08;Single Shot MultiBox Detector&#xff09;—— 单次检测多框检测器 1️⃣ 什么是 SSD&#xff1f; SSD (Single Shot MultiBox Detector) 是一种用于 目标检测&#xff08;Object Detection&#xff09; 的 深度学习模型&#xff0c;由 Wei L…...

力扣100. 相同的树(利用分解思想解决)

Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同&#xff0c;而此要求可以利用问题分解的思想解决&#xff0c;即判断当前节点的左右子树是否完全相同&#xff0c;而在二叉树问题分解的一般题目中均会带有返回值&#xff…...

在SpringBoot服务器端采购上,如何选择操作系统、Cpu、内存和带宽、流量套餐

在Spring Boot服务器端采购时&#xff0c;选择操作系统、CPU、内存、带宽和流量套餐需根据应用需求、预算和性能要求综合考虑。以下是具体建议&#xff1a; 1. 操作系统 Linux发行版&#xff08;如Ubuntu、CentOS&#xff09;&#xff1a;适合大多数Spring Boot应用&#xff…...

我的新书《青少年Python趣学编程(微课视频版)》出版了!

&#x1f389; 激动人心的时刻来临啦&#xff01; &#x1f389; 小伙伴们久等了&#xff0c;我的第一本新书 《青少年Python趣学编程&#xff08;微课视频版&#xff09;》 正式出版啦&#xff01; &#x1f4da;✨ 在这个AI时代&#xff0c;市面上的Python书籍常常过于枯燥&…...

elementUI rules 判断 el-cascader控件修改值未生效

今天修改一个前端项目&#xff0c;增加一个多选字段&#xff0c;使用的是el-cascader控件&#xff0c;因页面是通过引用子页面组件形式使用&#xff0c;出现一个点选后再勾选原有值&#xff0c;输入框内不展示或取消后的也未正常隐藏&#xff0c;如果勾选的值是全新的则其他已选…...

深度学习与人工智能:解锁未来的无限可能

在当今这个科技飞速发展的时代&#xff0c;深度学习和人工智能已不再只是科幻小说中的概念&#xff0c;它们正以惊人的速度渗透到我们生活的方方面面&#xff0c;从智能手机上的语音助手到医疗领域的疾病诊断&#xff0c;从自动驾驶汽车到金融市场的风险预测&#xff0c;其影响…...

pwa应用进阶2-动态加载manifest.json文件

接pwa应用进阶-区分AB面-添加安装按钮而且区分不同的系统和浏览器的各种情况继续优化&#xff0c;主要是让manifest.json文件动态加载。 pwa应用进阶2-动态加载manifest.json文件 主要用途如下&#xff1a; 动态切换PWA的清单文件&#xff0c;例如根据不同的语言或者主题加载不…...

UI用例调试_元素能定位到且不在frame内_无法点击/录入文本

关于单据新增&#xff0c;编辑子集信息遇到的2个阻塞点&#xff0c;做记录已供后续参考 1、新增按钮元素能定位&#xff0c;就是无法点击 实现效果&#xff1a; 单据新增时&#xff0c;前面单据数据编辑完之后&#xff0c;开始新增证件信息&#xff0c;需要先点击新增按钮。…...

Python的web框架Flask适合哪些具体的应用开发?

Flask 适用的具体应用及实现案例代码 Flask 是一个轻量级的 Web 应用框架,以其简洁性和灵活性而广受欢迎。以下是 Flask 适合的具体应用场景及相关的实现案例代码: 1. 小型网站或博客 由于 Flask 的简洁性和易于使用的特性,它非常适合用来搭建个人博客或者小型的企业网站…...

oracle使用动态sql将多层级组织展平

ERP或者其他企业管理软件中都会有一张组织机构表&#xff0c;可以写固定sql的方式将其展平获取组织表中的字段信息&#xff0c;如负责人、上级组织负责人、分管领导、成立时间等。但是这种方式有个缺陷&#xff0c;就是如果只写到处理4个层级&#xff0c;那么后期层级增多就无法…...

vue学习笔记10

ChatGPT & Copilot AI 的认知 两个工具 1、ChatGPT 3.5 2、Github Copilot ChatGPT 的基本使用 - Prompt 优化 AI 互动的过程中&#xff0c;容易出现的问题&#xff1a; 1、 AI未能理解问题的核心要点 2、 AI的回答过于宽泛 或 过于具体 3、 AI提供了错误的信息或…...

网络安全常识

随着互联网和移动互联网的持续火热&#xff0c;人们的生活也越来越离不开网络&#xff0c;网络安全&#xff0c;在这个信息化时代显得尤为重要&#xff0c;那么网络攻击和安全&#xff0c;这一攻守之间&#xff0c;主要涵盖哪些要点呢&#xff0c;下面我们就来对此进行抽丝剥茧…...