TensorFlow C++中Conv2DBackpropFilter反向传播膨胀参数错误
我来帮你搞定这个反向传播时遇到的错误——核心原因有两个:一是TensorFlow的Conv2DBackpropFilter实现完全不支持在batch维度(NHWC格式里的第一个N)和depth维度(最后一个C)设置非1的膨胀值;二是从错误日志里的dilations=[1443866016, 391, 4, 0]能看出来,你的膨胀参数明显是未初始化的垃圾值或者传递错误的结果,完全不符合TensorFlow要求的格式。
下面是具体的修复步骤:
严格遵循dilations参数的格式要求
TensorFlow对Conv2D系列操作的dilations参数有硬性规定:必须是长度为4的数组,格式为[1, d_h, d_w, 1]。其中只有高度(d_h)和宽度(d_w)维度可以设置大于1的膨胀率,batch和depth维度必须固定为1,这是底层实现的限制,没有变通空间。检查并修正参数初始化代码
出现这种乱码般的dilations值,大概率是你在C++代码里没有正确初始化dilations张量。比如,你应该显式地为每个维度赋值,而不是依赖未初始化的内存。参考下面的正确写法:// 创建并初始化符合要求的dilations张量 Tensor dilations(DT_INT32, TensorShape({4})); auto dilations_flat = dilations.flat<int32>(); dilations_flat(0) = 1; // batch维度固定为1 dilations_flat(1) = 3; // 高度方向的膨胀率,根据你的需求调整 dilations_flat(2) = 4; // 宽度方向的膨胀率,根据你的需求调整 dilations_flat(3) = 1; // depth维度固定为1保证正向与反向传播的dilations参数一致
Conv2DBackpropFilter是正向Conv2D操作的梯度计算节点,两者的dilations参数必须完全匹配。如果正向Conv2D用了[1,3,4,1],那反向传播的dilations也得是相同的值,不能出现参数不匹配的情况。排查参数传递时的内存问题
如果你是通过指针或者数组传递dilations值,一定要确保传递的是正确的内存地址,没有越界或者指向未初始化的内存区域。比如,不要直接把一个未赋值的int数组传递给TensorFlow的API,必须先填充好正确的数值。
内容的提问来源于stack exchange,提问作者Kuchinawa

