下载软件的网站推荐,郴州网站运营公司,建设工程质量协会网站,谁可以帮我做网站迁移学习
标题1.什么是迁移学习
迁移学习(Transfer Learning)是一种机器学习方法#xff0c;就是把为任务 A 开发 的模型作为初始点#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过 从已学习的相关任务中转移知识来改进学习的新任务#xff0c;虽然大多数…迁移学习
标题1.什么是迁移学习
迁移学习(Transfer Learning)是一种机器学习方法就是把为任务 A 开发 的模型作为初始点重新使用在为任务 B 开发模型的过程中。迁移学习是通过 从已学习的相关任务中转移知识来改进学习的新任务虽然大多数机器学习算 法都是为了解决单个任务而设计的但是促进迁移学习的算法的开发是机器学 习社区持续关注的话题。 迁移学习对人类来说很常见例如我们可能会发现 学习识别苹果可能有助于识别梨或者学习弹奏电子琴可能有助于学习钢琴。 找到目标问题的相似性迁移学习任务就是从相似性出发将旧领域 (domain)学习过的模型应用在新领域上
标题2.迁移学习的步骤
1、选择预训练的模型和适当的层 通常我们会选择在大规模图像数据集如ImageNet上预训练的模型如VGG、ResNet等。然后根据新数据集的特点选择需要微调的模型层。对于低级特征的任务如边缘检测最好使用浅层模型的层而对于高级特征的任务如分类则应选择更深层次的模型。 2、冻结预训练模型的参数 保持预训练模型的权重不变只训练新增加的层或者微调一些层避免因为在数据集中过拟合导致预训练模型过度拟合。 3、在新数据集上训练新增加的层 在冻结预训练模型的参数情况下训练新增加的层。这样可以使新模型适应新的任务从而获得更高的性能。 4、微调预训练模型的层 在新层上进行训练后可以解冻一些已经训练过的层并且将它们作为微调的目标。这样做可以提高模型在新数据集上的性能。 5、评估和测试 在训练完成之后使用测试集对模型进行评估。如果模型的性能仍然不够好可以尝试调整超参数或者更改微调层。
标题3.迁移学习实例
该实例使用的模型是ResNet-18残差神经网络模型 ###1. 导入必要的库
在import torch
import torchvision.models as models
from torch import nn
from torch.utils.data import Dataset,DataLoader
from torchvision import transforms
from PIL import Image
import numpy as np
这里导入了后续代码会用到的库具体如下 torchPyTorch 深度学习框架的核心库。 torchvision.models包含了预训练的模型这里会用到 ResNet-18。 torch.nn用于构建神经网络的模块。 torch.utils.data.Dataset 和 torch.utils.data.DataLoader用于自定义数据集和加载数据。 torchvision.transforms用于图像的预处理。 PIL.Image用于读取图像。 numpy用于数值计算。 ###2. 加载预训练模型并修改全连接层
resnet_model models.resnet18(weightsmodels.ResNet18_Weights.DEFAULT)
for param in resnet_model.parameters():print(param)param.requires_gradFalse
in_featuresresnet_model.fc.in_features
resnet_model.fcnn.Linear(in_features,20)
params_to_update[]
for param in resnet_model.parameters():if param.requires_gradTrue:params_to_update.append(param)加载预训练的 ResNet-18 模型。 把模型中所有参数的 requires_grad 设置为 False也就是冻结这些参数使其在训练时不更新。 获取原模型全连接层的输入特征数然后将全连接层替换为一个新的全连接层输出维度为 20。 收集所有 requires_grad 为 True 的参数这些参数会在训练时更新。 ###3. 定义图像预处理变换
data_transforms {train:transforms.Compose([transforms.Resize([300,300]),transforms.RandomRotation(45),transforms.CenterCrop(224),transforms.RandomHorizontalFlip(p0.5),transforms.RandomVerticalFlip(p0.5),transforms.RandomGrayscale(p0.1),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]),valid:transforms.Compose([transforms.Resize([224,224]),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),
}定义了两个图像预处理的组合变换分别用于训练集和验证集。 训练集的变换包含了数据增强操作像随机旋转、水平翻转、垂直翻转等。 验证集的变换只包含了调整大小、转换为张量和标准化操作。
4. 自定义数据集类
class food_dataset(Dataset):def __init__(self,file_path,transformNone):self.file_path file_pathself.imgs []self.labels []self.transform transformwith open(self.file_path) as f:samples [x.strip().split( ) for x in f.readlines()]for img_path,label in samples:self.imgs.append(img_path)self.labels.append(label)def __len__(self):return len(self.imgs)def __getitem__(self, idx):image Image.open(self.imgs[idx])if self.transform:image self.transform(image)label self.labels[idx]label torch.from_numpy(np.array(label,dtypenp.int64))return image,label自定义了一个 food_dataset 类继承自 torch.utils.data.Dataset。 init 方法解析包含图像路径和标签的文本文件把图像路径和标签分别存到 self.imgs 和 self.labels 中。 len 方法返回数据集的大小。 getitem 方法根据索引读取图像对图像进行预处理将标签转换为张量然后返回图像和标签。
5. 创建数据集和数据加载器
training_data food_dataset(file_path./trainbig.txt,transformdata_transforms[train])
test_data food_dataset(file_path./testbig.txt,transformdata_transforms[valid])
train_dataloader DataLoader(training_data,batch_size64,shuffleTrue)
test_dataloader DataLoader(test_data,batch_size64,shuffleTrue)创建训练集和测试集的数据集对象。 创建训练集和测试集的数据加载器设置批量大小为 64并且打乱数据 ###6. 配置训练设备、损失函数、优化器和学习率调度器
device cuda if torch.cuda.is_available() else mps if torch.backends.mps.is_available() else cpu
print(fUsing {device} device)
modelresnet_model.to(device)
loss_fn nn.CrossEntropyLoss()
optimizer torch.optim.Adam(params_to_update,lr0.001)
schedulertorch.optim.lr_scheduler.StepLR(optimizer,step_size5,gamma0.5)选择合适的训练设备GPU 或 CPU。 把模型移动到所选设备上。 定义交叉熵损失函数。 定义 Adam 优化器只对之前收集的需要更新的参数进行优化。 定义学习率调度器每 5 个 epoch 将学习率乘以 0.5。 ###7. 定义训练和测试函数
def train(dataloader,model,loss_fn,optimizer):model.train()batch_size_num 1for X,y in dataloader:X,y X.to(device),y.to(device)pred model.forward(X)loss loss_fn(pred,y)optimizer.zero_grad()loss.backward()optimizer.step()def test(dataloader, model,loss_fn):global best_accsize len(dataloader.dataset)num_batches len(dataloader)model.eval()test_loss,correct 0,0with torch.no_grad():for X, y in dataloader:X,y X.to(device),y.to(device)pred model.forward(X)test_lossloss_fn(pred,y).item()correct (pred.argmax(1) y).type(torch.float).sum().item()test_loss / num_batchescorrect / sizeprint(fTest result:\n Accuracy:{(100 * correct)}%, Avg loss: {test_loss})acc_s.append(correct)loss_s.append(test_loss)if correctbest_acc:best_acccorrecttrain 函数将模型设置为训练模式遍历训练数据加载器计算损失反向传播并更新模型参数。 test 函数将模型设置为评估模式遍历测试数据加载器计算测试集的准确率和平均损失记录最佳准确率。 8. 训练模型并保存
epochs 20
acc_s []
loss_s []
for t in range(epochs):print(fEpoch {t 1}\n-----------)train(train_dataloader, model,loss_fn, optimizer)scheduler.step()test(test_dataloader,model,loss_fn)
print(最优训练结果为,best_acc)
torch.save(model.state_dict(), food_classification_model.pt)训练模型 20 个 epoch。 每个 epoch 结束后更新学习率并进行测试。 打印最优训练结果。 保存模型的参数到 food_classification_model.pt 文件中。