我view()对以下代码片段中的方法感到困惑.
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2,2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16*5*5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
Run Code Online (Sandbox Code Playgroud)
我的困惑在于以下几行.
x = x.view(-1, 16*5*5)
Run Code Online (Sandbox Code Playgroud)
tensor.view()功能有什么作用?我已经在许多地方看到了它的用法,但我无法理解它如何解释它的参数.
如果我将负值作为参数给view()函数会发生什么?例如,如果我打电话会发生什么tensor_variable.view(1, 1, -1)?
任何人都可以view()通过一些例子解释功能的主要原理吗?
对于最小的工作示例,让我们数字化2D数组.numpy.digitize需要一维数组:
import numpy as np
N = 200
A = np.random.random((N, N))
X = np.linspace(0, 1, 20)
print np.digitize(A.ravel(), X).reshape((N, N))
Run Code Online (Sandbox Code Playgroud)
现在文档说:
......只在需要时才制作副本.
ravel在这种情况下,如何知道副本是否"需要"?通常 - 有没有办法可以确定特定操作是创建副本还是视图?
我有一个图像存储为2d numpy数组(可能是multi-d).
我可以在反射2d滑动窗口的数组上进行视图,但是当我重塑它以使每行都是一个平坦的窗口(行是窗口,列是该窗口中的一个像素)时,python会生成一个完整的副本.它这样做是因为我使用了典型的步幅技巧,并且新形状在内存中不连续.
我需要这个,因为我将整个大图像传递给sklearn分类器,该分类器接受2d矩阵,其中没有批处理/部分拟合程序,并且完整的扩展副本对于存储器来说太大了.
我的问题:如果没有完整地复制视图,有没有办法做到这一点?
我相信一个答案将是(1)关于我忽略的步幅或numpy内存管理,或者(2)python的某种屏蔽内存结构,它可以模拟一个numpy数组,甚至包括像sklearn这样的外部包用Cython.
这种在内存中移动二维图像窗口的训练任务很常见,但我所知道的唯一一个直接考虑补丁的尝试是Vigra项目(http://ukoethe.github.io/vigra/).
谢谢您的帮助.
>>> A=np.arange(9).reshape(3,3)
>>> print A
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> xstep=1;ystep=1; xsize=2; ysize=2
>>> window_view = np.lib.stride_tricks.as_strided(A, ((A.shape[0] - xsize + 1) / xstep, (A.shape[1] - ysize + 1) / ystep, xsize, ysize),
... (A.strides[0] * xstep, A.strides[1] * ystep, A.strides[0], A.strides[1]))
>>> print window_view
[[[[0 1]
[3 4]]
[[1 2]
[4 5]]]
[[[3 4]
[6 7]]
[[4 5]
[7 8]]]]
>>>
>>> np.may_share_memory(A,window_view)
True …Run Code Online (Sandbox Code Playgroud) 我编写了一些代码来反转每隔一行的行。
import numpy as np
test_arr = np.arange(120).reshape(12,10)
test_arr = test_arr.tolist()
def rev_rows(matrix):
for I in range(len(matrix)): #did this to get the index of each row
if((int(I / 4) % 2) == True): #selct rows whose index divided by 4 truncate to an odd number
print("flip")
matrix[I].reverse() #flip said row
print(matrix[I])
rev_rows(test_arr)
Run Code Online (Sandbox Code Playgroud)
必须有一种更简单、更有效的方法来做到这一点。我在想另一种方法是使用切片等列表运算符,但我想不出比这更快的方法。numpy 有更简单的方法吗?
注意:矩阵的长度可以被 4 整除。即 (4x10), (8x10), ...
很抱歉切片的用法不明确。我所说的切片是一组行(例如 test_arr[3] -> test_arr[7])。因此,反转所有其他切片将反转索引 3 和 7 之间的每一行。我在关于切片运算符的小简介中我正在谈论这个运算符 -> [3:7]。我没有使用它们的经验,我在某处读到它们被称为切片,我的错。
python ×4
numpy ×2
copy ×1
image ×1
memory ×1
pytorch ×1
scikit-image ×1
scikit-learn ×1
tensor ×1
torch ×1