问题描述
笔者在基于深度学习搭建信号处理流图的过程中,使用了DCNv2库。自己编写完成了代码后,在模型训练的阶段,出现了如下报错:
Traceback (most recent call last):
File "/home/project/brain/models/networks/DCNv2/dcn_v2.py", line 48, in backward
grad_input, grad_offset, grad_mask, grad_weight, grad_bias = _backend.dcn_v2_backward(
RuntimeError: invalid argument 1: input tensor has to be contiguous
错误原因
按照报错的信息显示,似乎是某些变量的连续性问题。在查阅了相关资料后,发现,DCNv2模块内部使用的CUDA扩展要求输入张量必须是内存连续的(contiguous)。
当张量经过某些维度变换操作(如permute、view)后可能变为非连续状态,若直接输入到DCN模块,将会导致此错误。
解决方案
在张量进入DCN模块前显式调用 .contiguous(),例如:
x = x.permute(0, 1, 2).view(b, c, grid_size, grid_size)
# 新增:强制转换为连续内存布局
x = x.contiguous() # <----- 关键修复
x = self.conv_after_trans(x)
建议在代码中,出现了对张量进行维度变换操作后的重点部位,均做contiguous()加固,例如:下采样、上采样。