转换Pandas DataFrame为FastAI表格数据加载器后训练报错:张量尺寸不匹配
问题分析与解决方案
可能的原因及修复步骤
1. 检查目标变量的维度与类型
- 确保目标变量是单维度:回归任务应为单个数值列,分类任务应为单个类别列。执行
print(df[target_col].shape)验证,结果应为(n_samples,),而非(n_samples, k)。 - 分类任务需确认目标列是类别型(
dtype='category'),FastAI会自动生成单维度标签;回归任务确保目标列为数值型。
2. 验证TabularDataLoaders构建参数
- 检查
y_names参数:仅传入单个目标列名,不要传多列列表(默认tabular learner不支持多任务)。 - 确认
procs处理逻辑:避免将目标列误加入Categorify或Normalize的处理队列,防止目标列被错误转换。
3. 排查Learner初始化问题
- 回归任务需确认
y_range参数设置合理,避免与目标变量实际范围偏差过大导致输出张量异常。 - 匹配任务与metrics:分类任务用
accuracy,回归任务用rmse,错误的指标会引发维度不匹配。
4. 检查模型输出层与批量尺寸
- 查看数据加载器批量大小:
print(dls.batch_size),默认是64。报错中张量a(6400)、张量b(64)的差异,大概率是模型输出层神经元数量错误(比如分类任务类别数设错,或回归任务误设为多输出)。 - 若自定义了模型,检查输出层维度是否与目标变量匹配。
5. 修正代码示例参考
from fastai.tabular.all import * # 加载数据 df = pd.read_csv('train_19.csv') # 构建数据加载器 dls = TabularDataLoaders.from_df(df, path='.', y_names='target', cat_names=['cat_col1', 'cat_col2'], cont_names=['cont_col1', 'cont_col2'], procs=[Categorify, FillMissing, Normalize]) # 构建learner(根据任务类型选择metrics) learn = tabular_learner(dls, metrics=rmse) # 回归任务用rmse,分类用accuracy # 重新执行lr_find learn.lr_find(start_lr=1e-05, end_lr=1e+05, num_it=100)
内容的提问来源于stack exchange,提问作者Kilaru Vasudeva
相关产品推荐
相关产品推荐

