未初始化为0时,Pytorch模拟无法收敛于凸损失函数

时间:2019-10-25 12:53:32

标签: python pytorch logistic-regression

当权重初始化为0时,我的代码起作用。当我根据某种种子对其进行初始化时,它们无法收敛。这是个错误,因为损失函数是凸的。

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

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

2 个答案:

答案 0 :(得分:2)

您的数据未重新缩放和标准化。如果您在训练循环中查看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个星期内,我的准确率约为100%。

答案 1 :(得分:0)

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

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