做了一下,不知道对不对。。
源码:def reshape(self, *shape: _int)。
*shape可以接收元组,也可分开接收。
使用 arange
创建一个行向量 x
这里,其实创建的是一维向量吧?无关行向量还是列向量?(根据我查到的资料显示)
我猜测是因为3不能被2整除导致无法进行广播。如果你将X形状改变为(2,1,3),将Y形状改变为(1,3,1),那么应该可以顺利实现广播。
谢谢,是的,由于广播原则的限制,从直观上也可以理解,扩展的时候无法确定是按照2中的哪个元素复制,所以不可以进行。(原问题已解决)
我个人总结的广播原则:
维度按照右对齐后,需要复制的维度只有一行/列或者为空,其余行/列不需要复制。
这个可以复制成功,因为需要复制的维度全部是1
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a+b
可以复制成功,因为右对齐后第一个维度为空,且要复制的维度为1
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((2))
a+b
这个无法复制,因为要复制的有两列
a = torch.arange(18).reshape((3,6))
b = torch.arange(6).reshape((3,2))
a+b
这种可以复制,因为只有一行需要复制
a = torch.arange(18).reshape((3,6))
b = torch.arange(6).reshape((1,6))
a+b
这种不能复制,因为第一维需要复制的有两行
a = torch.arange(12).reshape((2,2,3))
b = torch.arange(12).reshape((6,2,1))
a+b
两个张量的维度大小向右对齐,触发广播机制的条件:
a. 同一维度大小相等;
或 b. 某个维度 一个张量有,另一个张量没有 ;
或 c. 某个维度 一个张量有,另一个张量也有且大小不同,但大小是1。
参考
我用的是python3.9.12,方法2中改变a的形状,例如 a = numpy.ones(6),b不会改变;但是改变a某个元素的值,b会改变,这是为什么
2.1.2开头的末尾:我们使用逗号来表示一个具有5个元素的元组;好像写错了,下面明明是4个元素
a = torch.reshape(torch.arange(3),(3, 1))
初学小白。想知道torch.tensor(3.5)和torch.tensor([3.5])有什么区别。
有没有可能这俩就是没有区别呢
广播机制:
两个数组做按元素算术操作,先从右至左比较维度,在以下两个条件下执行操作,
1.该维度元素个数相等;
2.其中一个为1.
可以补充一下张量的底层实现,存储视图以及张量的大小、偏移量、步长。把这一部分作为拓展放出来,这一部分还是有必要了解一下的。
2.1.5小节中,为什么说“ 如果在后续计算中没有重复使用X
”呢?