相关疑难解决方法(0)

"视图"方法在PyTorch中如何工作?

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()通过一些例子解释功能的主要原理吗?

python memory torch pytorch tensor

144
推荐指数
5
解决办法
9万
查看次数

如何判断NumPy是创建视图还是副本?

对于最小的工作示例,让我们数字化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在这种情况下,如何知道副本是否"需要"?通常 - 有没有办法可以确定特定操作是创建副本还是视图?

python numpy copy

63
推荐指数
2
解决办法
1万
查看次数

Numpy View重塑没有复制(2d移动/滑动窗口,跨步,蒙面内存结构)

我有一个图像存储为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)

python numpy image scikit-learn scikit-image

7
推荐指数
1
解决办法
1537
查看次数

Python - 反转数组的所有其他切片

我编写了一些代码来反转每隔一行的行。

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

1
推荐指数
1
解决办法
175
查看次数

标签 统计

python ×4

numpy ×2

copy ×1

image ×1

memory ×1

pytorch ×1

scikit-image ×1

scikit-learn ×1

tensor ×1

torch ×1