在机器翻译中,我们总是需要在注解和预测中切出第一个时间步(SOS令牌)。
当使用batch_first=False
时,切掉第一个时间步仍然保持Tensor连续。
import torch
batch_size = 128
seq_len = 12
embedding = 50
# Making a dummy output that is `batch_first=False`
batch_not_first = torch.randn((seq_len,batch_size,embedding))
batch_not_first = batch_first[1:].view(-1, embedding) # slicing out the first time step
然而,如果我们使用batch_first=True
,切片后,Tensor不再是连续的。我们需要在进行view
等不同操作之前使其连续。
batch_first = torch.randn((batch_size,seq_len,embedding))
batch_first[:,1:].view(-1, embedding) # slicing out the first time step
output>>>
"""
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-8-a9bd590a1679> in <module>
----> 1 batch_first[:,1:].view(-1, embedding) # slicing out the first time step
RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.
"""
这是否意味着batch_first=False
更好,至少,在机器翻译的背景下?因为它使我们不必执行contiguous()
步骤。是否有任何情况下,batch_first=True
工作得更好?
1条答案
按热度按时间bvjxkvbb1#
性能
batch_first=True
和batch_first=False
之间似乎没有太大的区别。请参阅下面的脚本:在我的设备(GTX 1050 Ti)上,PyTorch
1.6.0
和CUDA 11.0的结果如下:(and它以任何方式变化,所以没有结论性的)。
代码可读性
当你想使用其他需要
batch
作为0
第一维的PyTorch层时,batch_first=True
更简单(几乎所有的torch.nn
层都是这样,比如torch.nn.Linear
)。在这种情况下,如果指定了
batch_first=False
,则无论如何都必须返回permute
Tensor。机器翻译
它应该更好,因为
tensor
始终是连续的,并且不需要复制数据。使用[1:]
而不是[:,1:]
进行切片看起来也更干净。