当权重初始化为0时,我的代码起作用。当我根据某种种子对其进行初始化时,它们无法收敛。这是个错误,因为损失函数是凸的。
我从MNIST过滤了两个标签(0和1),然后使用pytorch训练了逻辑回归模型。由于我仅使用200个训练样本(和784个参数),因此模型应在训练集上迅速收敛至100%的准确性。当权重由某个种子初始化时,情况并非如此。
我在共享stackoverflow时遇到一些问题,因此这里是代码的链接:https://drive.google.com/file/d/1ELe8TIWrXMiXgsB63B0Ss43GPr719rGc/view?usp=sharing
答案 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)仅对于深度网络的输出是凸的,而不是权重。
您绝对不能假设任何局部最小值也是全局最小值。