Bootstrap

Python精选200Tips:116-120

目前最流行的

运行系统: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**
开发公司/组织 Google Facebook 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)<
;