我试图将线性层应用于一个二维张量矩阵,仅按列连接,如下图所示。
输入形状为(batch_size, 3, 50)。我首先尝试使用二维卷积,添加一个1通道维度,因此输入形状变为(batch_size, 1, 3, 50)
import torch.nn as nn
import torch
class ColumnConv(nn.Module):
def __init__(self):
self.layers = nn.Sequential(
nn.Conv2d(
in_channels=1,
out_channels=1,
kernel_size=(3, 1),
stride=1,
), # 形状为 B, 1, 1, 50
nn.ReLU(),
nn.Flatten() #形状为 B, 50
)
def forward(self, x):
return self.layers(x)
但似乎不起作用。我计划使用50个nn.Linear
层的列表,并将它们应用于输入的列切片,但这似乎更像是对性能不优化的解决方案。
有没有更“PyTorch风格”的方法来做这件事?
回答:
PyTorch的nn.Linear
模块可以应用于多维输入,线性层将应用于最后一个维度,因此要按列应用,解决方案是交换行和列。
linear_3_to_1 = nn.Linear(3, 1)
x = torch.randn(1, 1, 3, 50)
x = x.transpose(2, 3) #交换3和50
out = linear_3_to_1(x).flatten()