gpt4 book ai didi

python - kernel_size=1 的 Conv1D 与线性层

转载 作者:行者123 更新时间:2023-12-01 01:03:40 34 4
gpt4 key购买 nike

我正在研究非常稀疏的向量作为输入。我开始使用简单的线性(密集/完全连接层),我的网络产生了相当好的结果(让我们以准确度作为我的指标,95.8%)。

我后来尝试使用带有 kernel_size=1MaxPool1dConv1d,这个网络效果稍好一些(准确率 96.4%) )。

问题:这两种实现有何不同?单位为 kernel_sizeConv1d 不应该与 Linear 层执行相同的操作吗?

我尝试了多次运行,CNN 总是会产生稍微好一点的结果。

最佳答案

内核大小为 1 的

nn.Conv1dnn.Linear 给出的结果基本相同。唯一的区别是初始化过程和操作的应用方式(这对速度有一些影响)。请注意,使用线性层应该更快,因为它是作为简单的矩阵乘法实现的(+添加广播的偏差向量)

@RobinFrcd 您的答案可能由于 MaxPool1d 或由于不同的初始化过程而不同。

以下是一些实验来证明我的主张:

def count_parameters(model):
"""Count the number of parameters in a model."""
return sum([p.numel() for p in model.parameters()])

conv = torch.nn.Conv1d(8,32,1)
print(count_parameters(conv))
# 288

linear = torch.nn.Linear(8,32)
print(count_parameters(linear))
# 288

print(conv.weight.shape)
# torch.Size([32, 8, 1])
print(linear.weight.shape)
# torch.Size([32, 8])

# use same initialization
linear.weight = torch.nn.Parameter(conv.weight.squeeze(2))
linear.bias = torch.nn.Parameter(conv.bias)

tensor = torch.randn(128,256,8)
permuted_tensor = tensor.permute(0,2,1).clone().contiguous()

out_linear = linear(tensor)
print(out_linear.mean())
# tensor(0.0067, grad_fn=<MeanBackward0>)

out_conv = conv(permuted_tensor)
print(out_conv.mean())
# tensor(0.0067, grad_fn=<MeanBackward0>)

速度测试:

%%timeit
_ = linear(tensor)
# 151 µs ± 297 ns per loop

%%timeit
_ = conv(permuted_tensor)
# 1.43 ms ± 6.33 µs per loop

正如 Hanchen 的回答所示,由于数值精度的原因,结果可能会略有不同。

关于python - kernel_size=1 的 Conv1D 与线性层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55576314/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com