标签: torch

访问 torch 中的参数名称

我需要将 torch 模型转换为 pytorch。由于torch模型具有pytorch不支持的层(例如inception和LRN),因此无法使用内置API。为了将此类模型从 torch 转换为 pytorch,需要在 pytorch 中实现此类层,并将 torch 模型中的所有参数保存为 hdf5 文件,并将它们作为字典重新加载到 python 中。我是lua新手,我想问一下如何访问torch中所有参数的“昵称”。

顺便说一句,这可以在 pytorch 中轻松完成,例如:

import torch.nn as nn
model = nn.Sequential(
                nn.Conv2d(in_channels=3,out_channels=32,kernel_size=7,stride=1,bias=False),
                nn.ReLU(inplace=True),
                nn.BatchNorm2d(num_features=32,affine=True),
                nn.MaxPool2d(kernel_size=2,stride=2)
                )
for key in model.state_dict():
    value = model.state_dict().get(key)
    print(key, value.size())
Run Code Online (Sandbox Code Playgroud)

如果所有参数都可以以字典格式访问,则可以通过以下代码在 pytorch 中重建模型:

model = MyNewInceptionModel()
model.load_state_dict(param_dict)
Run Code Online (Sandbox Code Playgroud)

torch pytorch

5
推荐指数
0
解决办法
3501
查看次数

使用 PyTorch 张量将对角线屏蔽为特定值

如何用 torch 中的值填充对角线?在 numpy 中你可以这样做:

a = np.zeros((3, 3), int)
np.fill_diagonal(a, 5)

array([[5, 0, 0],
       [0, 5, 0],
       [0, 0, 5]])
Run Code Online (Sandbox Code Playgroud)

我知道torch.diag()返回对角线,但如何使用它作为掩码来分配新值超出了我的范围。我无法在这里或 PyTorch 文档中找到答案。

python diagonal torch pytorch

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

删除 Torch 张量中的行

我有一个火炬张量如下 -

a = tensor(
[[0.2215, 0.5859, 0.4782, 0.7411],
[0.3078, 0.3854, 0.3981, 0.5200],
[0.1363, 0.4060, 0.2030, 0.4940],
[0.1640, 0.6025, 0.2267, 0.7036],
[0.2445, 0.3032, 0.3300, 0.4253]],  dtype=torch.float64)
Run Code Online (Sandbox Code Playgroud)

如果每行的第一个值小于 0.2,则需要删除整行。因此我需要像这样的输出 -

tensor(
[[0.2215, 0.5859, 0.4782, 0.7411],
[0.3078, 0.3854, 0.3981, 0.5200],
[0.2445, 0.3032, 0.3300, 0.4253]],  dtype=torch.float64)
Run Code Online (Sandbox Code Playgroud)

我尝试循环遍历张量并将有效值附加到新的空张量,但没有成功。有什么办法可以高效的得到结果吗?

python torch pytorch tensor

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

PyTorch:按自定义顺序有效地交错两个张量

我想z从两个张量创建一个新的张量,例如x和 ,y其尺寸分别为[N_samples, S, N_feats][N_samples, T, N_feats]。目的是通过以特定顺序混合第二个维度的元素来组合第二个维度上的两个张量,该顺序存储在order带有维度的变量中[N_samples, U]

每个样本的排序都不同,基本上是从哪个张量中提取哪个索引。order[0]对于给定的样本- ,它看起来像这样[x_0, x_1, y_0, x_2, y_1, ... ],其中字母表示张量,数字表示第二个暗淡的索引。所以z[0]会是

z[0] = [x[0, 0, :], x[0, 1, :], y[0, 0, :], x[0, 2, :], y[0, 1, :] ... ]

我将如何实现这一目标?我写了一些东西试图torch.gather做到这一点。

x = torch.rand((2, 4, 5))
y = torch.rand((2, 3, 5))

# new ordering of second dim
# positive means take (n-1)th element from …
Run Code Online (Sandbox Code Playgroud)

python torch pytorch tensor

5
推荐指数
0
解决办法
1343
查看次数

如何将张量列表转换为 torch::Tensor?

我正在尝试将以下 Python 代码转换为其等效的 libtorch:

tfm = np.float32([[A[0, 0], A[1, 0], A[2, 0]],
                  [A[0, 1], A[1, 1], A[2, 1]]
                 ])
Run Code Online (Sandbox Code Playgroud)

在 Pytorch 中,我们可以简单地使用torch.stack或简单地使用torch.tensor()如下所示:

tfm = torch.tensor([[A_tensor[0,0], A_tensor[1,0],0],
                    [A_tensor[0,1], A_tensor[1,1],0]
                   ])
Run Code Online (Sandbox Code Playgroud)

然而,在 libtorch 中,这并不成立,那就是我不能简单地这样做:

auto tfm = torch::tensor ({{A.index({0,0}), A.index({1,0}), A.index({2,0})},
                           {A.index({0,1}), A.index({1,1}), A.index({2,1})}
                         });
Run Code Online (Sandbox Code Playgroud)

甚至使用 a 也std::vector不起作用。同样的事情也发生在 torch::stack 上。我目前正在使用三个torch::stack来完成此任务:

auto x = torch::stack({ A.index({0,0}), A.index({1,0}), A.index({2,0}) });
auto y = torch::stack({ A.index({0,1}), A.index({1,1}), A.index({2,1}) });
tfm = torch::stack({ x,y });
Run Code Online (Sandbox Code Playgroud)

那么有没有更好的方法来做到这一点呢?我们可以使用单行代码来完成此操作吗?

c++ torch libtorch

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

从 Pytorch C++ 中的 c10::Dict<c10::IValue, c10::IValue> 获取值

我在 Pytorch C++ 前端使用 TorchScript 模型。

Python 中的模型返回一个outputdict 作为 Dict[str, List[torch.Tensor]].

当我在 C++ 中使用它时,它返回一个c10::Dict<c10::IValue, c10::IValue>. 这段 Python 代码的等价物是什么:

value_a = output['key_a']
value_b = output['key_b']
Run Code Online (Sandbox Code Playgroud)

在 C++ 中从中获取值c10::Dict

我已经尝试过了,但它不起作用。

torch::IValue key_a("key_a");
torch::IValue key_b("key_b");
c10::IValue value_a = output[key_a];
c10::IValue value_b = output[key_b];
std::cout << value_a << std::endl;
std::cout << value_b << std::endl;
Run Code Online (Sandbox Code Playgroud)

和错误:

error: type 'c10::Dict<c10::IValue, c10::IValue>' does not provide a subscript operator
Run Code Online (Sandbox Code Playgroud)

c++ torch pytorch torchscript libtorch

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

Pytorch 从张量文件中读取张量(从磁盘进行流训练)

我有一些非常大的输入张量,在构建它们时遇到了内存问题,所以我将它们一一读入文件中.pt。当我运行生成并保存文件的脚本时,文件变得越来越大,因此我假设张量正确保存。这是该代码:

with open(a_sync_save, "ab") as f:
     print("saved")
     torch.save(torch.unsqueeze(torch.cat(tensors, dim=0), dim=0), f)
Run Code Online (Sandbox Code Playgroud)

我想一次从文件中读取一定数量的张量,因为我不想再次遇到内存问题。当我尝试读取保存到文件中的每个张量时,我只能设法获取第一个张量。

with open(a_sync_save, "rb") as f:
    for tensor in torch.load(f):
        print(tensor.shape)
Run Code Online (Sandbox Code Playgroud)

这里的输出是第一个张量的形状,然后平静退出。

python-3.x torch pytorch

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

PyTorch 阶乘函数

似乎没有用于计算阶乘的 PyTorch 函数。PyTorch 有没有办法做到这一点?我希望在 Torch 中手动计算泊松分布(我知道存在这种分布:https: //pytorch.org/docs/stable/ generated /torch.poisson.html),并且该公式需要分母中的阶乘。

泊松分布: https: //en.wikipedia.org/wiki/Poisson_distribution

python math deep-learning torch pytorch

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

如何在 PyTorch 中提取线性层的权重和偏差?

在 中model.state_dict(),模块的权model.parameters()model.named_parameters()和偏差nn.Linear()分别包含,eqfc1.weightfc1.bias。有没有一种简单的Pythonic方法来获取它们?

预期的示例类似于:

layer = model['fc1']
print(layer.weight)
print(layer.bias)
Run Code Online (Sandbox Code Playgroud)

python torch pytorch

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

PyTorch 中的左移张量

我有一个a形状张量(1, N, 1)。我需要沿维度左移张量1并添加一个新值作为替换。我找到了一种方法来完成这项工作,下面是代码。

a = torch.from_numpy(np.array([1, 2, 3]))
a = a.unsqueeze(0).unsqeeze(2)  # (1, 3, 1), my data resembles this shape, therefore the two unsqueeze
# want to left shift a along dim 1 and insert a new value at the end
# I achieve the required shifts using the following code
b = a.squeeze
c = b.roll(shifts=-1)
c[-1] = 4
c = c.unsqueeze(0).unsqueeze(2)
# c = [[[2], [3], [4]]]
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有更简单的方法来做到这一点?谢谢。

python-3.x torch

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