目录
2. 安装 GPU 版本(需要 CUDA 和 cuDNN 支持):
一、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
分析:
变量定义:
tf.Variable(2.0)
声明一个可训练变量,TensorFlow会自动跟踪其梯度。梯度记录:
tf.GradientTape()
会记录所有与变量x
相关的计算操作(如平方、乘法等)。梯度计算:
tape.gradient(y, x)
利用反向传播自动计算
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