使用Python学习AI知识中踩过的坑

搞了一阵子Python这玩意儿用起来是爽,但坑也不少。以下分六个类别来介绍,都是血泪教训,今天给大家分享一下。

一、环境配置

1. Python版本坑

# 坑:Python 2和Python 3不兼容
# print "hello"  # Python 2能跑,Python 3报错
print("hello")    # 都得这样写

# 解决方案:
# 无脑用Python 最新版本,别用老的
# 用anaconda管理环境,省心

2. 包依赖地狱

# 你以为:
pip install tensorflow

# 实际可能:
ERROR: Could not find a version that satisfies the requirement tensorflow
ERROR: No matching distribution found for tensorflow

# 真实原因:
# Python版本不对
# 操作系统不对
# 没装VS Build Tools(Windows)

避坑指南:

  • 用conda安装:conda install tensorflow
  • 或者指定版本:pip install tensorflow==2.20.0
  • 看官方文档的系统要求,别想当然

3. CUDA和cuDNN的玄学问题

# 跑个GPU加速,结果:
import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
# 输出:[]  # 空的!GPU呢?

# 可能原因:
# 1. CUDA版本和TensorFlow版本不匹配
# 2. cuDNN没装对
# 3. 显卡驱动太老

解决方案:

  • 去NVIDIA官网查兼容矩阵
  • TensorFlow官网也有版本对应表
  • 嫌麻烦就用Google Colab,人家的环境配好了

二、数据处理

1. 内存爆炸

import pandas as pd
import numpy as np

# 作死操作:
data = pd.read_csv('10GB的数据.csv')  # 内存直接爆
big_array = np.ones((100000, 100000))  # 80GB内存,买得起吗?

# 正确做法:
# 1. 分块读取
chunks = pd.read_csv('big_data.csv', chunksize=10000)
for chunk in chunks:
    process(chunk)

# 2. 指定数据类型
dtypes = {'id': 'int32', 'price': 'float32'}
df = pd.read_csv('data.csv', dtype=dtypes)

# 3. 用h5py或feather格式
import h5py
with h5py.File('data.h5', 'r') as f:
    data = f['dataset'][:]

2. 数据泄露(Data Leakage)

# 新手常犯:
from sklearn.preprocessing import StandardScaler

# 错误:先标准化再划分
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # 用了全部数据!
X_train, X_test = train_test_split(X_scaled, test_size=0.2)  # 泄露了!

# 正确:先划分再标准化
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # 只用训练集
X_test_scaled = scaler.transform(X_test)        # 用训练集的参数

3. 类别不平衡

# 1000个样本,990个A类,10个B类
# 模型全预测A,准确率99%,看似牛逼,其实垃圾

# 解决方法:
# 1. 重采样
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)

# 2. 调整类别权重
model = RandomForestClassifier(class_weight='balanced')

# 3. 用合适的评估指标
# 别只看准确率,看F1-score、AUC-ROC

三、模型训练

1. 过拟合而不自知

# 训练集准确率:99.9%
# 测试集准确率:60.2%
# 问题:模型只会背答案,不会举一反三

# 如何发现:
# 1. 学习曲线:训练误差和验证误差差距大
# 2. 早停(Early Stopping)
from tensorflow.keras.callbacks import EarlyStopping
early_stop = EarlyStopping(monitor='val_loss', patience=5)

# 预防措施:
# 1. 正则化(L1/L2)
# 2. Dropout
# 3. 数据增强
# 4. 简化模型

2. 超参数乱调

# 错误:瞎调参数
params = {
    'learning_rate': [0.1, 0.01, 0.001, 0.0001, 0.00001],
    'batch_size': [16, 32, 64, 128, 256, 512],
    'hidden_layers': [1, 2, 3, 4, 5, 6, 7, 8]
}
# 这得跑多少天?

# 正确做法:
# 1. 先用默认参数跑基线
# 2. 一次只调1-2个最重要的参数
# 3. 用网格搜索或随机搜索
from sklearn.model_selection import RandomizedSearchCV

3. 训练不稳定

# 损失函数上下跳动,像心电图
# 可能原因:
# 1. 学习率太大
# 2. 数据没打乱
# 3. 批次大小太小

# 解决方案:
# 1. 学习率衰减
# 2. 梯度裁剪
# 3. 批量归一化

四、部署上线

1. 环境不一致

# 本地跑的飞起,服务器上就报错
# 经典错误:ModuleNotFoundError: No module named 'xxx'

# 解决方案:
# 1. 用Docker打包整个环境
# 2. 导出requirements.txt
pip freeze > requirements.txt
# 3. 用虚拟环境
python -m venv venv

2. 推理速度慢

# 训练用GPU,推理用CPU
# 一张图推理要10秒,用户早跑了

# 优化方案:
# 1. 模型量化(FP32 -> INT8)
# 2. 模型剪枝
# 3. 用ONNX转换
# 4. 缓存结果

3. 内存泄漏

# 服务跑着跑着内存满了
# 常见原因:
# 1. 全局变量越积越多
# 2. 没及时清理缓存

import gc

# 定期清理
def process_request(data):
    result = model.predict(data)
    del data  # 及时删除
    gc.collect()  # 强制垃圾回收
    return result

五、工具使用

1. Jupyter Notebook的坑

# 坑1:变量状态不清
# 上上个cell改了变量,现在cell结果不对

# 坑2:内存累积
# 跑了很久,内存爆了,得重启kernel

# 坑3:版本管理难
# .ipynb文件diff看不明白

# 建议:
# 1. 经常重启kernel
# 2. 用%xdel删除大变量
# 3. 转成.py文件再用git

2. 不看文档瞎搞

# 典型:Stack Overflow复制粘贴
# 别人的代码用了新版API,你的版本旧

# 正确做法:
# 1. 先看官方文档(读最新版)
# 2. 看函数签名:help(tf.keras.layers.Dense)
# 3. 看源码:按住Ctrl点函数名(VSCode)

3. 不会调试

# 就知道print,满屏日志

# 更好的方法:
import pdb

def complex_function(x):
    pdb.set_trace()  # 在这里断点
    result = x * 2
    return result

# 或者用IDE调试器(VSCode、PyCharm)

六、心态

1. 盲目追新

# 听说新模型SOTA,立马换
# 结果:环境不兼容,代码全要改
# 建议:先用稳定版,等别人踩完坑

2. 不测试

# 改了个bug,引出三个新bug
# 解决方案:
import unittest

class TestModel(unittest.TestCase):
    def test_prediction_shape(self):
        input_data = np.random.randn(10, 224, 224, 3)
        output = model.predict(input_data)
        self.assertEqual(output.shape, (10, 1000))

3. 不记录

# 调了三天参数,忘了哪个最好
# 用这些工具:
# 1. MLflow
# 2. Weights & Biases
# 3. 至少写个txt记录

AI项目不是写一次就完事的,是个持续迭代的过程。代码要写干净,注释要写好,实验要记录。遇到问题先搜GitHub Issues,大概率有人遇到过。

跑通一个简单但完整的流程,比搞一半的复杂项目有用得多。先做出能用的东西,再慢慢优化。

建议买个好点的GPU,或用云服务器,别浪费时间。

posted @ 2025-12-09 14:19  深圳蔓延科技有限公司  阅读(1)  评论(0)    收藏  举报