????????跑coco实例分割代码,报错一长串../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [164,0,0], thread: [31,0,0] Assertion input_val >= zero && input_val <= one报错,也没有其他提示信息,以下是我的两种解决方案。还有其他小报错:umpy/lib/function_base.py:334: VisibleDeprecationWarning: Creating an ndarray解决方案。
?
目录
????????在用服务器跑模型计算loss时,训练过程中报错,详细报错如下:Assertion?input_val >= zero && input_val <= one
?failed.和 RuntimeError: CUDA error: device-side assert triggered。
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [164,0,0], thread: [31,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [10,0,0], thread: [33,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [14,0,0], thread: [31,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [88,0,0], thread: [46,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [86,0,0], thread: [21,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [64,0,0], thread: [71,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [43,0,0], thread: [84,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [166,0,0], thread: [21,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [198,0,0], thread: [24,0,0] Assertion?input_val >= zero && input_val <= one
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [144,0,0], thread: [57,0,0]
Assertion?input_val >= zero && input_val <= one
...
../aten/src/ATen/native/cuda/Loss.cu:118: operator(): block: [34,0,0], thread: [91,0,0] Assertion?input_val >= zero && input_val <= one
????????因为是在训练过程中,因此肯定不是所有的图像都有错,跑了几次之后,发现是在最后一个batch的训练过程中报错,且报错位置定位到loss计算,那就肯定是最后一个epoch算loss报错了。
????????打印出最后一个batch的输出尺寸,果然,输出维度为(1,2,256,256),按照(b,c,w,h)推理,b=1 那就意味着最后一个epoch的样本数为1,没有被整除导致,比如,3201个样本,batch_size=32,前面每个epoch训练都是32张训练样本,到最后一个epoch,只剩下一个样本了,就会报这个错。
????????找到问题的源头在哪就好解决了,只需要在dataloader定义的位置设置一个drop_last=True参数,忽略不能整除的最后一个epoch即可。具体代码:
dataloader = DataLoader(dataset=source_dataset,
batch_size=config.batch_size,
shuffle=True,
pin_memory=True,
collate_fn=collate_fn_w_transform,
num_workers=config.num_workers,
drop_last=True)
????????当然,如果你不想浪费那个样本,也可以通过调整batch_size来解决该问题,修改原则就是num_data = epoch*batch_size,保证三者均是整数,即保证epoch能被整除。
????????我的第一次报错就是这样解决的。
?
????????还有一种情况就是:一大串Assertion?input_val >= zero && input_val <= one
?failed.的报错,可能不是batch_size设置的问题,我第二次遇到的时候不是,一直没法解决,但是我肯定是数据的问题,因为换个数据集就不报错。
????????而且与之前不同的是,不是在训练过程中报错,而是刚开始训练就报错了。。。
????????于是我开始检查我的数据输入,因为我用的是coco格式的数据集,主要问题是label转的时候肯呢个没转对。我主要修改了2个地方。
????????之前还会因为这个报错:numpy/lib/function_base.py:334: VisibleDeprecationWarning: Creating an ndarray。。。也是通过修改以下代码成功解决的。
...
mask_path = '/labels'
if os.path.exists(os.path.join(mask_path, image_name)):
maks2coco(image_name)
...
????????如果新报错还不能解决,可以试试其他博主的结局方案,对我的没有用。
np_data = np.array(data, dtype = object)
????????在使用np.array报错的地方增加dtype = object
参考:https://www.5axxw.com/questions/content/b9snn8
🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸????🍎🍎👍👍🌷🌷