FaceNet三元组损失迁移学习报错:无法将160大小数组重塑为(3)形状
解决FaceNet Triplet Loss训练中的Reshape错误
错误根源分析
你遇到的ValueError: cannot reshape array of size 160 into shape (3)核心原因很明确:Triplet Loss的训练逻辑要求每一批样本的总数必须是3的倍数——毕竟每个训练单元是一组三元组(Anchor/Positive/Negative)。
看你设置的批次参数:--people_per_batch 80 --images_per_person 2,计算下来单批次样本数是80*2=160,160无法被3整除,代码尝试把160个样本reshape成每组3个的结构时自然会触发错误。
具体解决步骤
1. 调整批次参数,确保总样本数是3的倍数
修改people_per_batch和images_per_person的组合,让两者的乘积能被3整除:
- 比如改成
--people_per_batch 78 --images_per_person 2:78×2=156,156÷3=52,刚好可以分成52组三元组 - 或者
--people_per_batch 60 --images_per_person 3:60×3=180,180÷3=60,也满足要求 - 核心原则:
people_per_batch × images_per_person的结果必须是3的正整数倍
2. 修正命令中的参数格式错误
你的训练命令里有几处空格问题,会导致参数无法被正确解析:
- 错误写法:
-- learning_rate 0.01、-- pretrained_model ... - 修正后:
--learning_rate 0.01、--pretrained_model ~/lab/experiments/facenet/model/20170512-110547/model-20170512-110547.ckpt-250000
(注意--和参数名之间不能有空格)
3. 处理数据集总样本数的余数问题
你的LFW数据集共有3356张图,3356÷3=1118余2,这意味着训练到最后一批时会剩下2张图,同样会触发reshape错误。可以选一种方式处理:
- 手动补充1张图(比如复制任意一张已对齐的图像),让总样本数变成3357(3的倍数)
- 修改
train_tripletloss.py的代码逻辑,在采样时跳过最后一批不足3个样本的情况,或者自动调整最后一批的采样数量
验证修改后的命令示例
修正后的完整训练命令可以是:
python src/train_tripletloss.py --logs_base_dir ~/lab/experiments/facenet/logs/facenet/ --models_base_dir ~/lab/experiments/facenet/models/facenet/ --data_dir ~/lab/experiments/noise_lfw_30_mtcnnalign_182_160 --image_size 160 --model_def models.inception_resnet_v1 --weight_decay 1e-4 --optimizer RMSPROP --learning_rate 0.01 --keep_probability 0.8 --random_crop --random_flip --pretrained_model ~/lab/experiments/facenet/model/20170512-110547/model-20170512-110547.ckpt-250000 --people_per_batch 78 --images_per_person 2 --gpu_memory_fraction 0.15
内容的提问来源于stack exchange,提问作者maguro
相关产品推荐
相关产品推荐

