将大小为 768 的张量转换为 128
Convert tensor of size 768 to 128
我想使用 nn.Conv()
在 pytorch 中对形状 [197, 1, 768]
到 [197,1,128]
的张量进行投影
您可以使用宽扁平内核 and/or 结合特定步幅来实现此目的。如果你坚持 1
的膨胀,那么 input/output 空间维度关系由下式给出:
out = [(2p + x - k)/s + 1]
其中 p
是填充,k
是内核大小,s
是步幅。 []
引爆整个部分数量
在这里申请你有:
128 = [(2p + 768 - k)/s + 1]
所以你会得到:
p = 2*p + 768 - (128-1)*s # one off
如果你施加 p = 0
,并且 s = 6
你会发现 k = 6
>>> project = nn.Conv2d(197, 197, kernel_size=(1, 6), stride=6)
>>> project(torch.rand(1, 197, 1, 768)).shape
torch.Size([1, 197, 1, 128])
或者,一种更直接但不同的方法是使用全连接层学习映射:
>>> project = nn.Linear(768, 128)
>>> project(torch.rand(1, 197, 1, 768)).shape
torch.Size([1, 197, 1, 128])
您可以使用内核大小和步长 6,因为这是输入和输出时间大小之间的因数:
x = torch.randn(197, 1, 768)
conv = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=6, stride=6)
out = conv(x)
print(out.shape)
> torch.Size([197, 1, 128])
我想使用 nn.Conv()
[197, 1, 768]
到 [197,1,128]
的张量进行投影
您可以使用宽扁平内核 and/or 结合特定步幅来实现此目的。如果你坚持 1
的膨胀,那么 input/output 空间维度关系由下式给出:
out = [(2p + x - k)/s + 1]
其中 p
是填充,k
是内核大小,s
是步幅。 []
引爆整个部分数量
在这里申请你有:
128 = [(2p + 768 - k)/s + 1]
所以你会得到:
p = 2*p + 768 - (128-1)*s # one off
如果你施加 p = 0
,并且 s = 6
你会发现 k = 6
>>> project = nn.Conv2d(197, 197, kernel_size=(1, 6), stride=6)
>>> project(torch.rand(1, 197, 1, 768)).shape
torch.Size([1, 197, 1, 128])
或者,一种更直接但不同的方法是使用全连接层学习映射:
>>> project = nn.Linear(768, 128)
>>> project(torch.rand(1, 197, 1, 768)).shape
torch.Size([1, 197, 1, 128])
您可以使用内核大小和步长 6,因为这是输入和输出时间大小之间的因数:
x = torch.randn(197, 1, 768)
conv = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=6, stride=6)
out = conv(x)
print(out.shape)
> torch.Size([197, 1, 128])