我试图复制如何使用包装为rnn的可变长度序列输入,但我想我首先需要理解为什么我们需要"打包"序列.
我理解为什么我们需要"填充"它们,但为什么要"打包"(通过pack_padded_sequence
)必要?
任何高级别的解释将不胜感激!
deep-learning recurrent-neural-network pytorch tensor zero-padding
我在github上看到了这个LSTM语言模型的例子(链接).它一般来说对我来说非常清楚.但是我仍然在努力理解调用的内容contiguous()
,这在代码中会多次发生.
例如,在代码输入的第74/75行中,创建LSTM的目标序列.数据(存储在其中ids
)是二维的,其中第一维是批量大小.
for i in range(0, ids.size(1) - seq_length, seq_length):
# Get batch inputs and targets
inputs = Variable(ids[:, i:i+seq_length])
targets = Variable(ids[:, (i+1):(i+1)+seq_length].contiguous())
Run Code Online (Sandbox Code Playgroud)
举个简单的例子,当使用批量大小为1和seq_length
10时inputs
,targets
看起来像这样:
inputs Variable containing:
0 1 2 3 4 5 6 7 8 9
[torch.LongTensor of size 1x10]
targets Variable containing:
1 2 3 4 5 6 7 8 9 10
[torch.LongTensor of size 1x10]
Run Code Online (Sandbox Code Playgroud)
所以一般来说我的问题是,contiguous()
我需要什么以及为什么需要它?
此外,我不明白为什么该方法被调用目标序列而不是输入序列,因为两个变量都包含相同的数据.
怎么可能targets
是inputs
不连续的,仍然是连续的? …
我知道两种从梯度计算中排除计算元素的方法 backward
方法一:使用with torch.no_grad()
with torch.no_grad():
y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y)
loss.backward();
Run Code Online (Sandbox Code Playgroud)
方法二:使用.detach()
y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y.detach())
loss.backward();
Run Code Online (Sandbox Code Playgroud)
这两者有区别吗?两者都有好处/坏处吗?
如何利用torch.utils.data.Dataset
和torch.utils.data.DataLoader
你自己的数据(不只是torchvision.datasets
)?
有没有办法使用DataLoaders
他们使用的内置TorchVisionDatasets
在任何数据集上使用?
在numpy中,我们ndarray.reshape()
用于重塑数组.
我注意到在pytorch中,人们使用torch.view(...)
同样的目的,但同时也torch.reshape(...)
存在.
所以我想知道他们和我应该使用其中任何一个之间的差异是什么?
为什么我们需要在PyTorch中明确归零渐变?loss.backward()
调用时为什么渐变不能归零?通过在图表上保持渐变并要求用户明确归零渐变来实现什么样的场景?
我试图将当前代码与 A100 GPU 一起使用,但出现此错误:
---> backend='nccl'
/home/miranda9/miniconda3/envs/metalearningpy1.7.1c10.2/lib/python3.8/site-packages/torch/cuda/__init__.py:104: UserWarning:
A100-SXM4-40GB with CUDA capability sm_80 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_61 sm_70 sm_75 compute_37.
If you want to use the A100-SXM4-40GB GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
Run Code Online (Sandbox Code Playgroud)
这相当令人困惑,因为它指向通常的 pytorch 安装,但没有告诉我将 pytorch 版本 + cuda 版本的哪种组合用于我的特定硬件(A100)。为 A100 安装 pytorch 的正确方法是什么?
这些是我尝试过的一些版本:
# conda install -y pytorch==1.8.0 torchvision cudatoolkit=10.2 -c pytorch
# conda install -y pytorch torchvision cudatoolkit=10.2 …
Run Code Online (Sandbox Code Playgroud) 总而言之:
经过训练来预测函数的简单(单隐藏层)前馈 Pytorch 模型的性能y = sin(X1) + sin(X2) + ... sin(X10)
明显低于使用 Keras 构建/训练的相同模型。为什么会这样?可以采取哪些措施来减轻性能差异?
在训练回归模型时,我注意到 PyTorch 的性能远远低于使用 Keras 构建的相同模型。
之前已经观察到并报道过这种现象:
此前也已做出以下解释和建议:
在 NumPy 中,我会做
a = np.zeros((4, 5, 6))
a = a[:, :, np.newaxis, :]
assert a.shape == (4, 5, 1, 6)
Run Code Online (Sandbox Code Playgroud)
如何在 PyTorch 中做同样的事情?
我无法理解PyTorch的LSTM模块(以及类似的RNN和GRU)的文档.关于产出,它说:
输出:输出,(h_n,c_n)
- output(seq_len,batch,hidden_size*num_directions):包含来自RNN最后一层的输出要素(h_t)的张量,每个t.如果已将torch.nn.utils.rnn.PackedSequence作为输入,则输出也将是打包序列.
- h_n(num_layers*num_directions,batch,hidden_size):包含t = seq_len隐藏状态的张量
- c_n(num_layers*num_directions,batch,hidden_size):包含t = seq_len的单元格状态的张量
似乎变量output
和h_n
两者都给出了隐藏状态的值.是否h_n
只是冗余地提供已经包含的最后一个时间步骤output
,或者还有什么比它更多的东西?
pytorch ×10
python ×4
adam ×1
autograd ×1
contiguous ×1
keras ×1
lstm ×1
tensor ×1
tensorflow ×1
torch ×1
zero-padding ×1