写给新人的深度学习扫盲贴:TensorFlow与Keras
一、TensorFlow与Keras简介
简单来讲,TensorFlow与Keras同属于人工智能下的深度学习框架,并且在发展过程中,它们居然走到了一起,让人不禁慨叹,技术无国界,技术是未来。
1.1 TensorFlow:工业级深度学习引擎
诞生背景:2015年,Google Brain团队开源了TensorFlow,旨在为学术界和工业界提供统一的机器学习平台。其名称“TensorFlow”源于“张量(Tensor)”和“数据流(Flow)”,体现了其核心设计理念:通过数据流图进行多维数组(张量)的计算。
优势:
- 灵活性与可扩展性:支持从移动端到分布式集群的部署(如TensorFlow Lite、TensorFlow Serving)。
- 生态系统完善:提供可视化工具(TensorBoard)、预训练模型库(TensorFlow Hub)和社区支持。
- 跨平台兼容性:可在CPU、GPU、TPU等硬件上运行,并支持多种编程语言接口。
1.2 Keras:深度学习的高级接口
设计哲学:Keras由法国人François Chollet于2015年创建,目标是“让深度学习像搭积木一样简单”。其API设计遵循“用户友好、模块化、易扩展”的原则,尤其适合快速原型开发。
与TensorFlow的融合:自TensorFlow 2.0起,Keras被整合为tf.keras
,成为官方推荐的高级API。这种集成既保留了Keras的简洁性,又结合了TensorFlow的底层优化能力。
1.3 两者关系:互补而非对立
- Keras是TensorFlow的“快捷方式”:通过
tf.keras
,可以用更少的代码实现复杂模型,例如只需几行代码即可构建卷积神经网络。 - TensorFlow是Keras的“强力引擎”:Keras依赖TensorFlow等后端进行计算加速,同时TensorFlow的底层API(如自动微分、分布式训练)为Keras提供了性能保障。
二、了解核心组件
2.1 张量(Tensor):数据的基本单位
张量是多维数组的泛化形式。例如:
- 标量(0维):单个数字(如
5
) - 向量(1维):一列数字(如
[1, 2, 3]
) - 矩阵(2维):表格数据(如
[[1,2], [3,4]]
) - 高维张量:图像数据(3维:高度×宽度×通道)或视频数据(4维)。
2.2 层(Layer):模型的构建块
层是神经网络的基本单元,常见类型包括:
- 全连接层(Dense):每个神经元与上一层全部连接,用于特征组合。
- 卷积层(Conv2D):通过滤波器提取空间特征,适合图像处理。
- 循环层(LSTM/GRU):处理序列数据(如文本、时间序列),具有记忆功能。
2.3 模型(Model):层的组合
模型是层的定向无环图(DAG)。Keras提供两种构建方式:
- 顺序模型(Sequential):层的线性堆叠,适合简单结构。
- 函数式API:支持多输入/输出、共享层等复杂拓扑。
三、TensorFlow与Keras的安装
3.1 推荐使用虚拟环境
使用conda
或venv
创建隔离环境,避免依赖冲突:
# 使用conda
conda create -n tf_env python=3.8
conda activate tf_env # 使用venv
python -m venv tf_env
source tf_env/bin/activate # Linux/macOS
tf_env\Scripts\activate # Windows
本人在当前笔记本使用后者。
3.2 安装TensorFlow与Keras
通过pip一键安装最新稳定版(包含Keras):
pip install tensorflow
GPU加速支持
若使用NVIDIA显卡,安装GPU版本以提升训练速度:
pip install tensorflow[and-cuda]
安装独立版Keras(可选)
Keras已默认集成在TensorFlow中(tf.keras)。如需安装独立版本:
pip install keras
3.3 验证安装
执行python语句, 本人此系列文章使用jupyter notebook。
import tensorflow as tf
print("TensorFlow版本:", tf.__version__)
print("GPU是否可用:", tf.config.list_physical_devices('GPU'))
3.4 Hello world
构建一个简单的全连接网络,测试环境是否正常工作:
import tensorflow as tf # 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 归一化 # 构建模型
model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax')
]) # 编译与训练
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5) # 评估
test_loss, test_acc = model.evaluate(x_test, y_test)
print("测试集准确率:", test_acc)
执行结果如下:
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 128s 11us/stepEpoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.8739 - loss: 0.4405
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9638 - loss: 0.1219
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.9769 - loss: 0.0780
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.9828 - loss: 0.0561
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.9870 - loss: 0.0419
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 4ms/step - accuracy: 0.9696 - loss: 0.0964
测试集准确率: 0.9740999937057495