精华内容
下载资源
问答
  • 今天小编就为大家分享一篇PyTorch中 tensor.detach() 和 tensor.data 的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 在从tensor转换成为numpy的时候,如果转换前面的tensor在计算图里面(requires_grad = True),那么这个时候只能先进行detach操作才能转换成为numpy x = torch.zeros([3, 4], requires_grad = True) x y = x.numpy()...

    tensor.detach():
     从计算图中脱离出来,返回一个新的tensor,新的tensor和原tensor共享数据内存,(这也就意味着修改一个tensor的值,另外一个也会改变),但是不涉及梯度计算。在从tensor转换成为numpy的时候,如果转换前面的tensor在计算图里面(requires_grad = True),那么这个时候只能先进行detach操作才能转换成为numpy

    x = torch.zeros([3, 4], requires_grad = True)
    x
    y = x.numpy()
    print(y)
    
    '''输出:(报错了)
    ---------------------------------------------------------------------------
    RuntimeError                              Traceback (most recent call last)
    <ipython-input-11-8c9629e859f6> in <module>
          1 x = torch.zeros([3, 4], requires_grad = True)
          2 x
    ----> 3 y = x.numpy()
          4 print(y)
    
    RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
    '''
    
    x = torch.zeros([3, 4], requires_grad = True)
    x
    y = x.detach().numpy()
    print(y)
    
    '''输出
    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    '''
    
    展开全文
  • Use tensor.detach().numpy() instead. 如图: 使用提示错误解决定位源代码: #action_space=400,action_prob是400个概率值 action_chosen = np.random.choice(np.arange(action_space), p=action_probs) 参考np....

    问题出现(错误索引)

    一开始报错:
    Can’t call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
    如图:在这里插入图片描述
    使用提示错误解决定位源代码:

    #action_space=400,action_prob是400个概率值
    action_chosen = np.random.choice(np.arange(action_space), p=action_probs)
    

    参考np.random.choice()的资料:https://blog.csdn.net/ImwaterP/article/details/96282230
    发现直接带入数字是没有问题的,使用如下的测试代码

    #可以看到有相同元素
    chosen_name=np.arange(5)
    pol=torch.tensor([0.1,0.2,0.1,0.3,0.3]).tolist()
    print(pol)
    print(sum(pol))
    np_out = np.random.choice(np.arange(5),p=pol)
    print(np_out)
    

    然后报错:ValueError: probabilities do not sum to 1
    在这里插入图片描述
    可以发现,这时候概率之和确实不唯一,
    之后参考资料,发现需要对概率进行归一化,参考链接:https://blog.csdn.net/Scythe666/article/details/84250693

    修改测试代码:

    chosen_name=np.arange(5)
    pol=torch.tensor([0.1,0.2,0.1,0.3,0.3]).tolist()
    print(pol)
    print(sum(pol))
    p = np.array(pol)
    p /= p.sum() # normalize
    print(p,sum(p))
    np_out = np.random.choice(np.arange(5),p=p)
    print(np_out)
    

    输出结果:
    在这里插入图片描述

    总结

    1.np.random.choice()中概率要使用一维数据,不可以是tensor类型,通过var.tolist()转换成为list类型;
    2.由于转化成为列表的数字存在精度问题,导致最后概率之和并不是1,可以使用归一化代码,重新求概率,代码如下。

    p = np.array(pol)
    p /= p.sum() # normalize
    

    困扰一天的问题终于解决啦,写个csdn记录一下,希望可以帮到有需要的小伙伴!

    展开全文
  • PyTorch中 tensor.detach() 和 tensor.data 的区别

    万次阅读 多人点赞 2018-12-26 11:33:52
    PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 .data 返回和 x 的相同数据 tensor, 但不会加入到x的计算历史里,且require s_grad = False, 这样有些时候是不安全的, 因为 x.data 不能被 autograd ...

    原文链接请参考:https://dreamhomes.top/posts/201906081516/


    PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 .data 返回和 x 的相同数据 tensor, 但不会加入到x的计算历史里,且require s_grad = False, 这样有些时候是不安全的, 因为 x.data 不能被 autograd 追踪求微分 。 .detach() 返回相同数据的 tensor ,且 requires_grad=False ,但能通过 in-place 操作报告给 autograd 在进行反向传播的时候.
    举例:
    tensor.data

    >>> a = torch.tensor([1,2,3.], requires_grad =True)
    >>> out = a.sigmoid()
    >>> c = out.data
    >>> c.zero_()
    tensor([ 0., 0., 0.])
    
    >>> out                   #  out的数值被c.zero_()修改
    tensor([ 0., 0., 0.])
    
    >>> out.sum().backward()  #  反向传播
    >>> a.grad                #  这个结果很严重的错误,因为out已经改变了
    tensor([ 0., 0., 0.])
    

    tensor.detach()

    >>> a = torch.tensor([1,2,3.], requires_grad =True)
    >>> out = a.sigmoid()
    >>> c = out.detach()
    >>> c.zero_()
    tensor([ 0., 0., 0.])
    
    >>> out                   #  out的值被c.zero_()修改 !!
    tensor([ 0., 0., 0.])
    
    >>> out.sum().backward()  #  需要原来out得值,但是已经被c.zero_()覆盖了,结果报错
    RuntimeError: one of the variables needed for gradient
    computation has been modified by an
    
    展开全文
  • detach的中文意思是分离,官方解释是返回一个新的Tensor,从当前的计算图中分离出来 需要注意的是,返回的Tensor和原Tensor共享相同的存储空间,但是返回的 Tensor 永远不会需要梯度 import torch as t a = t.ones...

    detach

    detach的中文意思是分离,官方解释是返回一个新的Tensor,从当前的计算图中分离出来
    在这里插入图片描述
    需要注意的是,返回的Tensor和原Tensor共享相同的存储空间,但是返回的 Tensor 永远不会需要梯度
    在这里插入图片描述

    import torch as t
    
    a = t.ones(10,)
    b = a.detach()
    print(b)
    tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
    

    那么这个函数有什么作用?
    –假如A网络输出了一个Tensor类型的变量a, a要作为输入传入到B网络中,如果我想通过损失函数反向传播修改B网络的参数,但是不想修改A网络的参数,这个时候就可以使用detcah()方法

    a = A(input)
    a = detach()
    
    b = B(a)
    loss = criterion(b, target)
    loss.backward()
    

    来看一个实际的例子:

    import torch as t
    x = t.ones(1, requires_grad=True)
    x.requires_grad   #True
    y = t.ones(1, requires_grad=True)
    y.requires_grad   #True
    
    x = x.detach()   #分离之后
    x.requires_grad   #False
    
    y = x+y      	  #tensor([2.])
    y.requires_grad   #我还是True
    y.retain_grad()   #y不是叶子张量,要加上这一行
    
    z = t.pow(y, 2)
    z.backward()    #反向传播
    
    y.grad        #tensor([4.])
    x.grad        #None
    

    以上代码就说明了反向传播到y就结束了,没有到达x,所以x的grad属性为None


    既然谈到了修改模型的权重问题,那么还有一种情况是:
    –假如A网络输出了一个Tensor类型的变量a, a要作为输入传入到B网络中,如果我想通过损失函数反向传播修改A网络的参数,但是不想修改B网络的参数,这个时候又应该怎么办了?

    这时可以使用Tensor.requires_grad属性,只需要将requires_grad修改为False即可.

    for param in B.parameters():
    	param.requires_grad = False
    
    a = A(input)
    b = B(a)
    loss = criterion(b, target)
    loss.backward()
    
    展开全文
  • exec(compile(contents+"\n", file, 'exec'), glob, loc) File "F:/GPAI/secondTimes/CatchYou/Train.py", line 49, in <module> pre_rect = out[0].numpy() RuntimeError: Can't call numpy() on V...
  • 假如A网络输出了一个Tensor类型的变量a, a要作为输入传入到B网络中,如果我想通过损失函数反向传播修改B网络的参数,但是不想修改A网络的参数,这个时候就可以使用detcah()方法 a = A(input) a = a.detach() b = B...
  • PyTorch0.4中,.data 仍保留,但建议使用 .detach(), 区别在于 .data 返回和 x 的相同数据 tensor, 但不会加入到x的计算历史里,且require s_grad = False, 这样有些时候是不安全的, 因为 x.data 不能被 autograd ...
  • Use tensor.detach().numpy() instead. 待转换类型的PyTorch Tensor变量带有梯度,直接将其转换为numpy数据将破坏计算图,因此numpy拒绝进行数据转换,实际上这是对开发者的一种提醒。如果自己在转换数据时不需要...
  • Pytorch中有以下这么多命令涉及到tensornumpy之间的转化: .numpy(), .item(), .detach(), .cpu(), .cuda(), .tensor(), .as_tensor(), Tensor(), .clone(), 具体怎么用呢?请看下面的详细解释。 正如Numpy中所有...
  • Use Tensor.cpu() to copy the tensor to host memory first. Tensor在进行numpy计算的时候需要与numpy()的格式进行转换 ...1)data.cpu().detach().numpy() #将data转换成cpu numpy格式 2)result.cu
  • File "D:\Anaconda3\envs\yolov5-3\lib\site-packages\torch\tensor.py", line 621, in __array__ return self.numpy() TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy ...
  • .detach().cpu().numpy()的作用

    千次阅读 2021-05-14 16:40:02
    ls.append(out.detach().cpu().numpy()) out是device:CUDA得到的CUDA tensor。关于detach()的官方文档如下: Returns a new Tensor, detached from the current graph. The result will never require gradient. ...
  • 问题描述:TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first 问题详情:在获得模型结果output后希望转化为numpy的数组类型,但是无法直接...
  • data.detach().cpu().numpy()作用

    千次阅读 2020-11-30 19:02:27
    import torch if __nane__ == '__main__': if torch.cuda.is_available(): device = 'cuda' else: ... data_detach = data.detach() print('detach():', data_detach ) data_cpu = data.d
  • detach(): 返回一个新的Tensor,但返回的结果是没有梯度的。 cpu():把gpu上的数据转到cpu上。 numpy():将tensor格式转为numpy。 如图所示: out = logits.detach().cpu().numpy()
  • TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first. 出错代码如下 out = out.detach().numpy() 如下修改就可以 out = out.detach().cpu().numpy...
  • 报错如下所示 ...直接修改源文件,在detach()后增加cpu()。 修改完成之后的代码图下所示 看,可以跑起来了,但是就是多了很多not supported! 这些东西怎么删除,我不知道了。等下研究 ...
  • Use var.detach().numpy() instead. 1 2. 解决办法 出现这个现象的原因是:待转换类型的PyTorch Tensor变量带有梯度,直接将其转换为numpy数据将破坏计算图,因此numpy拒绝进行数据转换,实际上这是对开发者...
  • Can’t call numpy() on Variable that requires ... Use var.detach().numpy() instead. 数据属性:gradfn=<AddmmBackward>)grad_fn=<AddmmBackward>)gradf​n=<AddmmBackward>) data.numpy() ...
  • 1. 问题描述 如题,将PyTorch Tensor类型的变量转换成numpy时报错: ... Use var.detach().numpy() instead. 2. 解决办法 出现这个现象的原因是:待转换类型的PyTorch Tensor变量带有梯度,直接将其转换为...
  • 脚本报错 RuntimeError:Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead. 定位出错语句 enc, dec, z, gamma = self.dagmm(input_data) img_test = dec[27:36...
  • 官方文档:https://pytorch.org/docs/stable/tensors.html#torch.Tensor.numpy 功能:将张量转换为共享底层存储的 n 维 numpy 数组 .item() 官方文档:...
  • 我想将pytorch的计算结果赋值给numpy array, S[i, v] = torch.div(row_res, row_sum), 其中S是numpy array, 结果报错RuntimeError: Can’t call numpy() on Variable that requires grad. Use var.detach().num...
  • print('2222',loss.data)#tensor且GPU print('3333',loss.cpu()) print('4444',loss.cpu().data)#tensor且CPU # print('5555',loss.cpu().data[0])#报错 IndexError: invalid index of a 0-dim tens...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,123
精华内容 1,649
关键字:

tensor.detach().numpy()