# MindSpore如何实现pytoch中的detach\(\)方法

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): CPU

软件环境: MindSpore 版本: 2.0.0

执行模式（静态图/动态图）： 不限

Python 版本: 3.7.6

操作系统平台: linux

**2. 报错信息**

2.1 问题描述

将原pytoch代码网络的forward中对某参数使用了detach方法，MindSpore该如何实现detach\(\)方法。

2.2 脚本信息

```
Prototypes = self.Prototypes.detach()
```

**3. 根因分析**

torch 中detach的用途。

```
    Returns a new Tensor, detached from the current graph. 
    The result will never require gradient. 
    .. note:: 
      Returned Tensor uses the same data tensor as the original one. 
      In-place modifications on either of them will be seen, and may trigger 
      errors in correctness checks. 
```

返回一个新的tensor，并且这个tensor是从当前的计算图中分离出来的。但是返回的tensor和原来的tensor是共享内存空间的。

**4. 解决方案**

mindspore 没有detach这个概念。

如果非要在mindspore中找到类似的代替，只能对参数先进行克隆，然后将requires\_grad设置为False。或者是直接将参数本身requires\_grad设置为False。

但是克隆的话Mindspore和Torch还是有差别。克隆的参数和原来的参数不共享内存空间。原有的参数修改后，克隆的参数不会一起修改。

```
import torch
from mindspore import Tensor,Parameter

a = torch.tensor([1.0, 2.0, 3.0], requires_grad = True)
a = a.detach() # 会将requires_grad 属性设置为False
a=a*2
print(a.requires_grad)
print(a)
b = Parameter(Tensor([1.0,2.0,3.0]))
c = b.clone()
b=b*2
c.requires_grad = False
print(b.value())
print(c.value())
print(c.requires_grad)
```

