【深度学习基础 1】 TensorFlow 框架

发布于:2025-03-30 ⋅ 阅读:(42) ⋅ 点赞:(0)

目录

一、TensorFlow简介

1. 什么是 TensorFlow?

2.TensorFlow的特点

二、TensorFlow的安装

1. 安装 CPU 版本:

2. 安装 GPU 版本(需要 CUDA 和 cuDNN 支持):

3. 检验 

三、常用的TensorFlow函数

1. 创建张量(Tensor)

2. 变量(Variable)

3. 基本数学运算

4. 自动求导(梯度计算)

5. 应用示例

① 构建简单的神经网络

② 训练和评估模型

③ 使用 TensorFlow 进行预测


一、TensorFlow简介

1. 什么是 TensorFlow?

        TensorFlow 是 Google 开发的一个开源机器学习和深度学习框架,广泛用于构建和训练神经网络。它支持 CPU、GPU 和 TPU 加速计算,并且提供了灵活的 API 以适应研究和生产环境。

2.TensorFlow的特点

  • 高效的数值计算:基于数据流图(DataFlow Graph)进行计算。

  • 灵活的模型构建:支持 Keras 高级 API 进行快速建模。

  • 跨平台支持:可在 CPU、GPU、TPU、移动设备和云端运行。

  • 自动微分:方便进行梯度计算和优化。

  • 丰富的生态系统:包括 TensorBoard(可视化工具)、TF-Serving(模型部署)等。

注意:Keras是基于Tensorflow编写的深度学习框架,是在Tensorflow的基础上再次集成的。

二、TensorFlow的安装

        通过 pip 进行安装。建议在 Python 3.8 及以上版本的虚拟环境中安装

1. 安装 CPU 版本:

pip install tensorflow

2. 安装 GPU 版本(需要 CUDA 和 cuDNN 支持):

pip install tensorflow-gpu

        注: CUDA 和 cuDNN的安装参考YOLO系列环境配置及训练_yolo环境配置-CSDN博客

3. 检验 

import tensorflow as tf
print(tf.__version__)

能成功输出对应安装的tensorflow版本号即视为成功 

三、常用的TensorFlow函数

1. 创建张量(Tensor)

        函数:constant

        用途:张量(Tensor)是数据的基本结构,类似于 NumPy 数组

样例:

import tensorflow as tf

# 创建标量、向量和矩阵
scalar = tf.constant(5)  
vector = tf.constant([1, 2, 3])  
matrix = tf.constant([[1, 2], [3, 4]])  

print("标量:", scalar)
print("向量:", vector)
print("矩阵:\n", matrix)

样例输出:

标量: tf.Tensor(5, shape=(), dtype=int32)
向量: tf.Tensor([1 2 3], shape=(3,), dtype=int32)
矩阵:
 tf.Tensor(
[[1 2]
 [3 4]], shape=(2, 2), dtype=int32)

2. 变量(Variable)

        函数:Variable

        用途:在训练神经网络时,用变量(tf.Variable)来存储和更新权重参数

样例:

# 创建变量
w = tf.Variable(3.0)
b = tf.Variable(2.0)

# 变量可以进行赋值
w.assign(5.0)
print("w:", w.numpy())

样例输出:

w: 5.0

3. 基本数学运算

        函数:constant

        用途:提供了基本的数学运算,如加法、乘法、矩阵运算等。

样例:

a = tf.constant(3.0)
b = tf.constant(2.0)

print("加法:", tf.add(a, b).numpy())  
print("乘法:", tf.multiply(a, b).numpy())  
print("矩阵乘法:", tf.matmul([[1, 2]], [[3], [4]]).numpy())  

样例输出:

加法: 5.0
乘法: 6.0
矩阵乘法: [[11]]

4. 自动求导(梯度计算)

样例:

x = tf.Variable(2.0)

with tf.GradientTape() as tape:
    y = x**3 + 2*x + 1  # y = x³ + 2x + 1

dy_dx = tape.gradient(y, x)  
print("dy/dx:", dy_dx.numpy())

样例输出:

dy/dx: 14.0

 分析:

  1. 变量定义

    tf.Variable(2.0) 声明一个可训练变量,TensorFlow会自动跟踪其梯度。
  2. 梯度记录

    tf.GradientTape() 会记录所有与变量 x 相关的计算操作(如平方、乘法等)。
  3. 梯度计算

    tape.gradient(y, x) 利用反向传播自动计算 \frac{dy}{dx}

5. 应用示例

① 构建简单的神经网络

        使用 tf.keras 可以搭建神经网络,例如将其用于手写数字识别的 MNIST 数据集

from tensorflow import keras
from tensorflow.keras import layers

# 构建神经网络
model = keras.Sequential([
    layers.Dense(128, activation='relu', input_shape=(784,)),
    layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 查看模型结构
model.summary()

样例输出:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 128)               100480    
dense_1 (Dense)              (None, 10)                1290      
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0

分析: 

model = keras.Sequential([
    layers.Dense(128, activation='relu', input_shape=(784,)),
    layers.Dense(10, activation='softmax')
])

  • 模型结构

    • 输入层:隐式定义,接收形状为 (784,) 的输入(如展平后的28x28图像)。

    • 隐藏层:全连接层(Dense),128个神经元,激活函数为ReLU。

    • 输出层:全连接层,10个神经元(对应10个类别),激活函数为Softmax(输出概率分布)。

  • 关键参数

    • input_shape=(784,):指定输入数据的维度(需与预处理后的数据一致)。

    • activation='relu':ReLU函数缓解梯度消失,提升非线性表达能力。

    • activation='softmax':将输出转换为概率分布,适用于多分类任务。

② 训练和评估模型

        在①的基础上我们继续完善,在代码后段加上

# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 归一化处理
x_train, x_test = x_train / 255.0, x_test / 255.0

# 训练模型
model.fit(x_train.reshape(-1, 784), y_train, epochs=5, batch_size=32)

# 评估模型
test_loss, test_acc = model.evaluate(x_test.reshape(-1, 784), y_test)
print("测试准确率:", test_acc)

样例输出:

Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.8847 - loss: 0.4228     
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.9654 - loss: 0.1196  
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.9759 - loss: 0.0803  
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 2s 1ms/step - accuracy: 0.9821 - loss: 0.0578  
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.9875 - loss: 0.0413  
313/313 ━━━━━━━━━━━━━━━━━━━━ 0s 947us/step - accuracy: 0.9719 - loss: 0.0877
测试准确率: 0.9761000275611877

③ 使用 TensorFlow 进行预测

        在②的基础上继续完善,记得先引入numpy库

import numpy as np

# 取测试集中第一张图片并进行预测
sample = x_test[0].reshape(1, 784)  
predictions = model.predict(sample)

# 输出预测结果
print("预测类别:", np.argmax(predictions))

样例输出:

1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
预测类别: 7