Pytorch之擴充tensor的操作
我就廢話不多說瞭,大傢還是直接看代碼吧~
b = torch.zeros((3, 2, 6, 6)) a = torch.zeros((3, 2, 1, 1)) a.expand_as(b).size() Out[32]: torch.Size([3, 2, 6, 6]) a = torch.zeros((3, 2, 2, 1)) a.expand_as(b).size() Traceback (most recent call last): File "/home/lart/.conda/envs/pt/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3267, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-34-972575f79e92>", line 1, in <module> a.expand_as(b).size() RuntimeError: The expanded size of the tensor (6) must match the existing size (2) at non-singleton dimension 2. Target sizes: [3, 2, 6, 6]. Tensor sizes: [3, 2, 2, 1] a = torch.zeros((3, 2, 1, 2)) a.expand_as(b).size() Traceback (most recent call last): File "/home/lart/.conda/envs/pt/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3267, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-36-972575f79e92>", line 1, in <module> a.expand_as(b).size() RuntimeError: The expanded size of the tensor (6) must match the existing size (2) at non-singleton dimension 3. Target sizes: [3, 2, 6, 6]. Tensor sizes: [3, 2, 1, 2] a = torch.zeros((3, 2, 2, 2)) a.expand_as(b).size() Traceback (most recent call last): File "/home/lart/.conda/envs/pt/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3267, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-38-972575f79e92>", line 1, in <module> a.expand_as(b).size() RuntimeError: The expanded size of the tensor (6) must match the existing size (2) at non-singleton dimension 3. Target sizes: [3, 2, 6, 6]. Tensor sizes: [3, 2, 2, 2] a = torch.zeros((3, 2, 6, 2)) a.expand_as(b).size() Traceback (most recent call last): File "/home/lart/.conda/envs/pt/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3267, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-40-972575f79e92>", line 1, in <module> a.expand_as(b).size() RuntimeError: The expanded size of the tensor (6) must match the existing size (2) at non-singleton dimension 3. Target sizes: [3, 2, 6, 6]. Tensor sizes: [3, 2, 6, 2] a = torch.zeros((3, 2, 6, 1)) a.expand_as(b).size() Out[44]: torch.Size([3, 2, 6, 6]) a = torch.zeros((3, 2, 1, 6)) a.expand_as(b).size() Out[46]: torch.Size([3, 2, 6, 6])
tensor.expand_as在這裡用於擴展tensor到目標形狀,常用的多是在H和W方向上的擴展。
假設目標形狀為N, C, H, W,則要求tensor.size()=n, c, h, w(這裡假設N,C不變):
1、h=w=1
2、h=1, w!=1
3、h!=1, w=1
補充:tensorflow 利用expand_dims和squeeze擴展和壓縮tensor維度
在利用tensorflow進行文本挖掘工作的時候,經常涉及到維度擴展和壓縮工作。
比如對文本進行embedding操作完成之後,若要進行卷積操作,就需要對embedded的向量擴展維度,將[batch_size, embedding_dims]擴展成為[batch_size, embedding_dims, 1],利用tf.expand_dims(input, -1)就可實現,反過來用squeeze(input, -1)或者tf.squeeze(input)也可以把最第三維去掉。
tf.expand_dims()
tf.squeeze()
tf.expand_dims()
tf.expand_dims(input, axis=None, name=None, dim=None)
在第axis位置增加一個維度.
給定張量輸入,此操作在輸入形狀的維度索引軸處插入1的尺寸。 尺寸索引軸從零開始; 如果您指定軸的負數,則從最後向後計數。
如果要將批量維度添加到單個元素,則此操作非常有用。 例如,如果您有一個單一的形狀[height,width,channels],您可以使用expand_dims(image,0)使其成為1個圖像,這將使形狀[1,高度,寬度,通道]。
例子
# 't' is a tensor of shape [2] shape(expand_dims(t, 0)) ==> [1, 2] shape(expand_dims(t, 1)) ==> [2, 1] shape(expand_dims(t, -1)) ==> [2, 1] # 't2' is a tensor of shape [2, 3, 5] shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5] shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5] shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]
tf.squeeze()
tf.squeeze(input, axis=None, name=None, squeeze_dims=None)
直接上例子
# 't' is a tensor of shape [1, 2, 1, 3, 1, 1] shape(squeeze(t)) ==> [2, 3] # 't' is a tensor of shape [1, 2, 1, 3, 1, 1] shape(squeeze(t, [2, 4])) ==> [1, 2, 3, 1]
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- pytorch下的unsqueeze和squeeze的用法說明
- Pytorch中expand()的使用(擴展某個維度)
- Broadcast廣播機制在Pytorch Tensor Numpy中的使用詳解
- pytorch tensor計算三通道均值方式
- 人工智能學習Pytorch教程Tensor基本操作示例詳解