使用 grad 将 PyTorch 张量调整为更小的尺寸

     2023-03-12     252

关键词:

【中文标题】使用 grad 将 PyTorch 张量调整为更小的尺寸【英文标题】:Resizing PyTorch tensor with grad to smaller size 【发布时间】:2020-06-25 02:51:20 【问题描述】:

我正在尝试将张量从 (3,3) 缩小到 (1, 1),但我想保留原始张量:

import torch

a = torch.rand(3, 3)
a_copy = a.clone()
a_copy.resize_(1, 1)

我的初始张量中需要requires_grad=True,但 PyTorch 禁止我尝试调整副本大小:

a = torch.rand(3, 3, requires_grad=True)
a_copy = a.clone()
a_copy.resize_(1, 1)

抛出错误:

Traceback (most recent call last):
  File "pytorch_test.py", line 7, in <module>
    a_copy.resize_(1, 1)
RuntimeError: cannot resize variables that require grad

克隆和分离

我也试过.clone().detach()

a = torch.rand(3, 3, requires_grad=True)
a_copy = a.clone().detach()

with torch.no_grad():
    a_copy.resize_(1, 1)

这会给出这个错误:

Traceback (most recent call last):
  File "pytorch_test.py", line 14, in <module>
    a_copy.resize_(1, 1)
RuntimeError: set_sizes_contiguous is not allowed on a Tensor created from .data or .detach().
If your intent is to change the metadata of a Tensor (such as sizes / strides / storage / storage_offset)
without autograd tracking the change, remove the .data / .detach() call and wrap the change in a `with torch.no_grad():` block.
For example, change:
    x.data.set_(y)
to:
    with torch.no_grad():
        x.set_(y)

the docs 和 #15070 中已说明此行为。

no_grad()

因此,按照他们在错误消息中的说明,我删除了.detach() 并改用no_grad()

a = torch.rand(3, 3, requires_grad=True)
a_copy = a.clone()

with torch.no_grad():
    a_copy.resize_(1, 1)

但它仍然给我一个关于 grad 的错误:

Traceback (most recent call last):
  File "pytorch_test.py", line 21, in <module>
    a_copy.resize_(1, 1)
RuntimeError: cannot resize variables that require grad

类似问题

我查看了Resize PyTorch Tensor,但该示例中的张量保留了所有原始值。 我还查看了Pytorch preferred way to copy a tensor,这是我用来复制张量的方法。

我使用的是 PyTorch 1.4.0 版

【问题讨论】:

您是否尝试过先分离再克隆:a_copy = a.detach().clone() @AndreasK。不...我刚刚尝试过,它有效 【参考方案1】:

有一个narrow()函数:

def samestorage(x,y):
    if x.storage().data_ptr()==y.storage().data_ptr():
        print("same storage")
    else:
        print("different storage")
def contiguous(y):
    if True==y.is_contiguous():
        print("contiguous")
    else:
        print("non contiguous")
# narrow => same storage contiguous tensors
import torch
x = torch.randn(3, 3, requires_grad=True)
y = x.narrow(0, 1, 2) #dim, start, len  
print(x)
print(y)
contiguous(y)
samestorage(x,y)

输出:

tensor([[ 1.1383, -1.2937,  0.8451],
        [ 0.0151,  0.8608,  1.4623],
        [ 0.8490, -0.0870, -0.0254]], requires_grad=True)
tensor([[ 0.0151,  0.8608,  1.4623],
        [ 0.8490, -0.0870, -0.0254]], grad_fn=<SliceBackward>)
contiguous
same storage

【讨论】:

【参考方案2】:

我认为你应该先分离然后克隆:

a = torch.rand(3, 3, requires_grad=True)
a_copy = a.detach().clone()
a_copy.resize_(1, 1)

注意:a.detach() 返回一个与当前图形分离的 new 张量(它不会像 a.detach_() 那样将 a 本身从图形中分离出来)。但是因为它与a 共享存储,所以你也应该克隆它。这样,无论您对a_copy 做什么,都不会影响a。但是我不确定为什么a.detach().clone() 有效,但a.clone().detach() 给出错误。

编辑

以下代码也有效(这可能是更好的解决方案):

a = torch.rand(3, 3, requires_grad=True)

with torch.no_grad():
    a_copy = a.clone()
    a_copy.resize_(1, 1)

【讨论】:

@Moon Cheesez 我已经编辑了答案。你也可以使用with torch.no_grad()

将图像调整为更小只是切断边缘

...:2012-06-1621:41:05【问题描述】:这一切都在C#中:我正在使用此代码调整图像大小:_image=(Image)newBitmap(_refImage,_width,_height);_refImage只是一个参考图像,与原始图像相同,因此如果我多次调整大小,分辨率不会混乱 查看详情

pytorch 中张量的 Autograd.grad()

】pytorch中张量的Autograd.grad()【英文标题】:Autograd.grad()forTensorinpytorch【发布时间】:2019-07-1205:49:48【问题描述】:我想计算网络中两个张量之间的梯度。输入X张量(批量大小xm)通过一组卷积层发送,这些层返回并输出Y张量(... 查看详情

Pytorch RuntimeError:张量的元素 0 不需要 grad 并且没有 grad_fn

】PytorchRuntimeError:张量的元素0不需要grad并且没有grad_fn【英文标题】:PytorchRuntimeError:element0oftensorsdoesnotrequiregradanddoesnothaveagrad_fn【发布时间】:2020-08-3116:08:49【问题描述】:此代码构建如下:我的机器人拍照,一些tf计算机视... 查看详情

pytorch使用pytorch进行张量计算自动求导和神经网络构建(代码片段)

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052首先,让我们介绍一下什么是pytorch,它是一个基于Python的开源深度学习框架,它提供了两个核心功能:张量计算和自动求导。张量计算张量... 查看详情

Pytorch (1.0) 中类似外观操作的不同 `grad_fn`

】Pytorch(1.0)中类似外观操作的不同`grad_fn`【英文标题】:Different`grad_fn`forsimilarlookingoperationsinPytorch(1.0)【发布时间】:2019-09-1401:49:09【问题描述】:我正在研究一个注意力模型,在运行最终模型之前,我正在检查流经代码的张量... 查看详情

如何调整 PyTorch 张量的大小?

】如何调整PyTorch张量的大小?【英文标题】:HowtoresizeaPyTorchtensor?【发布时间】:2020-02-2818:45:17【问题描述】:我有一个大小为(5,1,44,44)(批次、通道、高度、宽度)的PyTorch张量,我想将其“调整大小”为(5,1,224,224)我该怎么做... 查看详情

如何将结果集拆分为更小的子集?

...:38【问题描述】:我目前正在开展一个项目,我们必须将使用oracle获得的结果集集成到mysql中。由于他们一方的数据长度限制,我必须将结果集中的一个数字分成更小的部分,它们可以连接在一起。他们给我发了一个示例代码,... 查看详情

RxSwift - 将序列拆分为更小的序列以连接

...布时间】:2017-04-2018:02:51【问题描述】:背景我正在尝试使用Range标头通过块下载文件。目标我想将大量的http请求序列分成四个序列,然后我可以将它们连接起来以一次处理4个请求。当前排名我目前正在执行我的序列并使用conca... 查看详情

pytorch自动求解梯度(代码片段)

要理解Pytorch求解梯度,首先需要理解Pytorch当中的计算图的概念,在计算图当中每一个Variable都代表的一个节点,每一个节点就可以代表一个神经元,我们只有将变量放入节点当中才可以对节点当中的变量求解梯度,假设我们有... 查看详情

PyTorch autograd -- 只能为标量输出隐式创建 grad

】PyTorchautograd--只能为标量输出隐式创建grad【英文标题】:PyTorchautograd--gradcanbeimplicitlycreatedonlyforscalaroutputs【发布时间】:2019-02-1809:46:24【问题描述】:我正在使用PyTorch中的autograd工具,发现自己需要通过整数索引访问一维张量... 查看详情

如何将 WAV 拆分为更小的 WAV 文件?

...有什么办法吗?【问题讨论】:【参考方案1】:您可以使用AudioInputStr 查看详情

当窗口垂直调整为更小的尺寸时,避免 WPF 状态栏完全折叠

】当窗口垂直调整为更小的尺寸时,避免WPF状态栏完全折叠【英文标题】:AvoidWPFstatusbargetstotallycollapsedwhenwindowgetsresizedverticallytoasmallersize【发布时间】:2019-06-0520:09:02【问题描述】:我有下面的WPF窗口,其中包含一个停靠面板... 查看详情

如何将 pytorch 整数张量转换为布尔张量?

】如何将pytorch整数张量转换为布尔张量?【英文标题】:Howtoconvertapytorchtensorofintstoatensorofbooleans?【发布时间】:2019-05-0221:32:15【问题描述】:我想将整数张量转换为布尔张量。具体来说,我希望能够拥有一个将tensor([0,10,0,16])转... 查看详情

使用命令行将文本文件拆分为更小的多个文本文件

】使用命令行将文本文件拆分为更小的多个文本文件【英文标题】:Splittextfileintosmallermultipletextfileusingcommandline【发布时间】:2014-10-0415:35:39【问题描述】:我有多个大约100,000行的文本文件,我想将它们拆分为每个5000行的较小... 查看详情

使用 str 键和 pytorch 张量列表将字典保存为值

】使用str键和pytorch张量列表将字典保存为值【英文标题】:Savingthedictionarywithstrkeysandalistofpytorchtensorsasvalues【发布时间】:2020-11-1505:44:18【问题描述】:我想保存一个字典列表,其中键是查询的索引(因此字典的键是字符串)。... 查看详情

实践·pytorch梯度计算

参考技术Apytorch梯度机制,计算梯度注意事项pytorch,autograd,tensor,自动微分,张量,梯度  在一些优化算法中,常常需要计算函数的梯度,在pytorch可以借助autograd机制来自动计算梯度值。  假设,关于的梯度记... 查看详情

深度之眼pytorch训练营第二期---基础数据结构-张量(代码片段)

...是否需要梯度  is_leaf:指示是否是叶子结点(张量)PyTorch0.4.0之后,Variable并入Tensor     dtype:张量的数据类型,如torch.FloatTensor,torch.cuda.FloatTensor     shape:张量的形状,如(64,3,224,224) ... 查看详情

使用 PyTorch 张量将对角线屏蔽为特定值

】使用PyTorch张量将对角线屏蔽为特定值【英文标题】:MaskingdiagonaltoaspecificvaluewithPyTorchtensors【发布时间】:2018-09-0519:53:24【问题描述】:如何用torch中的值填充对角线?在numpy中你可以这样做:a=np.zeros((3,3),int)np.fill_diagonal(a,5)arr... 查看详情