第一次接触飞桨时,我最担心的就是环境配置。但实际用下来发现,飞桨的安装比想象中简单得多。这里分享几个新手容易踩的坑:首先确保你的Python版本在3.6到3.9之间(实测3.10会有兼容性问题),建议直接用Anaconda创建虚拟环境。
安装命令很简单:
bash复制python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
但有几个细节要注意:
python复制import paddle
paddle.utils.run_check()
我遇到过最常见的问题是权限报错,这时加上--user参数就能解决。另外提醒Mac用户,M1芯片需要安装特别版本。整个过程顺利的话5分钟就能搞定,比配其他框架环境省心多了。
飞桨内置的MNIST数据集简直是新手福音,几行代码就能搞定数据加载:
python复制from paddle.vision.datasets import MNIST
from paddle.vision.transforms import Normalize
transform = Normalize(mean=[127.5], std=[127.5])
train_data = MNIST(mode='train', transform=transform)
test_data = MNIST(mode='test', transform=transform)
但实际项目中,我们更多要处理自定义数据。这里分享一个实用技巧:用paddle.io.Dataset自定义数据集类。比如我最近做的一个票据识别项目,数据预处理可以这样写:
python复制class CustomDataset(paddle.io.Dataset):
def __init__(self, img_dir):
self.img_paths = [os.path.join(img_dir, f) for f in os.listdir(img_dir)]
def __getitem__(self, idx):
img = Image.open(self.img_paths[idx])
return self.transform(img), self.labels[idx]
飞桨提供了三种建模方式,新手建议从高层API开始:
python复制from paddle.vision.models import LeNet
model = LeNet(num_classes=10)
python复制model = paddle.nn.Sequential(
paddle.nn.Conv2D(1, 6, 3),
paddle.nn.ReLU(),
paddle.nn.MaxPool2D(2))
python复制class MyModel(paddle.nn.Layer):
def __init__(self):
super().__init__()
self.conv1 = paddle.nn.Conv2D(...)
def forward(self, x):
x = self.conv1(x)
return x
我个人的经验是:先用高层API快速验证想法,再逐步深入底层实现。飞桨的API设计非常Pythonic,很多命名和PyTorch类似,转换成本很低。
飞桨2.0的Model接口让训练变得异常简单:
python复制model = paddle.Model(MyModel())
model.prepare(
optimizer=paddle.optimizer.Adam(learning_rate=0.001),
loss=paddle.nn.CrossEntropyLoss(),
metrics=paddle.metric.Accuracy())
model.fit(train_data, epochs=5, batch_size=64, verbose=1)
但有几个参数新手容易忽略:
verbose=2可以显示进度条callbacks参数可以添加早停、学习率调整等策略paddle.callbacks.VisualDL可以实时可视化训练过程我遇到过最典型的问题:
paddle.amp.auto_cast开启混合精度训练一个实用的调试技巧:
python复制# 检查数据流是否正常
for batch in train_loader:
print(batch[0].shape, batch[1].shape)
break
飞桨支持多种保存格式:
python复制# 保存完整模型
model.save('complete_model')
# 只保存参数
paddle.save(model.state_dict(), 'params_only')
# 部署专用格式
paddle.jit.save(model, 'inference_model')
加载时要注意对应关系:
python复制# 加载完整模型
model = paddle.Model.load('complete_model')
# 加载参数
model.set_state_dict(paddle.load('params_only'))
这里分享一个完整的推理流程:
python复制# 加载部署模型
model = paddle.jit.load('inference_model')
# 预处理输入
img = preprocess('test.jpg')
img = paddle.to_tensor(img[np.newaxis, ...])
# 执行推理
pred = model(img)
label = paddle.argmax(pred)
在实际项目中,我通常会封装成Flask API:
python复制from flask import Flask, request
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
img = request.files['image'].read()
pred = model(preprocess(img))
return {'label': int(pred)}
飞桨的推理速度经过特别优化,在Intel CPU上跑MNIST推理,单次预测只需要3ms左右,完全能满足生产需求。