Reach a higher level
目前最流行的
运行系统:macOS Sonoma 14.6.1
Python编译器:PyCharm 2024.1.4 (Community Edition)
Python版本:3.12
往期链接:
1-5 | 6-10 | 11-20 | 21-30 | 31-40 | 41-50 |
---|
51-60:函数 | 61-70:类 | 71-80:编程范式及设计模式 |
---|
81-90:Python编码规范 | 91-100:Python自带常用模块-1 |
---|
101-105:Python自带模块-2 | 106-110:Python自带模块-3 |
---|
111-115:Python常用第三方包-1 |
---|
本文只介绍每个包主要做什么及一些比较经典的示例。对于包的进一步学习,推荐参考对应包的官方文档。
116 深度学习框架
Python 深度学习框架,包括 TensorFlow、PyTorch、Keras、MXNet 、 Chainer以及国产的PaddlePaddle等,每个框架都有其独特的特性和优缺点,适合不同的应用场景。
框架 | TensorFlow** | PyTorch** | Keras | MXNet | Chainer | PaddlePaddle** |
---|---|---|---|---|---|---|
开发公司/组织 | François Chollet (TensorFlow 的高级 API) | Apache Software Foundation | Preferred Networks | 百度 | ||
API 风格 | 声明式与命令式结合 | 动态计算图(命令式) | 高级 API,易用性高 | 声明式与命令式结合 | 动态计算图 | 声明式与命令式结合 |
易用性 | 中等,学习曲线较陡峭 | 高,尤其适合研究者和开发者 | 非常高,适合快速原型设计 | 中等 | 高,灵活性强 | 中等,适合有一定基础的用户 |
模型训练 | 支持分布式训练 | 支持分布式训练 | 依赖于底层框架(如 TensorFlow 或 Theano) | 支持分布式训练 | 支持分布式训练 | 支持分布式训练 |
社区支持 | 强大的社区和文档 | 强大的社区和文档 | 良好的社区支持 | 较小的社区 | 较小的社区 | 正在快速增长,文档改善中 |
可视化工具 | TensorBoard | 可与 Matplotlib、TensorBoard 结合使用 | 依赖于 TensorFlow 的可视化工具 | 原生支持图形可视化 | 需要手动配置可视化 | 可视化工具如 PaddlePaddle Visualizer |
移动支持 | 良好(TensorFlow Lite | 有限,主要通过第三方库支持 | 依赖于底层框架 | 良好(MXNet Mobile) | 有限 | 良好(Paddle Lite) |
应用场景 | 适用于生产环境和大规模部署 | 适用于研究和快速试验 | 快速原型设计和小型项目 | 适用于大规模深度学习应用 | 适用于需要灵活性的项目 | 适用于各种应用场景,包括NLP和CV |
选择深度学习框架:
- 对于初学者,PyTorch 通常是不错的选择;
- 对于需要高性能和大规模部署的生产环境,TensorFlow 则更为合适。
- PaddlePaddle 是一个中文友好型的深度学习框架,并且在中文自然语言处理方面有优势。
示例:BP神经网络预测PM2.5
TensorFlow
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# 生成示例数据
np.random.seed(0)
X = np.random.rand(1000, 5) # 特征
y = np.random.rand(1000, 1) # PM2.5 值
# 数据归一化
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 定义模型
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(1) # 输出层
])
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=32)
# 预测
predictions = model.predict(X_test)
print(predictions)
Pytorch
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# 生成示例数据
np.random.seed(0)
X = np.random.rand(1000, 5).astype(np.float32) # 特征
y = np.random.rand(1000, 1).astype(np.float32) # PM2.5 值
# 数据归一化
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 转换为 PyTorch 张量
X_train_tensor = torch.tensor(X_train)
y_train_tensor = torch.tensor(y_train)
X_test_tensor = torch.tensor(X_test)
# 定义模型
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(5, 64)
self.fc2 = nn.Linear(64, 32)
self.fc3 = nn.Linear(32, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
model = SimpleNN()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters())
# 训练模型
for epoch in range(100):
model.train()
optimizer.zero_grad()
outputs = model(X_train_tensor)
loss = criterion(outputs, y_train_tensor)
loss.backward()
optimizer.step()
# 预测
model.eval()
with torch.no_grad():
predictions = model(X_test_tensor).numpy()
print(predictions)
PaddlePaddle
import numpy as np
import paddle
import paddle.nn as nn
import paddle.optimizer as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# 生成示例数据
np.random.seed(0)
X = np.random.rand(1000, 5).astype(np.float32) # 特征
y = np.random.rand(1000, 1).astype(np.float32) # PM2.5 值
# 数据归一化
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 转换为 PaddlePaddle 张量
X_train_tensor = paddle.to_tensor(X_train)
y_train_tensor = paddle.to_tensor(y_train)
X_test_tensor = paddle.to_tensor(X_test)
# 定义模型
class SimpleNN(nn.Layer):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(5, 64)
self.fc2 = nn.Linear(64, 32)
self.fc3 = nn.Linear(32, 1)
def forward(self, x):
x = paddle.nn.functional.relu(self.fc1(x))
x = paddle.nn.functional.relu(self.fc2(x)<