版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用卷积网络实现图像分类第四章01了解卷积神经网络的基本结构02掌握CNN基本原理、熟悉CNN主要应用03
能够搭建和训练卷积神经网络模型04解决实际的图像分类问题、对图像数据进行预处理和增强学习目标CONTENTS01构建和训练卷积神经网络模型,提高实践动手能力02培养良好的编程习惯03提高问题分析和解决问题的能力04培养团队合作和沟通能力素质目标CONTENTS05培养持续学习的意识和能力搭建CNN模型训练模型实践任务准备数据测试模型第一节
FashionMNIST图像分类任务介绍FashionMNIST是一个常用的图像分类数据集,它由Zalando提供,包含了10个类别的灰度图像,每个类别包含6000张训练图像和1000张测试图像,图像大小为28x28像素。
FashionMNIST的任务是将28x28像素的灰度图像分类到10个不同的类别,包括T恤/上衣、裤子、套衫、连衣裙、外套、凉鞋、衬衫、运动鞋、手提包和踝靴。这个任务的挑战在于,所有的图像都是灰度图像,并且类别之间的差异较小,需要通过学习图像中微小的特征来进行分类。任务需求描述FashionMNIST图像分类任务介绍在全连接层中,相邻层的神经元全部连接在一起,输出的数量可以任意决定。首要的问题是数据的形状被“忽视”了。比如,输入数据是图像时,图像通常是高、长、通道方向上的3维形状。但是,向全连接层输入时,需要将3维数据拉平为1维数据。图像是3维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、RBG的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等,3维形状中可能隐藏有值得提取的本质模式。而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以(有可能)正确理解图像等具有形状的数据。技术分析FashionMNIST图像分类任务介绍总结1.全连接前馈网络很难提取这些局部不变特征2.卷积神经网络受到生物学上感受机制而提出的3.神经元的感受野是指视网膜上的特定区域,只有这个区域内的刺激才能够激活该神经。第二节
卷积计算在卷积神经网络中,紧随输入层的通常是一个卷积层(ConvolutionalLayer)。卷积的实现灵感来源于生物学上的感受野(ReceptiveField),后者是人体听觉或视觉等系统中神经说具有的特殊性质——即神经元只对自己可以接受的某些活动范围/条件内的信号产生刺激,例如,听觉系统中各神经元对不同频率声音的反应是有差异的。卷积层定义卷积运算卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。在介绍卷积运算时,我们来看一个具体的例子。卷积运算填充数据在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充(padding),是卷积运算中经常会用到的处理。比如,在输入数据中,对大小为(4,4)的输入数据应用了幅度为1的填充。“幅度为1的填充”是指用幅度为1像素的0填充周围。填充数据步幅应用滤波器的位置间隔称为步幅(stride)。之前的例子中步幅都是1,如果将步幅设为2,则如图所示,应用滤波器的窗口的间隔变为2个元素。增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。步幅多维卷积如果原始输入是一维的图片,但是我们可以用多个卷积核分别对其计算,从而得到多个特征输出。如图所示。多维卷积多维卷积一张图片,通常是彩色的,具有红绿蓝三个通道。我们可以有两个选择来处理: (1)变成灰度的,每个像素只剩下一个值,就可以用二维卷积
(2)对于三个通道,每个通道都使用一个卷积核,分别处理红绿蓝三种颜色的信息。显然第2种方法可以从图中学习到更多的特征,于是出现了三维卷积,即有三个卷积核分别对应书的三个通道,三个子核的尺寸是一样的,比如都是2x2,这样的话,这三个卷积核就是一个3x2x2的立体核,称为过滤器Filter,所以称为三维卷积。卷积的批处理神经网络的处理中进行了将输入数据打包的批处理。之前的全连接神经网络的实现也对应了批处理,通过批处理,能够实现处理的高效化和学习时对mini-batch的对应。我们希望卷积运算也同样对应批处理。为此,需要将在各层间传递的数据保存为4维数据。具体地讲,就是按(batch_num,channel,height,width)的顺序保存数据。卷积的批处理卷积的批处理池化池化pooling,又称为下采样,downstreamsamplingorsub-sampling。池化方法分为两种,一种是最大值池化MaxPooling,一种是平均值池化Mean/AveragePooling。第三节用PyTorch实现卷积计算实现卷积计算第三节用PyTorch实现卷积计算CNN中各层间传递的数据是4维数据。所谓4维数据,比如数据的形状是(10,1,28,28),则它对应10个高为28、长为28、通道为1的数据。用Python来实现的话,代码如下:x=np.random.rand(10,1,28,28)#随机生成数据。这里,如果要访问第1个数据,只要写x[0]就可以了(注意Python的索引是从0开始的)。同样地,用x[1]可以访问第2个数据。代码如下:x[0].shape#(1,28,28)x[1].shape#(1,28,28)如果要访问第1个数据的第1个通道的空间数据,代码如下:x[0,0]#或者x[0][0]准备数据卷积层的实现im2col函数作为黑盒(不关心内部实现)使用,使用im2col来实现卷积层的前向传播。卷积神层的实现
col2im函数作为黑盒(不关心内部实现)使用,使用col2来实现卷积层的反向传播。defbackward(self,dout):FN,C,FH,FW=self.W.shapedout=dout.transpose(0,2,3,1).reshape(-1,FN)
self.db=np.sum(dout,axis=0)self.dW=np.dot(self.col.T,dout)self.dW=self.dW.transpose(1,0).reshape(FN,C,FH,FW)
dcol=np.dot(dout,self.col_W.T)dx=col2im(dcol,self.x.shape,FH,FW,self.stride,self.pad)
returndx池化层的实现池化层的实现和卷积层相同,都使用im2col展开输入数据。具体实现代码如下:第四节
卷积神经网络的实现SimpleConvNet类classSimpleConvNet:def__init__(self,input_dim=(1,28,28),conv_param={'filter_num':30,'filter_size':5,'pad':0,'stride':1},hidden_size=100,output_size=10,weight_init_std=0.01):filter_num=conv_param['filter_num']filter_size=conv_param['filter_size']filter_pad=conv_param['pad']filter_stride=conv_param['stride']input_size=input_dim[1]conv_output_size=(input_size-filter_size+2*filter_pad)/filter_stride+1pool_output_size=int(filter_num*(conv_output_size/2)*(conv_output_size/2))第四节
卷积神经网络的实现初始化权重#初始化权重self.params={}self.params['W1']=weight_init_std*\np.random.randn(filter_num,input_dim[0],filter_size,filter_size)self.params['b1']=np.zeros(filter_num)self.params['W2']=weight_init_std*\np.random.randn(pool_output_size,hidden_size)self.params['b2']=np.zeros(hidden_size)self.params['W3']=weight_init_std*\np.random.randn(hidden_size,output_size)self.params['b3']=np.zeros(output_size)第四节
卷积神经网络的实现生成必要层#生成层self.layers=OrderedDict()self.layers['Conv1']=Convolution(self.params['W1'],self.params['b1'],conv_param['stride'],conv_param['pad'])self.layers['Relu1']=Relu()self.layers['Pool1']=Pooling(pool_h=2,pool_w=2,stride=2)self.layers['Affine1']=Affine(self.params['W2'],self.params['b2'])self.layers['Relu2']=Relu()self.layers['Affine2']=Affine(self.params['W3'],self.params['b3'])
self.last_layer=SoftmaxWithLoss()第四节
卷积神经网络的实现predictdefpredict(self,x):forlayerinself.layers.values():x=layer.forward(x)
returnxdefloss(self,x,t):"""求损失函数
参数x是输入数据、t是标签"""y=self.predict(x)returnself.last_layer.forward(y,t)第四节
卷积神经网络的实现反向传播法求梯度defgradient(self,x,t):#forwardself.loss(x,t)
#backwarddout=1dout=self.last_layer.backward(dout)
layers=list(self.layers.values())layers.reverse()forlayerinlayers:dout=layer.backward(dout)实践任务1我们这里的任务是对10个类别的“时装”图像进行分类,使用FashionMNIST数据集。下图给出了FashionMNIST中数据的若干样例图,如图所示,其中每个小图对应一个样本。FashionMNIST数据集处理实践任务1FashionMNIST数据集处理导入必要的包,代码如下:importos
importnumpyasnp
importpandasaspd
importtorch
importtorch.nnasnn
importtorch.optimasoptim
fromtorch.utils.dataimportDataset,DataLoader实践任务1FashionMNIST数据集处理配置GPU,这里有两种方式,参考代码如下:#1.使用“device”,后续对要使用GPU的变量用.to(device)即可
device=torch.device("cuda:1"iftorch.cuda.is_available()else"cpu")#2.使用os.environ
os.environ['CUDA_VISIBLE_DEVICES']='0'实践任务1FashionMNIST数据集处理配置超参数,代码如下:##配置其他超参数,如batch_size,num_workers,learningrate,以及总的epochs
batch_size=256
num_workers=0#对于Windows用户,这里应设置为0,否则会出现多线程错误
lr=1e-4
epochs=20实践任务1FashionMNIST数据集处理设置数据变换,代码如下:fromtorchvisionimporttransforms
data_transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,),(0.5,))
])实践任务1FashionMNIST数据集处理读取数据集,代码如下:##使用torchvision自带数据集,下载可能需要一段时间
fromtorchvisionimportdatasets
train_data=datasets.FashionMNIST(root='./data',train=True,download=True,transform=data_transform)
test_data=datasets.FashionMNIST(root='./data',train=False,download=True,transform=data_transform)
train_loader=DataLoader(train_data,batch_size=batch_size,shuffle=True,num_workers=num_workers,drop_last=True)
test_loader=DataLoader(test_data,batch_size=batch_size,shuffle=False,num_workers=num_workers)
实践任务1FashionMNIST数据集处理测试价值的数据信息,显示数据集中的数据,代码如下importmatplotlib.pyplotasplt
image,label=next(iter(train_loader))
print(image.shape,label.shape)
plt.imshow(image[0][0],cmap="gray")
plt.show()实践任务1FashionMNIST数据集处理第五节
实践任务2卷积神经网络搭建模型这里我们手搭一个CNN,而不考虑当下各种模型的复杂结构,
模型构建完成后,将模型放
到GPU上用于训练。第五节
实践任务2卷积神经网络搭建模型classNet(nn.Module):
def__init__(self):
super(Net,self).__init__()
self.conv=nn.Sequential(
nn.Conv2d(1,32,5),
nn.ReLU(),
nn.MaxPool2d(2,stride=2),
nn.Dropout(0.3),
nn.Conv2d(32,64,5),
nn.ReLU(),
nn.MaxPool2d(2,stride=2),
nn.Dropout(0.3)
)
第五节
实践任务2卷积神经网络搭建模型classNet(nn.Module):
def__init__(self):
super(Net,self).__init__()
self.conv=nn.Sequential( ...
)
self.fc=nn.Sequential(
nn.Linear(64*4*4,512),
nn.ReLU(),
nn.Linear(512,10)
)第五节
实践任务2卷积神经网络搭建模型classNet(nn.Module):
def__init__(self):
super(Net,self).__init__()
...
defforward(self,x):
x=self.conv(x)
x=x.view(-1,64*4*4)
x=self.fc(x)
#x=nn.functional.normalize(x)
returnx第五节
实践任务2卷积神经网络搭建模型创建模型,打印模型的信息,代码如下:model=Net()
model=model.cuda()
print(model)第五节
实践任务2卷积神经网络搭建模型运行程序,结果显示如下:Net((conv):Sequential((0):Conv2d(1,32,kernel_size=(5,5),stride=(1,1))(1):ReLU()(2):MaxPool2d(kernel_size=2,stride=2,padding=0,dilation=1,…)(fc):Sequential((0):Linear(in_features=1024,out_features=512,bias=True)(1):ReLU()(2):Linear(in_features=512,out_features=10,bias=True))第六节
实践任务3FashionMNIST识别网络训练设定损失函数,使用torch.nn模块自带的CrossEntropy损失,PyTorch会自动把整数型的label转为one-hot型,用于计算交叉熵损失。这里需要确保label是从0开始的,同时模型不加softmax层(使用logits计算),这也说明了PyTorch训练中各个部分不是独立的,需要全盘考虑。第六节
实践任务3FashionMNIST识别网络训练创建交叉熵损失代码如下:criterion=nn.CrossEntropyLoss()第六节
实践任务3FashionMNIST识别网络训练设定优化器,这里我们使用Adam优化器optimizer=optim.Adam(model.parameters(),lr=0.001)第六节
实践任务3FashionMNIST识别网络训练编写用于训练的函数,代码如下deftrain(epoch):model.train()train_loss=0fordata,labelintrain_loader:data,label=data.cuda(),label.cuda()optimizer.zero_grad()output=model(data)loss=criterion(output,label)loss.backward()optimizer.step()train_loss+=loss.item()*data.size(0)第六节
实践任务3FashionMNIST识别网络训练deftrain(epoch):model.train()train_loss=0fordata,labelintrain_loader: ...train_loss=train_loss/len(train_loader.dataset)print('Epoch:{}\tTrainingLoss:{:.6f}'.format(epoch,train_loss))第六节
实践任务3FashionMNIST识别网络训练训练卷积神经网络的注意点:数据增强学习率的调整批量归一化使用预训练模型梯度裁剪第六节
实践任务3FashionMNIST识别网络训练训练卷积神经网络的技巧:1.正则化2.选择合适的损失函数3.提前停止4.参数初始化5.训练监控第七节
实践任务4FashionMNIST识别测试和评估defval(epoch):model.eval()val_loss=0gt_labels=[]pred_labels=[]withtorch.no_grad():fordata,labelintest_loader:data,label=data.cuda(),label.cuda()output=model(data)
测试准确率:第七节
实践任务4FashionMNIST识别测试和评估defval(epoch): ...preds=torch.argmax(output,1)gt_labels.append(label.cpu().data.numpy())pred_labels.append(preds.cpu().data.numpy())loss=criterion(output,label)val_loss+=loss.item()*data.size(0)第七节
实践任务4FashionMNIST识别测试和评估defval(epoch): ...
val_loss=val_loss/len(test_loader.dataset)gt_labels,pred_labels=np.concatenate(gt_labels),np.concatenate(pred_labels)acc=np.sum(gt_labels==pred_labels)/len(pred_labels)print('Epoch:{}\tValidationLoss:{:.6f},Accuracy:{:6f}'.format(epoch,val_loss,acc))第七节
实践任务4FashionMNIST识别测试和评估fromsklearn.metricsimportconfusion_matrix,classification_report,precision_recall_curve,roc_curve,aucdefval(epoch): …
cm=confusion_matrix(gt_labels,pred_labels)cr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机械化绿化施工周期计划方案
- 2026贵州黔东南州施秉仁康医院招聘备考题库及参考答案详解
- 2026广西贵港桂平市罗播乡卫生院招聘编外工作人员的3人备考题库及答案详解(有一套)
- 2026湖南长沙市雨花区公开招聘中小学名优骨干教师120人备考题库附答案详解(满分必刷)
- 2026广西百色市西林县第三初级中学招聘后勤人员1人备考题库含答案详解(黄金题型)
- 2026河南郑州博爵国际学校招聘12人备考题库含答案详解(b卷)
- 2026新疆双河国农食品有限公司招聘1人备考题库含答案详解(研优卷)
- 古蔺县成龙学校急招教师(6人)备考题库及答案详解(各地真题)
- 2026广东清远市佛冈县石角镇招聘自主聘员2人备考题库及1套完整答案详解
- 2026年上半年黑龙江哈尔滨师范大学招聘专任教师12人备考题库含答案详解(综合卷)
- 单位收入管理办法
- 伊利公司库房管理制度
- 中国玫瑰痤疮诊疗指南(2025版)解读
- 船舶维修服务的组织结构及岗位职责
- 2025新疆农业大学辅导员考试试题及答案
- 建筑与市政工程施工现场临时用电安全技术标准JGJT46-2024
- 2024-2025学年福建省三明市宁化县九年级上学期期中考试数学试卷
- 纺织品生产流程:从棉花到成衣的完整旅程
- 初中学业水平考试美术试题及参考答案
- 甲亢危象观察及护理
- 百家讲坛2001-2016年节目播出表-总目录
评论
0/150
提交评论