gpt4 book ai didi

python - 我正在尝试使用预训练网络对花朵进行分类,但由于某种原因它无法训练

转载 作者:行者123 更新时间:2023-11-28 18:09:54 25 4
gpt4 key购买 nike

我目前正在尝试使用 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)

然后我定义了我的 DataLoader:

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

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

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

最佳答案

这里有一些提示 - 按照我认为它们会有所帮助的顺序排列:

  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

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

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

(来自美国的你好)

关于python - 我正在尝试使用预训练网络对花朵进行分类,但由于某种原因它无法训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51366521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com