【问题标题】:Pytorch simulation fails to converge on convex loss function when not initialized with 0未使用 0 初始化时,Pytorch 模拟无法收敛于凸损失函数
【发布时间】:2020-02-21 19:54:29
【问题描述】:

当权重初始化为 0 时,我的代码可以工作。当我根据某些种子初始化它们时,它们无法收敛。这应该是一个错误,因为损失函数是凸的。

我从 MNIST(0 和 1)中过滤了两个标签,然后使用 pytorch 训练了一个逻辑回归模型。由于我只使用了 200 个训练样本(和 784 个参数),因此模型应该在训练集上快速收敛到 100% 的准确度。当权重由某个种子初始化时,情况并非如此。

我在 stackoverflow 上分享我的代码时遇到了一些问题,所以这里是代码的链接:https://drive.google.com/file/d/1ELe8TIWrXMiXgsB63B0Ss43GPr719rGc/view?usp=sharing

【问题讨论】:

    标签: python pytorch logistic-regression


    【解决方案1】:

    您的数据未重新缩放和标准化。如果您查看训练循环中的 images 变量,它在 0 到 255 之间,这很可能会损害您的训练过程。

    有更简洁的方法可以根据需要对数据集进行二次采样,但无需修改太多代码,使用此数据加载定义

    import torchvision.transforms as transforms
    
    #Load Dataset
    preprocessing = transforms.Compose([transforms.ToTensor(),
                                        transforms.Normalize((0.1307,), (0.3081,))
                                       ])
    train_dataset = dsets.MNIST(root='./data', train=True, transform=preprocessing, download=True)
    
    #Filter samples by label (to get binary classification) and by number of training samples
    Binary_filter=torch.add(train_dataset.targets==1, train_dataset.targets==0)
    train_dataset.data, train_dataset.targets = train_dataset.data[Binary_filter],train_dataset.targets[Binary_filter]
    
    TrainSet_filter=torch.cat((torch.ones(num_of_training_samples)
                             ,torch.zeros(len(train_dataset.targets)-num_of_training_samples)),0).bool()
    train_dataset.data, train_dataset.targets = train_dataset.data[TrainSet_filter], train_dataset.targets[TrainSet_filter]
    
    #Make Dataset Iterable
    train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
    

    我在大约 5-10 个 epoch 内有大约 100% 的准确率。

    【讨论】:

    • 嗨,很遗憾,这不是问题所在。我用了你的改变。在这个模拟中仍然有一些非常奇怪的东西。即使训练集包含 20 个样本,我在火车上也没有得到 100% 的准确率(只有 90%),而如果我将权重初始化为 0,我在 7 个 epoch 后得到 100% 的准确率。我应该在火车上获得 100% 的准确率
    • 试试lr=1e-3。 10^-7 是一个非常低的值,您可能由于未重新缩放而不得不使用它。
    【解决方案2】:

    您的损失函数 (BCE) 仅相对于深度网络的输出是凸的,而不是相对于权重。

    你绝对不能假设任何局部最小值也是全局最小值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2020-05-05
      • 2018-05-03
      • 1970-01-01
      • 2017-10-10
      • 2012-05-21
      • 1970-01-01
      相关资源
      最近更新 更多