自然景观网站模板,程序员知识网站需要多少钱,中国房地产未来走向,做洁净的网站简介#xff1a;元学习是一种思想#xff0c;一般以神经网络作为特征嵌入的工具#xff0c;实现对数据特征的提取#xff0c;然后通过构造某种指标以引导优化器对模型参数进行优化。而最小化距离是最常见的学习目标#xff0c;这就是熟知的度量学习#xff0c;度量学习里… 简介元学习是一种思想一般以神经网络作为特征嵌入的工具实现对数据特征的提取然后通过构造某种指标以引导优化器对模型参数进行优化。而最小化距离是最常见的学习目标这就是熟知的度量学习度量学习里面经典的训练范式就是孪生网络。 1、小样本学习 小样本学习是指用于训练的数据很少以分类任务为例minist数据一共有10个类别每个类别差不多有几百张图片传统的训练方式是一股脑的把所有训练集数据给端到端模型进行训练得到一个模型然后在测试集上测试。 在小样本学习当中每个类别仅能够使用很少的图片比如10个类别每个类别使用5张图片则称为10ways-5shots10个类别每个类别使用2张图片则称为10ways-2shots。在这么少的数据情况下一般的端到端模型肯定学不到东西导致效果变差。 那么换个思路让神经网络生成表征即可但是得按照我的思路进行生成思路就是你神经网络生成的样本表征需要满足下面的条件相同的图片表征距离尽量靠近、不相同的图片表征距离尽量原理然后构造一个自定义损失函数进行训练即可。 可以看到度量学习本质上就是在神经网络后面添加一个额外的网络层这个网络层对神经网络的输出表征进行处理输出一个度量值也就是自定义了一个损失函数网络层。在torch当中原理层面就说构造了一个新的计算图使得优化器的优化目标进行了改变而这种改变也会使得神经网络的权重变成我们想要的情况也就是这个自定义的度量损失函数指导了神经网络权重的学习这就是元学习的体现。 换一种说法就是有一个初始的神经网络我们需要改变他的权重但不能直接让这个神经网络去参与训练。我们需要对神经网络的输出进行加工得到另一种令人接受结果然后使用万能的优化器优化这个结果当这个结果确实令人接受了那么神经网络的权重自然而然也就令人接受了。 2、孪生网络数据集 下面是孪生网络的数据集格式。 from torchvision import transforms
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import random
import torch.functional as F
from tqdm import tqdmclass SiameseDataset(Dataset):def __init__(self, image_paths, labels, transformNone):self.image_paths image_pathsself.labels labelsself.transform transform or transforms.Compose([transforms.Resize((256, 256)), # 调整图片大小transforms.ToTensor(), # 转换为张量transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])self.label_to_indices self._create_label_to_indices()def _create_label_to_indices(self):创建一个字典将每个标签映射到具有该标签的所有图像的索引列表label_to_indices {}for idx, label in enumerate(self.labels):if label not in label_to_indices:label_to_indices[label] []label_to_indices[label].append(idx)return label_to_indicesdef __len__(self):返回数据集的大小return len(self.image_paths)def __getitem__(self, index):返回一对图像和一个标签指示这对图像是否属于同一类别# 随机选择是否返回同一类别的图像对label self.labels[index]if random.random() 0.5:# 选择同一类别的图像siamese_index random.choice(self.label_to_indices[label])target 1 # 1 表示同一类别else:# 选择不同类别的图像other_labels [l for l in self.label_to_indices.keys() if l ! label]other_label random.choice(other_labels)siamese_index random.choice(self.label_to_indices[other_label])target 0 # 0 表示不同类别# 加载图像image1 Image.open(self.image_paths[index]).convert(RGB)image2 Image.open(self.image_paths[siamese_index]).convert(RGB)# 应用变换if self.transform:image1 self.transform(image1)image2 self.transform(image2)return image1, image2, target 3、损失函数 class ContrastiveLoss(nn.Module):def __init__(self, margin2.0):super(ContrastiveLoss, self).__init__()self.margin margindef forward(self, output1, output2, label):euclidean_distance F.pairwise_distance(output1, output2)loss_contrastive torch.mean((1-label) * torch.pow(euclidean_distance, 2) (label) * torch.pow(torch.clamp(self.margin - euclidean_distance, min0.0), 2))return loss_contrastive