云南网站建设公司排行有了域名后怎么做网站

当前位置: 首页 > news >正文

云南网站建设公司排行,有了域名后怎么做网站,wordpress 插件路由,网店设计的意义这篇文章主要介绍的是Siamese Neural Network经典论文#xff1a; Gregory Koch, et al., Siamese Neural Networks for One-shot Image Recognition. ICML 2015。 神经网络能够取得非常好的效果得益于使用大量的带标签数据进行有监督学习训练。但是这样的训练方法面临两个难题… 这篇文章主要介绍的是Siamese Neural Network经典论文 Gregory Koch, et al., Siamese Neural Networks for One-shot Image Recognition. ICML 2015。 神经网络能够取得非常好的效果得益于使用大量的带标签数据进行有监督学习训练。但是这样的训练方法面临两个难题 有些情况下我们无法采集到大量数据给数据打标签需要消耗大量人力财力。 当我们只有少量带标签的数据时如何训练出一个泛化性很好的模型呢因此few-shot learning问题应用而生。Few-shot learning仅需要每个类别含有少量带标签数据就可以对样本进行分类。 Gregory Koch等人提出了一种新的机器学习框架当每个待测类别仅有1个样本的时候也能取得超过90%的识别准确率。

  1. Omniglot数据集 《Siamese Neural Networks for One-shot Image Recognition》论文中使用了Omniglot数据集。Omniglot数据集是Few-shot Learning中常用的数据集它采集了来自50个字母表的1623个手写字符。每一个字符仅仅包含20个样本每一个样本都是来自于不同人的手写笔迹。样本图片的分辨率为105x105。 这面展示几个手写字符 Omniglot数据集的下载方法 git clone https://github.com/brendenlake/omniglot.git cd omniglot/python unzip images_evaluation.zip unzip images_background.zip cd ../..

    setup directory for saving models

    mkdir modelsOmniglot数据集通常被划分为30个训练字母表(background)20个测试字母表(evaluation)。这30个训练样本和20个测试样本是完全没有交际的也就是说测试样本集中的类别完全是一个新的类别。这也是few-shot learning和传统的supervised learning不同的地方。

  2. A one-shot learning baseline / 1 nearest neighbor 对于nnn-way 111-shot问题由于我们手中只有一个样本所以没有办法训练得到一个泛化性很好的神经网络模型。最简单的方法是K-nearest neighbours只需计算测试样本到训练样本的欧式距离然后选择最近的一个作为预测标签 C(x^)argmin∣∣x^−xc∣∣C(\hat{x})\text{argmin}||\hat{x}-x_c|| C(x^)argmin∣∣x^−xc​∣∣ 论文中显示1-nn在202020-way 111-shot任务上的准确率为28%而盲猜的正确率只有5%。因此1-nn对于解决one-shot问题还是有用的但是效果并不理想但可以作为一个baseline。

  3. Siamese Neural Networks 由于训练样本太少用它来训练网络肯定会造成过拟合所以我们不能像传统的有监督学习那样其训练分类模型而是要让模型如何区分不同。 Siamese Networks即孪生网络他们共享一部分网络结构。将两张图片输入到网络中得到两个特在向量。我们用向量的绝对差值度量两张图片的相似性。Siamese网络的结构图如下所示: [图片上传失败…(image-275fb8-1679970385410)] Siamese网络使用相同的特征提取网络提取特在得到两个向量然后训练步骤为: 将两个样本分别输入到两个网络中得到两个特征向量x1和x2;计算向量的L1距离dis np.abs(x1 - x2)将距离dis输入到一个全连接网络中全连接网络的神经元个数是1经过Sigmoid函数得到预测输出介于0-1之间。0表示两个样本属于不同类别1表示两个样本属于同一类别。使用二元交叉熵损失函数计算loss反向传播更新参数。 对于kkk-way 111-shot问题我们需要比较querry set样本与kkk个support sample的score选择score最大的support sample作为标签。例如下图的252525-way 111-shot问题相似度越高Siamese 网络的输出值越大因此可以确定query sample 的类别。 论文中模型的一般部署方法在Pytorch中的实现如下参考4 import torch.nn as nn class Siamese(nn.Module):def init(self):super(Siamese, self).init()self.conv nn.Sequential(nn.Conv2d(1, 64, 10), # 6496*96nn.ReLU(inplaceTrue),nn.MaxPool2d(2), # 6448*48nn.Conv2d(64, 128, 7),nn.ReLU(), # 12842*42nn.MaxPool2d(2), # 12821*21nn.Conv2d(128, 128, 4),nn.ReLU(), # 12818*18nn.MaxPool2d(2), # 1289*9nn.Conv2d(128, 256, 4),nn.ReLU(), # 2566*6)self.liner nn.Sequential(nn.Linear(9216, 4096), nn.Sigmoid())self.out nn.Linear(4096, 1)def forward_one(self, x):x self.conv(x)x x.view(x.size()[0], -1)x self.liner(x)return xdef forward(self, x1, x2):out1 self.forward_one(x1)out2 self.forward_one(x2)dis torch.abs(out1 - out2)out self.out(dis)return out损失函数使用torch.nn.BCEWithLogitsLoss(size_averageTrue)函数。torch.nn.BCELoss函数如果输出经过了nn.Sigmoid()则损失函数就用torch.nn.BCELoss。 loss_fn torch.nn.BCEWithLogitsLoss(size_averageTrue) net Siamese() optimizer.zero_grad() output net.forward(img1, img2) loss loss_fn(output, label) loss_val loss.item() loss.backward() optimizer.step()4. Few-shot task 4.1 Training tasks Few-shot learnig的难点在于如何生成training tasks和test tasks 这里我参考文献4的方法 class OmniglotTrain(Dataset):def init(self, dataPath, transformNone):super(OmniglotTrain, self).init()np.random.seed(0)# self.dataset datasetself.transform transformself.datas, self.num_classes self.loadToMem(dataPath)def loadToMem(self, dataPath):print(begin loading training dataset to memory)datas {}agrees [0, 90, 180, 270]idx 0for agree in agrees:for alphaPath in os.listdir(dataPath):for charPath in os.listdir(os.path.join(dataPath, alphaPath)):datas[idx] []for samplePath in os.listdir(os.path.join(dataPath, alphaPath, charPath)):filePath os.path.join(dataPath, alphaPath, charPath, samplePath)datas[idx].append(Image.open(filePath).rotate(agree).convert(L))idx 1print(finish loading training dataset to memory)return datas,idxdef len(self):return 21000000def getitem(self, index):# image1 random.choice(self.dataset.imgs)label Noneimg1 Noneimg2 None# get image from same classif index % 2 1: # odd numberlabel 1.0idx1 random.randint(0, self.num_classes - 1)image1 random.choice(self.datas[idx1])image2 random.choice(self.datas[idx1])# get image from different classelse: # even numberlabel 0.0idx1 random.randint(0, self.num_classes - 1)idx2 random.randint(0, self.num_classes - 1)while idx1 idx2:idx2 random.randint(0, self.num_classes - 1)image1 random.choice(self.datas[idx1])image2 random.choice(self.datas[idx2])if self.transform:image1 self.transform(image1)image2 self.transform(image2)return image1, image2, torch.from_numpy(np.array([label], dtypenp.float32))这个方法方法比较常规就是随即产生image pair属于统一个字符标签为1不属于标签为0。 然后使用 trainSet OmniglotTrain(train_path, transformdata_transforms) trainLoader DataLoader(trainSet, batch_sizebatch_size, shuffleFalse, num_workersworkers)调用即可。 4.2 Test tasks 需要着重注意的是测试集任务 class OmniglotTest(Dataset):def init(self, dataPath, transformNone, times200, way20):np.random.seed(1)super(OmniglotTest, self).init()self.transform transformself.times times # number of samples, 参与测试的样本数量self.way wayself.img1 Noneself.c1 Noneself.datas, self.num_classes self.loadToMem(dataPath)def loadToMem(self, dataPath):print(begin loading test dataset to memory)datas {}idx 0for alphaPath in os.listdir(dataPath):for charPath in os.listdir(os.path.join(dataPath, alphaPath)):datas[idx] []for samplePath in os.listdir(os.path.join(dataPath, alphaPath, charPath)):filePath os.path.join(dataPath, alphaPath, charPath, samplePath)datas[idx].append(Image.open(filePath).convert(L))idx 1print(finish loading test dataset to memory)return datas, idxdef len(self):return self.times * self.waydef getitem(self, index):idx index % self.waylabel None# generate image pair from same classif idx 0:self.c1 random.randint(0, self.num_classes - 1)self.img1 random.choice(self.datas[self.c1])img2 random.choice(self.datas[self.c1])# generate image pair from different classelse:c2 random.randint(0, self.num_classes - 1)while self.c1 c2:c2 random.randint(0, self.num_classes - 1)img2 random.choice(self.datas[c2]) if self.transform:img1 self.transform(self.img1)img2 self.transform(img2)return img1, img2这里需要提前了解到的一个前提是: testSet OmniglotTest(Flags.test_path, transformtransforms.ToTensor(), times times, way way) testLoader DataLoader(testSet, batch_sizeway, shuffleFalse, num_workersworkers)这里loadToMem函数是往每一个character的往容器中存放数据而每一个character有20个样本所以self.datas中每20个样本为一个character整个测试集evaluation数据集有659个character每个chatacter共有20个样本所以共有659*2013180个样本。 这里要注意的是testLoader的shuffle的参数False也就是说测试集是从第0个索引开始一个一个读取的。所以每一个epoch刚好是读取了一个类别的20个样本也就是每次只判断一个类别预测结果的对错。 好了现在我们来看看getitem函数。由于索引是从0开始一次20个所以第一个batch的索引为0-20从0开始一次读取image。因此必然会经过if idx 0判断条件。运行步骤为 index 0idx index % 20 0if idx 0成立从所有类别中随即选择一个类别在该类别下随机选择两张图片img1, img2index 1,2,3,4,…,19idx index % 20 1,2,3,4,…,19if idx 0不成立进入else语句随即选择两个不同类别的图片img1, img2第一个batch完成判断batch是否读取完成若是则退出循环否则index1返回步骤2 这里测试的代码为 for _, (test1, test2) in enumerate(testLoader, 1):test1, test2 test1.cuda(), test2.cuda()test1, test2 Variable(test1), Variable(test2)output net.forward(test1, test2).data.cpu().numpy()pred np.argmax(output)if pred 0:right 1else: error 1因为每个batch只有第一个img pair是相同的如果预测正确np.argmax(output)是0 本文原载于我的简书 Reference One Shot Learning and Siamese Networks in KerasGithub - One-Shot-Learning-with-Siamese-Networks (Keras)Github - Pokemon: Siamese-Network-with-Contrastive-lossGithub - Siamese Networks for One-Shot Learning (pytorch)