view(*args)改变张量的大小和形状_pytorch reshape numpy
20201227
這個方法是在不改變數據內容的情況下,改變一個數組的格式,參數及返回值,官網介紹:
a:數組–需要處理的數據
newshape:新的格式–整數或整數數組,如(2,3)表示2行3列,新的形狀應該與原來的形狀兼容,即行數和列數相乘后等于a中元素的數量
order:
首先做出翻譯:order : 可選范圍為{‘C’, ‘F’, ‘A’}。使用索引順序讀取a的元素,并按照索引順序將元素放到變換后的的數組中。如果不進行order參數的設置,默認參數為C。
(1)“C”指的是用類C寫的讀/索引順序的元素,最后一個維度變化最快,第一個維度變化最慢。以二維數組為例,簡單來講就是橫著讀,橫著寫,優先讀/寫一行。
(2)“F”是指用FORTRAN類索引順序讀/寫元素,最后一個維度變化最慢,第一個維度變化最快。豎著讀,豎著寫,優先讀/寫一列。注意,“C”和“F”選項不考慮底層數組的內存布局,只引用索引的順序。
(3)“A”選項所生成的數組的效果與原數組a的數據存儲方式有關,如果數據是按照FORTRAN存儲的話,它的生成效果與”F“相同,否則與“C”相同。這里可能聽起來有點模糊,下面會給出示例。
二、示例解釋
1、首先隨機生成一個4行3列的數組
2、使用reshape,這里有兩種使用方法,可以使用np.reshape(r,(-1,1),order=‘F’),也可以使用r1=r.reshape((-1,1),order=‘F’),這里我選擇使用第二種方法。通過示例可以觀察不同的order參數效果。
F 按列的順序 先排列的元素
通過例子可以看出來,F是優先對列信息進行操作,而C是優先行信息操作。如果未對r的格式進行設置,那么我們rashape的時候以“A”的順序進行order的話,它的效果和“C”相同。
3、我們將r的存儲方式進行修改,修改為類Fortan的方式進行存儲。并做與第2步類似的操作。
2.接下來創建一個數組a,可以看到這是一個一維的數組
3.使用reshape()方法來更改數組的形狀,可以看到看數組d成為了一個二維數組
4.通過reshape生成的新數組和原始數組公用一個內存,也就是說,假如更改一個數組的元素,另一個數組也將發生改變
5.同理還可以得到一個三維數組
reshape(-1,1)什么意思:
大意是說,數組新的shape屬性應該要與原來的配套,如果等于-1的話,那么Numpy會根據剩下的維度計算出數組的另外一個shape屬性值。
只有-1的話 默認是展平成一維 與shape數值相同的行 是沒有列的
shape表現為(xx,) 如果假設有一列的話應該是(xx,1) 但是又可以
直接當做有一列來操作 不必可以先轉成有一列再進行其他操作
也就是說,先前我們不知道z的shape屬性是多少,但是想讓z變成只有一列,行數不知道多少,通過z.reshape(-1,1),Numpy自動計算出有12行,新的數組shape屬性為(16, 1),與原來的(4, 4)配套。
同理,只給定行數,newshape等于-1,Numpy也可以自動計算出新數組的列數。
https://www.jianshu.com/p/fc2fe026f002
20201202
import torch
a = torch.randn(3,5,2)
print(a)
print(a.view(-1))
tensor([[[-0.6887, 0.2203],[-1.6103, -0.7423],[ 0.3097, -2.9694],[ 1.2073, -0.3370],[-0.5506, 0.4753]],[[-1.3605, 1.9303],[-1.5382, -1.0865],[-0.9208, -0.1754],[ 0.1476, -0.8866],[ 0.4519, 0.2771]],[[ 0.6662, 1.1027],[-0.0912, -0.6284],[-1.0253, -0.3542],[ 0.6909, -1.3905],[-2.1140, 1.3426]]])
tensor([-0.6887, 0.2203, -1.6103, -0.7423, 0.3097, -2.9694, 1.2073, -0.3370,-0.5506, 0.4753, -1.3605, 1.9303, -1.5382, -1.0865, -0.9208, -0.1754,0.1476, -0.8866, 0.4519, 0.2771, 0.6662, 1.1027, -0.0912, -0.6284,-1.0253, -0.3542, 0.6909, -1.3905, -2.1140, 1.3426])
結論
X.view(-1)中的-1本意是根據(剩下維度)來自動調整,但是這里只有一個維度,因此就會將X里面的所有維度數據轉化成一維的,并且按先后順序排列。
dataTar 形狀為 [20,21]
dataTar = dataTar.view(20,-1)
原來的基礎上加-1 是什么作用
改成這種形狀相當于 前面兩位是 batch_size,通道數,后面兩位相當于整個圖片的元素
當元素總數只有比如768的時候,要開方的總數要和768一樣,因為768不能完整開方,所以要padding
改成28x28
pytorch使用view(*args)在不改變張量數據的情況下隨意改變張量的大小和形狀
Song ? 26190 次瀏覽 ? 0 個回復 ? 2017年09月23日torch.Tensor.view會返回具有相同數據但大小不同的新張量。 返回的張量必須有與原張量相同的數據和相同數量的元素,但可以有不同的大小。一個張量必須是連續contiguous()的才能被查看。類似于Numpy的np.reshape()
pytorch中view的用法
torch.Tensor.view會將原有數據重新分配為一個新的張量,比如我們使用:
x = torch.randn(2, 4) 會輸出一個隨機張量:
1.5600 -1.6180 -2.0366 2.71150.8415 -1.0103 -0.4793 1.5734
[torch.FloatTensor of size 2x4] 然后我們看一下使用view重新構造一個Tensor
y = x.view(4,2)
print y
# 輸出如下
1.5600 -1.6180
-2.0366 2.7115
0.8415 -1.0103
-0.4793 1.5734
[torch.FloatTensor of size 4x2]
從這里我們可以看出來他的作用,既然這樣,我們可以將他變成一個三維數組:
z = x.view(2,2,2)
# 輸出
(0 ,.,.) =
1.5600 -1.6180
-2.0366 2.7115
(1 ,.,.) =
0.8415 -1.0103
-0.4793 1.5734
[torch.FloatTensor of size 2x2x2]
注意:我們不能隨便定義參數,需要根據自己的數據使用,比如x.view(2,2,1)會返回錯誤RuntimeError: invalid argument 2: size '[2 x 2 x 1]' is invalid for input of with 8 elements at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/THStorage.c:41
下面是官方的案例:
x = torch.randn(4, 4)
print x
print x.size()
# 輸出(4L, 4L)
y = x.view(16)
print y.size()
# 輸出(16L,)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
print z.size()
# 輸出(2L, 8L)
view_as(tensor)的用法
返回被視作與給定的tensor相同大小的原tensor。 等效于:
self.view(tensor.size())
具體用法為:
a = torch.Tensor(2, 4)
b = a.view_as(torch.Tensor(4, 2))
print b
pytorch中view的選擇
.resize(): 將tensor的大小調整為指定的大小。如果元素個數比當前的內存大小大,就將底層存儲大小調整為與新元素數目一致的大小。如果元素個數比當前內存小,則底層存儲不會被改變。原來tensor中被保存下來的元素將保持不變,但新內存將不會被初始化。.permute(dims):將tensor的維度換位。具體可以自己測試torch.unsqueeze:返回一個新的張量,對輸入的制定位置插入維度
相比之下,如果你想返回相同數量的元素,只是改變數組的形狀推薦使用torch.view()
維度-1從其他維度推導而出也就是剩余的維度
20201210
原來是一個維度[20 ],view -1 變換之后增加了一個維度[20 1]
總結
以上是生活随笔為你收集整理的view(*args)改变张量的大小和形状_pytorch reshape numpy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch中的transpose()
- 下一篇: gelu