跳转至

添加 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了
Back to top