微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个关于pytorch改变张量形状的问题

如何解决一个关于pytorch改变张量形状的问题

当我想将一个图像分割成多个补丁时,我首先想到的是使用 pytorch view() 函数。例如,一张形状为(1,3,256,256)(pytorch style)的图片,分割成8x8=64个patch,每个patch的高宽都是32。所以对于这张图片,我们可以得到256/32=8的行和8 个列补丁,所以我们总共有 8x8=64 个补丁。

我想将图像 (1,256) 分割成块,每个块的形状是 (1,32,32),并将这些张量重塑为 (1,8x8,32x32x3) 的形状,这里 8x8 是补丁数量,32x32x3为补丁高度*宽度*通道。

下面的代码使用 einops 重新排列函数可以得到正确的答案,但是当我使用视图函数时,我得到了正确的形状但不正确的值张量。谁能告诉我如何通过视图函数来实现这个操作?

WITH cte(name,val) AS (VALUES ('name1',1),('name2',20))
INSERT OR REPLACE INTO settings (name,val) 
SELECT name,val FROM cte
EXCEPT
SELECT name,val FROM settings

解决方法

您可以按照pytorch discuss中提到的方法尝试这种方法。

import torch
a = torch.randn(1,3,256,256)
a = a.unfold(2,32,32).unfold(3,32)
a = a.contiguous().view(a.size(0),a.size(2)*a.size(3),a.size(1)*a.size(-1)*a.size(-2))
print(a.shape)

输出形状如您所料:

torch.Size([1,64,3072])

希望对你有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。