机器学习原理与应用电子教案 5.10.5深度学习实践-孪生神经网络_第1页
机器学习原理与应用电子教案 5.10.5深度学习实践-孪生神经网络_第2页
机器学习原理与应用电子教案 5.10.5深度学习实践-孪生神经网络_第3页
机器学习原理与应用电子教案 5.10.5深度学习实践-孪生神经网络_第4页
机器学习原理与应用电子教案 5.10.5深度学习实践-孪生神经网络_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

备课日期:年月日授课时间课时(理论+实验)周次星期:节次:授课课题深度学习[实践-孪生神经网络]教学目标1.理解孪生神经网络基本原理。2.掌握利用PyTorch框架实现孪生神经网络的基本方法。教学重点利用PyTorch框架实现孪生神经网络的基本方法。教学准备PPT、点名册等。教学方法指导阅读、案例法。教学过程设计备注课题引入【思考】人类如何区别相同的事物?【关键】特征相似度。【时间】分钟。【主板书】§5.10.5孪生神经网络---------------------------------------------------------------------------一、基本原理【主板书】基本原理1.基本机制:孪生神经网络(Siameseneuralnetwork)是是基于两个神经网络建立的耦合构架。以两个样本为输入,输出其嵌入高维度空间的表征,以比较两个样本的相似程度。在监督学习范式下,孪生神经网络会最大化不同标签的表征,并最小化相同标签的表征。在自监督或非监督学习范式下,孪生神经网络可以最小化原输入和干扰输入(例如原始图像和该图像的裁减)间的表征。2.孪生神经网络和伪孪生神经网络的适用场景区别:孪生神经网络用于处理两个输入"比较类似"的情况。伪孪生神经网络适用于处理两个输入"有一定差别"的情况。3.孪生神经网络损失函数:常规的孪生神经网络使用ContrastiveLoss。【强化与拓展】对比损失函数的形式(Y=1与Y=0的情况分析、阈值的含义)。【PPT】展示对比损失函数。【强化与拓展】孪生神经网络将样本的维度进行转换,在转换后的维度空间中的任意两样本:如果是相同类别,空间距离尽量接近;如果是不同类别,空间距离大于某个间隔。【时间】分钟。【提问】。教学步骤及主要内容二、编程实现目的:比较两幅图片是否相似,或者说相似度是多少?1.构造数据集原则:将同一个类别图片文件放置一个文件夹中。(1)两个重要的函数Dataset类是Pytorch中图像数据集中最为重要的一个类,也是Pytorch中所有数据集加载类中应该继承的父类。其两个私有成员函数必须被重载,否则将会触发错误提示:__getitem__(self,index)__len__(self)其中__len__应该返回数据集的大小,而__getitem__接收一个index,然后返回图片数据和标签,这个index通常指的是一个list的index,这个list的每个元素就包含了图片数据的路径和标签信息。(2)获取类别标签〖PPT〗演示defget_label_from_image_path(image_path):returnint(os.path.split(image_path)[0].split('\\')[-1])(3)__getitem__与__len__函数的实现classMyDataSet(Dataset):def__init__(self,image_folder,transform=None,should_invert=True):self.image_folder=image_folder#存放图片的文件夹self.transform=transform#预处理self.should_invert=should_invert#通道反转self.image_list=glob.glob(self.image_folder+'/*/*.jpg')#列表def__getitem__(self,index):same_class_yn=random.randint(0,1)#相似1或不相似0im_1_path=random.choice(self.image_list)#随机选1幅图片im_1_label=get_label_from_image_path(im_1_path)#图片标签ifsame_class_yn:#抽取与im_1属于同一类的图片whileTrue:im_2_path=random.choice(self.image_list)im_2_label=get_label_from_image_path(im_2_path)ifim_1_label==im_2_label:breakelse:whileTrue:im_2_path=random.choice(self.image_list)im_2_label=get_label_from_image_path(im_2_path)ifim_1_label!=im_2_label:break#读取图片im_1=Image.open(im_1_path)im_2=Image.open(im_2_path)#是否进行通道反转ifself.should_invert:im_1=PIL.ImageOps.invert(im_1)im_2=PIL.ImageOps.invert(im_2)#是否进行预处理ifself.transformisnotNone:im_1=self.transform(im_1)im_2=self.transform(im_2)returnim_1,im_2,same_class_yndef__len__(self):returnlen(self.image_list)(4)加载数据#定义预处理操作transform=transforms.Compose([transforms.Grayscale(num_output_channels=1),#转成单通道transforms.ToTensor(),#转为Tensortransforms.Normalize((0.5,),(0.5,)),#归一化])train_dir="E:\\DATA\\CIFAR\\train\\"#训练集文件夹train_dataset=MyDataSet(image_folder=train_dir,transform=transform,should_invert=False)train_dataloader=DataLoader(train_dataset,shuffle=True,batch_size=32)test_dir="E:\\DATA\\CIFAR\\test\\"#训练集文件夹test_dataset=MyDataSet(image_folder=test_dir,transform=transform,should_invert=False)test_dataloader=DataLoader(test_dataset,shuffle=True,batch_size=32)#读取数据集test_set=enumerate(test_dataloader)ix,test_im_label=next(test_set)ims_1=test_im_label[0]print(ims_1.size())>>torch.Size([32,1,32,32])ims_2=test_im_label[1]print(ims_2.size())>>torch.Size([32,1,32,32])label=test_im_label[2]print(label)defshow_image(im):plt.figure()im=im/2+0.5im=im.numpy()plt.imshow(np.transpose(im,(1,2,0)))plt.show()#提取图片ix=5#指定序号im_1=ims_1[ix,:]#第ix幅图片show_image(im_1)im_2=ims_2[ix,:]#第ix幅图片show_image(im_2)print(label[ix])>>02.构造孪生神经网络classSiameseNetwork(nn.Module):def__init__(self):super().__init__()n1=nn.Sequential(nn.ReflectionPad2d(1),nn.Conv2d(1,5,3,1),nn.ReLU(),nn.BatchNorm2d(5),nn.ReflectionPad2d(1),nn.Conv2d(5,10,3,1),nn.ReLU(),nn.BatchNorm2d(10),nn.ReflectionPad2d(1),nn.Conv2d(10,20,3,1),nn.ReLU(inplace=True),nn.BatchNorm2d(20),)self.fc1=nn.Sequential(nn.Linear(32*32*20,100),nn.ReLU(),nn.Linear(100,50),nn.ReLU(),nn.Linear(50,5))defforward_once(self,x):output=n1(x)output=output.view(output.size()[0],-1)output=self.fc1(output)returnoutputdefforward(self,x1,x2):output1=self.forward_once(x1)output2=self.forward_once(x2)returnoutput1,output2net=SiameseNetwork()#定义模型【强化与拓展】BatchNorm2d与MaxPool2d函数使用方法。classtorch.nn.BatchNorm2d(num_features,eps=1e-05,momentum=0.1,affine=True)classtorch.nn.ReflectionPad2d(padding)3.定义损失函数classContrastiveLoss(torch.nn.Module):def__init__(self,margin=2.0):super(ContrastiveLoss,self).__init__()self.margin=margindefforward(self,x1,x2,label):euclidean_distance=F.pairwise_distance(x1,x2,keepdim=True)loss=torch.mean((1-label)*torch.pow(euclidean_distance,2)+(label)*torch.pow(torch.clamp(self.margin-euclidean_distance,min=0.0),2))returnlossloss=ContrastiveLoss()#定义损失函数4.定义优化器optimizer=optim.Adam(net.parameters(),lr=0.001)#优化器5.模型训练T=100forepochinrange(T):Loss_Sum=0.0#累积训练误差fori,datainenumerate(train_dataloader,1):im_1,im_2,label=data output1,output2=net(im_1,im_2)L=loss(output1,output2,label)optimizer.zero_grad()L.backwar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论