【问题标题】:I am trying to classify flowers with a pretrained network, but for some reason it does not train我正在尝试使用预训练网络对花朵进行分类,但由于某种原因它没有训练
【发布时间】:2018-12-24 06:41:05
【问题描述】:

我目前正在尝试使用 Pytorch 对来自 dataset 的花朵进行分类。

首先,我开始将我的数据转换为训练、验证和测试集。

data_dir = 'flowers'
train_dir = data_dir + '/train'
valid_dir = data_dir + '/valid'
test_dir = data_dir + '/test'

train_transforms = transforms.Compose([transforms.RandomRotation(30),
                                       transforms.RandomResizedCrop(224),
                                       transforms.RandomHorizontalFlip(),
                                       transforms.ToTensor(),
                                       transforms.Normalize([0.485, 0.456, 0.406], 
                                                            [0.229, 0.224, 0.225])])

test_transforms = transforms.Compose([transforms.Resize(224),
                                      transforms.CenterCrop(224),
                                      transforms.ToTensor(),
                                      transforms.Normalize([0.485, 0.456, 0.406], 
                                                           [0.229, 0.224, 0.225])])

之后我用 ImageFolder 加载了数据:

trainset = datasets.ImageFolder(train_dir, transform=train_transforms)
testset = datasets.ImageFolder(test_dir, transform=test_transforms)
validationset = datasets.ImageFolder(valid_dir, transform=test_transforms)

然后我定义了我的 DataLoaders:

trainloader = torch.utils.data.DataLoader(trainset, batch_size = 64, shuffle = True)
testloader = torch.utils.data.DataLoader(testset, batch_size = 32)
validationloader = torch.utils.data.DataLoader(validationset, batch_size = 32)

我选择 vgg 作为我的预训练模型:

model = models.vgg16(pretrained = True)

并定义了一个新的分类器:

for param in model.parameters():
    param.requires_grad = False

classifier = nn.Sequential(OrderedDict([
    ('fc1', nn.Linear(25088, 4096)),
    ('relu', nn.ReLU()),
    ('fc2', nn.Linear(4096, 4096)),
    ('relu', nn.ReLU()),
    ('fc3', nn.Linear(4096, 102)),
    ('output', nn.Softmax(dim = 1))

]))

model.classifier = classifier 

这是实际训练我的神经网络的代码(在 GPU 上):

criterion = nn.NLLLoss()
optimizer = optim.Adam(model.classifier.parameters(), lr = 0.005)

epochs = 9
print_every = 10
steps = 0

model.to('cuda')

for e in range(epochs):
    running_loss = 0

    for ii, (inputs, labels) in enumerate(trainloader):
        steps += 1



        inputs, labels = inputs.to('cuda'), labels.to('cuda')

        optimizer.zero_grad()

        # Forward and backward 
        outputs = model.forward(inputs)
        loss = criterion(outputs, labels)



        loss.backward()
        optimizer.step()

        running_loss += loss.item()



        if steps % print_every == 0:
            print("Epoch: {}/{}... ".format(e+1, epochs),
                  "Loss: {:.4f}".format(running_loss/print_every))

            running_loss = 0

但是当我运行我的模型时,损失是随机的,我不知道为什么。

感谢您提前提供的任何帮助和来自德国的问候!

【问题讨论】:

    标签: python python-3.x deep-learning classification pytorch


    【解决方案1】:

    这里有一些提示——我认为它们会有所帮助:

    1. 尝试做一些超参数优化。 (即在 1e-2 到 1e-6 等域上尝试 10 个学习率)更多信息:(http://cs231n.github.io/neural-networks-3/#hyper)
    2. 编码并打印准确度指标(连同损失一起打印),因为您可能会惊讶于预训练模型的准确度会有多高。
    3. 尝试切换到 model = models.vgg16_bn(pretrained = True) 或者更大的网络,例如 vgg 19 或 resnet34

    你能包括你的准确性和每个时期的损失吗?

    如果这些提示有帮助,请告诉我!

    (来自美国的你好)

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2019-06-23
      • 2019-05-14
      • 2016-12-18
      • 2020-04-08
      • 1970-01-01
      • 2016-02-19
      • 2017-07-18
      • 1970-01-01
      相关资源
      最近更新 更多