大模型初学之finetune的一个小example

finutune指的是教会模型如何取处理输入的query和怎么去表达response。

目前读的文章还比较少,对这一块儿认知不多,借用GPT工具写了一个finutune的小例子。

以下这段代码中的微调(Fine-tuning)主要体现在以下几个方面(gpt生成,正确性未考证): 加载预训练模型:代码中的 model 通常是在像ImageNet这样的大型数据集上预先训练过的。

修改最后的层:对于微调,我们通常会替换预训练模型的最后一层(或几层),以适应我们的特定任务(例如改变输出类的数量)。这就是模型从原始训练适应到新任务的地方。

在新数据集上训练:在 trainloader 上的循环表明模型正在新数据集上进行训练(或微调)。微调通常涉及到在更小的、特定任务的数据集上进行较短时间的训练。

冻结层(可选):有时,在微调中,模型的早期层会被冻结,只有新添加的该项目中,只有最后一个全连接层没有被冻结。学到的特征。

低学习率(通常):微调通常涉及到使用比初始训练时更小的学习率,以对权重的一个典型特点。

import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

trainset = torchvision.datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True)

testset = torchvision.datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False)
trainset, testset
# Load the pre-trained model
model = torchvision.models.mobilenet_v2(pretrained=True)
model.classifier
#Freeze the layers
for param in model.parameters():
    param.requires_grad = False
## Replace the final layer for the new task,修改输出为10
model.classifier[1] = torch.nn.Linear(model.classifier[1].in_features, 10)
model.classifier[1].requires_grad = True  # Unfreeze the new layer
model.classifier[1]
# Define loss function and optimizer with a smaller learning rate
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.classifier.parameters(), lr=0.0001)  # Only optimize the new layer
#optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
criterion,optimizer
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
device
for epoch in range(2):  # Train for a few epochs
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data[0].to(device), data[1].to(device)
        optimizer.zero_grad()
        # Forward pass
        outputs = model(inputs)
        loss = criterion(outputs, labels)

        # Backward and optimize
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 2000 == 1999:  # Print every 2000 mini-batches
            print(f'[{epoch + 1}, {i + 1}]: loss: {running_loss / 2000:.3f}')
            running_loss = 0.0
print('Finished Training')
### Evaluate the Model on Test Data
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the 10000 test images: {100 * correct / total}%')
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值