繁体   English   中英

运行 train.py 文件时训练过程中出现 StopIteration Error

[英]StopIteration Error occurs during training while running the train.py file

我正在尝试运行来自 github 的代码。该文件名为 train.py。 它应该运行一个神经网络来训练数据集。 但是,我收到以下错误

(QGN) ubuntu@ip-172-31-13-114:~/QGN$ python train.py
Input arguments:
id               ade20k
arch_encoder     resnet50
arch_decoder     QGN_dense_resnet34
weights_encoder
weights_decoder
fc_dim           2048
list_train       ./data/train_ade20k.odgt
list_val         ./data/validation_ade20k.odgt
root_dataset     ./data/
num_gpus         0
batch_size_per_gpu 2
num_epoch        20
start_epoch      1
epoch_iters      5000
optim            SGD
lr_encoder       0.02
lr_decoder       0.02
lr_pow           0.9
beta1            0.9
weight_decay     0.0001
deep_sup_scale   1.0
prop_weight      2.0
enhance_weight   2.0
fix_bn           0
num_val          500
num_class        150
transform_dict   None
workers          40
imgSize          [300, 375, 450, 525, 600]
imgMaxSize       1000
cropSize         0
padding_constant 32
random_flip      True
seed             1337
ckpt             ./ckpt
disp_iter        20
visualize        False
result           ./result
gpu_id           0
Model ID: ade20k-resnet50-QGN_dense_resnet34-batchSize0-LR_encoder0.02-LR_decoder0.02-epoch20-lossScale1.0-classScale2.0
# samples: 20210
1 Epoch = 5000 iters
Starting Training!
Traceback (most recent call last):
  File "train.py", line 355, in <module>
    main(args)
  File "train.py", line 217, in main
    train(segmentation_module, iterator_train, optimizers, history, epoch, args)
  File "train.py", line 33, in train
    batch_data = next(iterator)
  File "/home/ubuntu/QGN/lib/utils/data/dataloader.py", line 274, in __next__
    raise StopIteration
StopIteration
Segmentation fault (core dumped)

来自 train.py 的代码(第 211 到 231 行)如下 '''

主循环

history = {'train': {'epoch': [], 'loss': [], 'acc': []}}

print('Starting Training!')

for epoch in range(args.start_epoch, args.num_epoch + 1):
    train(segmentation_module, iterator_train, optimizers, history, epoch, args)

    # checkpointing
    checkpoint(nets, history, args, epoch)

    # evaluation
    args.weights_encoder = os.path.join(args.ckpt, 'encoder_epoch_' + str(epoch) + '.pth')
    args.weights_decoder = os.path.join(args.ckpt, 'decoder_epoch_' + str(epoch) + '.pth')
    iou = eval_train(args)

    # adaptive class weighting
    adjust_crit_weights(segmentation_module, iou, args)


print('Training Done!')

'''

我不确定我是否已经分享了所有必需的信息。 如果可以提供 ant 帮助解决此问题,我将不胜感激。 只是通知一下,我尝试使用链接https://github.com/amdegroot/ssd.pytorch/issues/214上 github 上共享的 try and except 方法。 但是错误仍然存在。

train.py中第30行的代码如下

   # main loop
    tic = time.time()
    for i in range(args.epoch_iters):
        batch_data = next(iterator)
        data_time.update(time.time() - tic)

        segmentation_module.zero_grad()

我将上面的代码修改如下

   # main loop
     loader_train = torchdata.DataLoader(
        dataset_train,
        batch_size=args.num_gpus,  # we have modified data_parallel
        shuffle=False,  # we do not use this param
        collate_fn=user_scattered_collate,num_workers=int(args.workers),
        drop_last=True,
        pin_memory=True)


    tic = time.time()
    for i in range(args.epoch_iters):
        try:
            batch_data = next(iterator)
        except StopIteration:
            iterator = iter(loader_train)
            batch_data = next(iterator)
        data_time.update(time.time() - tic)

        segmentation_module.zero_grad()

但还是没有喜悦。 错误仍然存在。

长话短说
您的args.epoch_iters大于 loader_train 中的批loader_train Python 当您请求比实际更多的批次时引发StopIteration错误。

当您遍历某些 pythonic 元素集合(例如,列表、元组、 DataLoader ...)时,python 需要知道它何时到达该集合的末尾。 它是通过引发StopIteration异常来完成的。 python 中for循环显式侦听此异常并使用它来知道何时停止。 las,在您的代码中,您没有在loader_train上使用for循环,而是在range(args.epoch_iter)上使用循环,并且您使用next(iterator)来获取批次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM