Python pytorch损耗值不变
我根据本文编写了一个模块: 其思想是将输入传递到多个流中,然后连接到一个FC层。我将源代码分为3个自定义模块:Python pytorch损耗值不变,python,deep-learning,pytorch,Python,Deep Learning,Pytorch,我根据本文编写了一个模块: 其思想是将输入传递到多个流中,然后连接到一个FC层。我将源代码分为3个自定义模块:textclassfycnnet>flatcnnelayer>FilterLayer 过滤层: class FilterLayer(nn.Module): def __init__(self, filter_size, embedding_size, sequence_length, out_channels=128): super(FilterLayer, se
textclassfycnnet
>flatcnnelayer
>FilterLayer
过滤层:
class FilterLayer(nn.Module):
def __init__(self, filter_size, embedding_size, sequence_length, out_channels=128):
super(FilterLayer, self).__init__()
self.model = nn.Sequential(
nn.Conv2d(1, out_channels, (filter_size, embedding_size)),
nn.ReLU(inplace=True),
nn.MaxPool2d((sequence_length - filter_size + 1, 1), stride=1)
)
for m in self.modules():
if isinstance(m, nn.Conv2d):
n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
m.weight.data.normal_(0, math.sqrt(2. / n))
def forward(self, x):
return self.model(x)
平面层:
class FlatCnnLayer(nn.Module):
def __init__(self, embedding_size, sequence_length, filter_sizes=[3, 4, 5], out_channels=128):
super(FlatCnnLayer, self).__init__()
self.filter_layers = nn.ModuleList(
[FilterLayer(filter_size, embedding_size, sequence_length, out_channels=out_channels) for
filter_size in filter_sizes])
def forward(self, x):
pools = []
for filter_layer in self.filter_layers:
out_filter = filter_layer(x)
# reshape from (batch_size, out_channels, h, w) to (batch_size, h, w, out_channels)
pools.append(out_filter.view(out_filter.size()[0], 1, 1, -1))
x = torch.cat(pools, dim=3)
x = x.view(x.size()[0], -1)
x = F.dropout(x, p=dropout_prob, training=True)
return x
textClassifyCnnet(主模块):
似乎每个历元的参数都会稍微更新,整个过程的精度都会保持不变。在Tensorflow中使用相同的实现和相同的参数时,它可以正确运行
我是Pytorch的新手,所以可能我的说明有问题,请帮我找出原因。谢谢大家!
附言:我尝试使用
F.nll\u损失
+F.log\u softmax
而不是F.cross\u熵
。理论上,它应该返回相同的结果,但实际上打印出了另一个结果(但它仍然是一个错误的损失值)我意识到Adam Optimizer中的L2_损失使损失
值保持不变(我还没有在其他优化器中尝试过)。当我移除L2_损失时,它会起作用:
# optimizer = optim.Adam(net.parameters(), lr=0.01, weight_decay=0.1)
optimizer = optim.Adam(model.parameters(), lr=0.001)
==更新(有关更多详细信息,请参见上面的答案!)===
我已经看到,在您的原始代码中,
权重衰减
项设置为0.1
<代码>权重衰减用于调整网络参数。这个术语可能太强,以至于正则化太多。尝试减小重量衰减的值
用于计算机视觉任务中的卷积神经网络重量衰减
项通常设置为5e-4
或5e-5
。我不熟悉文本分类。这些值可能适用于您的开箱即用,或者您必须通过尝试和错误稍微调整它
让我知道它是否适用于您。如何仅为完全连接的层设置weight\u decay
?或者为每种类型的层设置特定的重量衰减
,这在PyTorch中很容易实现。优化器接受参数组,在每个参数组中,您可以分别设置lr
,weight\u decay
。有关更多信息,请参阅。此外,在谷歌上搜索pytorch不同层的不同学习率将为您提供大量信息。另一个资源是奇妙的。在发布问题之前,请确保在论坛中搜索,因为已经提出了许多问题,并且有很好的答案。@VietPhan减少重量衰减值对您有效吗?我已禁用conv2d的重量衰减,并且仅在FC上使用。它起作用了!
# optimizer = optim.Adam(net.parameters(), lr=0.01, weight_decay=0.1)
optimizer = optim.Adam(model.parameters(), lr=0.001)
self.features = nn.Sequential(self.flat_layer)
self.classifier = nn.Linear(out_channels * len(filter_sizes), num_classes)
...
optimizer = optim.Adam([
{'params': model.features.parameters()},
{'params': model.classifier.parameters(), 'weight_decay': 0.1}
], lr=0.001)