PaddleClas icon indicating copy to clipboard operation
PaddleClas copied to clipboard

如果训练的时间不长,预测的时候会报错

Open KyleWang-Hunter opened this issue 2 years ago • 17 comments

"python/postprocess.py", line 100, in call\n label_name_list.append(self.class_id_map[i.item()])\nKeyError: 922\n'",

KyleWang-Hunter avatar Apr 28 '22 05:04 KyleWang-Hunter

这个看着像是label_list的文件给的不对,不是训练的问题

weisy11 avatar Apr 29 '22 08:04 weisy11

这个看着像是label_list的文件给的不对,不是训练的问题

是对的哦,我如果训练久一点就不会报这个错,这个看起来是1000分类的问题,因为我的分类个数没有1000个,模型在预测的时候预测为922类,但是我的配置文件根本就没有这么多类,所以找不到922属于哪个类别,就报错。另外,我在训练的时候指定了分类个数,为什么生成的模型还是1000分类的,是我哪里配置错误了吗?

KyleWang-Hunter avatar Apr 29 '22 08:04 KyleWang-Hunter

有可能,可以发一下配置文件看看

weisy11 avatar May 05 '22 02:05 weisy11

有可能,可以发一下配置文件看看

你好,这是我训练模型的配置 train_dict = { 'Global': { 'checkpoints': None, 'pretrained_model': 'pretrain_models/ResNet50_vd_pretrained', 'output_dir': 'trained_models', 'device': 'cpu', 'class_num': 12, 'save_interval': 5, 'eval_during_train': True, 'eval_interval': 1, 'epochs': 5, 'print_batch_step': 10, 'use_visualdl': False, 'image_shape': [3, 224, 224], 'save_inference_dir': 'infer' }, 'Arch': { 'name': 'ResNet50_vd', }, 'Loss': { 'Train': [{ 'CELoss': { 'weight': 1.0 } }], 'Eval': [{ 'CELoss': { 'weight': 1.0 } }] }, 'Optimizer': { 'name': 'Momentum', 'momentum': 0.9, 'lr': { 'name': 'Cosine', 'learning_rate': 0.0125, # 'warmup_epoch': 3 }, 'regularizer': { 'name': 'L2', 'coeff': 1e-05 } }, 'DataLoader': { 'Train': { 'dataset': { 'name': 'ImageNetDataset', 'image_root': 'data', 'cls_label_path': 'data', 'transform_ops': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'RandCropImage': { 'size': 224 } }, { 'RandFlipImage': { 'flip_code': 1 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }] }, 'sampler': { 'name': 'DistributedBatchSampler', 'batch_size': 16, 'drop_last': False, 'shuffle': True }, 'loader': { 'num_workers': 1, 'use_shared_memory': True } }, 'Eval': { 'dataset': { 'name': 'ImageNetDataset', 'image_root': 'data', 'cls_label_path': 'data', 'transform_ops': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'ResizeImage': { 'resize_short': 256 } }, { 'CropImage': { 'size': 224 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }] }, 'sampler': { 'name': 'DistributedBatchSampler', 'batch_size': 64, 'drop_last': False, 'shuffle': False }, 'loader': { 'num_workers': 1, 'use_shared_memory': True } } }, 'Infer': { 'infer_imgs': 'data/test/test1.jpg', 'batch_size': 10, 'transforms': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'ResizeImage': { 'resize_short': 256 } }, { 'CropImage': { 'size': 224 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }, { 'ToCHWImage': None }], 'PostProcess': { 'name': 'Topk', 'topk': 5, 'class_id_map_file': 'data/label_list.txt' } }, 'Metric': { 'Train': [{ 'TopkAcc': { 'topk': [1, 5] } }], 'Eval': [{ 'TopkAcc': { 'topk': [1, 5] } }] }, 'profiler_options': None }

KyleWang-Hunter avatar May 05 '22 02:05 KyleWang-Hunter

class_num的配置不对,要在Arch里面设置 https://github.com/PaddlePaddle/PaddleClas/blob/8765dadfbbfdec5fb9d3ee0dd43490848e6cb006/ppcls/configs/ImageNet/AlexNet/AlexNet.yaml#L20

weisy11 avatar May 05 '22 02:05 weisy11

class_num的配置不对,要在Arch里面设置

https://github.com/PaddlePaddle/PaddleClas/blob/8765dadfbbfdec5fb9d3ee0dd43490848e6cb006/ppcls/configs/ImageNet/AlexNet/AlexNet.yaml#L20

Arch里面设置也试过,但是还是报这个错,是不是有'pretrained_model'参数的原因呢?看不懂源码,所以只能来这里提问了。

KyleWang-Hunter avatar May 05 '22 02:05 KyleWang-Hunter

class_num的配置不对,要在Arch里面设置 https://github.com/PaddlePaddle/PaddleClas/blob/8765dadfbbfdec5fb9d3ee0dd43490848e6cb006/ppcls/configs/ImageNet/AlexNet/AlexNet.yaml#L20

Arch里面设置也试过,但是还是报这个错,是不是有'pretrained_model'参数的原因呢?看不懂源码,所以只能来这里提问了。

你的训练跟预测都在Arch里这样设置过吗?这个跟pretrained_model没有关系。 你可以试试直接用训练时间短的模型,预测时在Arch里加上这个参数,看看还有没有报错

weisy11 avatar May 05 '22 03:05 weisy11

class_num的配置不对,要在Arch里面设置 https://github.com/PaddlePaddle/PaddleClas/blob/8765dadfbbfdec5fb9d3ee0dd43490848e6cb006/ppcls/configs/ImageNet/AlexNet/AlexNet.yaml#L20

Arch里面设置也试过,但是还是报这个错,是不是有'pretrained_model'参数的原因呢?看不懂源码,所以只能来这里提问了。

你的训练跟预测都在Arch里这样设置过吗?这个跟pretrained_model没有关系。 你可以试试直接用训练时间短的模型,预测时在Arch里加上这个参数,看看还有没有报错

还是不行,我在train,export_model和infer的配置文件都在arch下配置了class_num参数,照样报这个错。并且如果训练的类别数小于5,配置文件中的
Metric: Train: - TopkAcc: topk: [1, 5] 这里还会报错 input of topk op must have >= 5 columns in axis of 1。 照理说类别的多少不同,训练出来的模型大小应该也不同吧,但是不管多少个类别的数据,训练出来的模型大小都是一致的,所以,怀疑参数没生效,训练出来的模型还是1000分类的模型。

KyleWang-Hunter avatar May 05 '22 03:05 KyleWang-Hunter

还是不行,我在train,export_model和infer的配置文件都在arch下配置了class_num参数,照样报这个错。并且如果训练的类别数小于5,配置文件中的 Metric: Train: - TopkAcc: topk: [1, 5] 这里还会报错 input of topk op must have >= 5 columns in axis of 1。 照理说类别的多少不同,训练出来的模型大小应该也不同吧,但是不管多少个类别的数据,训练出来的模型大小都是一致的,所以,怀疑参数没生效,训练出来的模型还是1000分类的模型。

麻烦传一个yaml文件,我定位一下问题。 btw,你现在用的是哪个分支的代码呢?是拉取的最新代码没错吧?

weisy11 avatar May 05 '22 03:05 weisy11

还是不行,我在train,export_model和infer的配置文件都在arch下配置了class_num参数,照样报这个错。并且如果训练的类别数小于5,配置文件中的 Metric: Train: - TopkAcc: topk: [1, 5] 这里还会报错 input of topk op must have >= 5 columns in axis of 1。 照理说类别的多少不同,训练出来的模型大小应该也不同吧,但是不管多少个类别的数据,训练出来的模型大小都是一致的,所以,怀疑参数没生效,训练出来的模型还是1000分类的模型。

麻烦传一个yaml文件,我定位一下问题。 btw,你现在用的是哪个分支的代码呢?是拉取的最新代码没错吧?

模型训练部分的参数配置

train_dict = { 'Global': { 'checkpoints': None, 'pretrained_model': 'pretrain_models/ResNet50_vd_pretrained', 'output_dir': 'trained_models', 'device': 'cpu', 'save_interval': 5, 'eval_during_train': True, 'eval_interval': 1, 'epochs': 5, 'print_batch_step': 10, 'use_visualdl': False, 'image_shape': [3, 224, 224], 'save_inference_dir': 'infer' }, 'Arch': { 'name': 'ResNet50_vd', 'class_num': 2 }, 'Loss': { 'Train': [{ 'CELoss': { 'weight': 1.0 } }], 'Eval': [{ 'CELoss': { 'weight': 1.0 } }] }, 'Optimizer': { 'name': 'Momentum', 'momentum': 0.9, 'lr': { 'name': 'Cosine', 'learning_rate': 0.0125, # 'warmup_epoch': 3 }, 'regularizer': { 'name': 'L2', 'coeff': 1e-05 } }, 'DataLoader': { 'Train': { 'dataset': { 'name': 'ImageNetDataset', 'image_root': 'data', 'cls_label_path': 'data', 'transform_ops': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'RandCropImage': { 'size': 224 } }, { 'RandFlipImage': { 'flip_code': 1 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }] }, 'sampler': { 'name': 'DistributedBatchSampler', 'batch_size': 16, 'drop_last': False, 'shuffle': True }, 'loader': { 'num_workers': 1, 'use_shared_memory': True } }, 'Eval': { 'dataset': { 'name': 'ImageNetDataset', 'image_root': 'data', 'cls_label_path': 'data', 'transform_ops': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'ResizeImage': { 'resize_short': 256 } }, { 'CropImage': { 'size': 224 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }] }, 'sampler': { 'name': 'DistributedBatchSampler', 'batch_size': 64, 'drop_last': False, 'shuffle': False }, 'loader': { 'num_workers': 1, 'use_shared_memory': True } } }, 'Infer': { 'infer_imgs': 'data/test/booklet.jpg', 'batch_size': 10, 'transforms': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'ResizeImage': { 'resize_short': 256 } }, { 'CropImage': { 'size': 224 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }, { 'ToCHWImage': None }], 'PostProcess': { 'name': 'Topk', 'topk': 5, 'class_id_map_file': 'data/label_list.txt' } }, 'Metric': { 'Train': [{ 'TopkAcc': { 'topk': [1, 5] } }], 'Eval': [{ 'TopkAcc': { 'topk': [1, 5] } }] }, 'profiler_options': None }

export_dict = { 'Global': { 'checkpoints': None, 'pretrained_model': 'trained_models', 'output_dir': 'output', 'device': 'cpu', 'save_interval': 1, 'eval_during_train': True, 'eval_interval': 1, 'epochs': 20, 'print_batch_step': 10, 'use_visualdl': False, 'image_shape': [3, 224, 224], 'save_inference_dir': 'infer' }, 'Arch': { 'name': 'ResNet50_vd', 'class_num': 2 }, 'Loss': { 'Train': [{ 'CELoss': { 'weight': 1.0 } }], 'Eval': [{ 'CELoss': { 'weight': 1.0 } }] }, 'Optimizer': { 'name': 'Momentum', 'momentum': 0.9, 'lr': { 'name': 'Cosine', 'learning_rate': 0.0125, 'warmup_epoch': 5 }, 'regularizer': { 'name': 'L2', 'coeff': 1e-05 } }, 'DataLoader': { 'Train': { 'dataset': { 'name': 'ImageNetDataset', 'image_root': 'data/train', 'cls_label_path': 'data/train_list.txt', 'transform_ops': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'RandCropImage': { 'size': 224 } }, { 'RandFlipImage': { 'flip_code': 1 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }] }, 'sampler': { 'name': 'DistributedBatchSampler', 'batch_size': 64, 'drop_last': False, 'shuffle': True }, 'loader': { 'num_workers': 1, 'use_shared_memory': True } }, 'Eval': { 'dataset': { 'name': 'ImageNetDataset', 'image_root': 'data/train', 'cls_label_path': 'data/val_list.txt', 'transform_ops': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'ResizeImage': { 'resize_short': 256 } }, { 'CropImage': { 'size': 224 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }] }, 'sampler': { 'name': 'DistributedBatchSampler', 'batch_size': 64, 'drop_last': False, 'shuffle': False }, 'loader': { 'num_workers': 1, 'use_shared_memory': True } } }, 'Infer': { 'infer_imgs': 'docs/images/whl/booklet.jpg', 'batch_size': 10, 'transforms': [{ 'DecodeImage': { 'to_rgb': True, 'channel_first': False } }, { 'ResizeImage': { 'resize_short': 256 } }, { 'CropImage': { 'size': 224 } }, { 'NormalizeImage': { 'scale': '1.0/255.0', 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '' } }, { 'ToCHWImage': None }], 'PostProcess': { 'name': 'Topk', 'topk': 5, 'class_id_map_file': 'data/label_list.txt' } }, 'Metric': { 'Train': [{ 'TopkAcc': { 'topk': [1, 5] } }], 'Eval': [{ 'TopkAcc': { 'topk': [1, 5] } }] } }

模型预测部分的参数配置

infer_dict = { 'Global': { 'infer_imgs': './images/', 'inference_model_dir': 'infer', 'batch_size': 1, 'use_gpu': False, 'enable_mkldnn': False, 'cpu_num_threads': 10, 'enable_benchmark': True, 'use_fp16': False, 'ir_optim': True, 'use_tensorrt': False, 'gpu_mem': 8000, 'enable_profile': False }, 'Arch': { 'name': 'ResNet50_vd', 'class_num': 2 }, 'PreProcess': { 'transform_ops': [{ 'ResizeImage': { 'resize_short': 256 } }, { 'CropImage': { 'size': 224 } }, { 'NormalizeImage': { 'scale': 0.00392157, 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225], 'order': '', 'channel_num': 3 } }, { 'ToCHWImage': None }] }, 'PostProcess': { 'main_indicator': 'Topk', 'Topk': { 'topk': 1, 'class_id_map_file': 'data' }, 'SavePreLabel': { 'save_dir': './pre_label/' } } }

KyleWang-Hunter avatar May 05 '22 04:05 KyleWang-Hunter

你好,你可以直接传一个yaml文件吗?这样方便复现。这个dict并不是paddleclas现有的部署方式。

weisy11 avatar May 05 '22 08:05 weisy11

另外,在训练过程中的eval阶段,如果验证数据集小于配置文件中设置的batch_size参数,那么会直接报错,错误如下: image

我的配置文件如下: image

我的验证集总共有20张图像

KyleWang-Hunter avatar May 05 '22 08:05 KyleWang-Hunter

另外,在训练过程中的eval阶段,如果验证数据集小于配置文件中设置的batch_size参数,那么会直接报错,错误如下: image

我的配置文件如下: image

我的验证集总共有20张图像

哦,如果验证集比较小可以把batchsize调小 上面class_num这个问题我验证一下

weisy11 avatar May 05 '22 09:05 weisy11

我用你提供的配置文件,没有能复现你的问题。修改class_num,导出的文件大小是不同的,当class_num设置为2时,模型大小约为94MB,当class_num为1000时,模型大小约为102MB。可以看出参数设置是有影响的。 当class_num为2且加载预训练模型时,会报warning: image 可以看出,加载的时候,由于shape不同,最后一个fc层的参数加载失败了。另外,这个模型经过10个iter左右的训练,也是可以正常预测的。 建议你用PaddleClas最新的release/2.3的代码,用你的配置文件调试一下试试看。如果确认没有错误,再比较一下跟本地代码有什么差别。

weisy11 avatar May 05 '22 11:05 weisy11

拉取了最新的代码,问题解决了,谢谢。再请问一个问题,paddleclas支持earlystopping吗?

KyleWang-Hunter avatar May 07 '22 07:05 KyleWang-Hunter

拉取了最新的代码,问题解决了,谢谢。再请问一个问题,paddleclas支持earlystopping吗?

1.early stop可以直接手动停 2.PaddleClas训练时会保存best_model,对应eval指标最高的epoch

weisy11 avatar May 09 '22 03:05 weisy11