添加 deconv
需求:
- 添加
oneflow.nn.functional.conv_transpose*
- 去除多余的参数
流程
cpp
c++ 功能函数
./oneflow/core/functional/impl/nn_functor.cpp
yaml
注册 python 与 c++ 的接口
./oneflow/core/functional/functional_api.yaml
注:PyTorch 没有的参数移到最后
py-传参方式
python 接口
./python/oneflow/nn/modules/conv.py
导入接口
./python/oneflow/nn/functional/__init__.py
test
./python/oneflow/test/expensive/test_convtranspose.py
doc
添加 ./python/oneflow/framework/docstr/deconv.py
将 deconv.py 添加到 ./python/oneflow/framework/docstr/__init__.py
修改 ./docs/source/functional.rst
测试问题
测试代码内置在 class TestConvTranspose(flow.unittest.TestCase)
import unittest
from collections import OrderedDict
import numpy as np
from oneflow.test_utils.test_util import GenArgList
from oneflow.test_utils.automated_test_util import *
import oneflow as flow
import oneflow.nn as nn
import oneflow.unittest
import oneflow.nn.functional as F
class TestConvTranspose(flow.unittest.TestCase):
def test_functional_conv_transpose3d(test_case):
inputs = torch.randn(20, 16, 50, 10, 20)
weights = torch.randn(16, 33, 3, 3, 3)
outputs = F.conv_transpose3d(inputs, weights)
return outputs
if __name__ == "__main__":
unittest.main()
错误描述
出现错误
Traceback (most recent call last):
File "/home/zhongshanshan/workspace/f/python/oneflow/test/expensive/test_convtranspose.py", line 387, in test_functional_conv_transpose3d
outputs = F.conv_transpose3d(inputs, weights)
oneflow._oneflow_internal.exception.Exception:
File "/home/zhongshanshan/workspace/f/oneflow/api/python/functional/py_function.cpp", line 98, in ParseArgs
TypeError: deconv3d(): argument 'x' must be tensor, not <class 'unused_2568'>
将 import oneflow.nn.functional as F
改为 import torch.nn.functional as F
,报错变更为
Traceback (most recent call last):
File "/home/zhongshanshan/workspace/f/python/oneflow/test/expensive/test_convtranspose.py", line 387, in test_functional_conv_transpose3d
outputs = F.conv_transpose3d(inputs, weights)
File "/home/zhongshanshan/workspace/f/python/oneflow/test_utils/automated_test_util/torch_flow_dual_object.py", line 656, in dual_method
oneflow_method = getattr(oneflow, method_name)
AttributeError: 'oneflow._oneflow_internal.Tensor' object has no attribute '__torch_function__'
解决方法
将 F.conv_transpose3d
改为 torch.nn.functional.conv_transpose3d
。原因参考 深度学习框架如何优雅的做算子对齐任务? 。此外,需要将 torch.randn
改为 torch.ones
。这里不能用randn,因为自动测试框架里会用pytorch和oneflow分别产生一次随机tensor,那很可能输入是不相等的,这样得到的结果数值检查就会失败。
踩坑史
- yaml 中 list 的初始化需要根据 维度 而定,如 Int32List[3] dilation=1 对于 3d, Int32List[2] dilation=1 对于 2d
- 查看文档,如查看 nn.functional.conv2d 的文档,可以通过 nn.functional.conv2d.__doc__
- 测试样例不宜过大,因为ci会多进程跑测试,每个样例的内存不能太大,不然可能就oom了