Python pytorch损耗值不变

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

我根据本文编写了一个模块:

其思想是将输入传递到多个流中,然后连接到一个FC层。我将源代码分为3个自定义模块:
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)