Pytorch图像分类搭建卷积神经网络和使用迁移学习实现图片
1。摘要
图像分类,也可以称作图像识别,顾名思义,就是辨别图像中的物体属于什么类别。核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图像并返回一个将图像分类的标签。在这里,我们将分别自己搭建卷积神经网路、迁移学习分别对图像数据集进行分类。本篇使用的数据集下载地址为:
链接:https:pan。baidu。coms1mS4xIf1sr3mhYncJNMqjQ
提取码:k57i
Pytorchdatasets文件夹底下包括两个文件夹存放各自的图片数据集。
2。搭建卷积神经网络实现图像分类
卷积神经网络与普通的神经网络的区别在于,卷积神经网络包含了一个卷积层convolutionallayer和池化层poolinglayer构成的特征提取器。卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。池化层(Poolinglayer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
如上图左,全连接神经网络是一个平面,包括输入层激活函数全连接层,右图的卷积神经网络是一个立体,包括输入层卷积层激活函数池化层全连接层。卷积神经网络提取的数据量更大,因此常用在图像处理上。
接下来,我们自己搭建神经网络对上面同样的数据集进行分类首先,导入相应的包importosimporttorchfromtorchimportnn,optimfromtorch。nnimportfunctionalasFfromtorch。utilsimportdatafromtorchvisionimportdatasets,transforms图像数据预处理trainpath。pytorchdatasetstraintestpath。pytorchdatasetstest定义数据集预处理的方法datatransformtransforms。Compose(〔transforms。Resize((224,224)),transforms。RandomResizedCrop(150),transforms。ToTensor(),transforms。Normalize((0。1307,),(0。3081,))〕)datasetstraindatasets。ImageFolder(trainpath,datatransform)datasetstestdatasets。ImageFolder(testpath,datatransform)trainloaderdata。DataLoader(datasetstrain,batchsize32,shuffleTrue)testloaderdata。DataLoader(datasetstest,batchsize16,shuffleFalse)pytorch搭建卷积神经网络搭建网络classCNN(nn。Module):definit(self):super(CNN,self)。init()self。conv1nn。Conv2d(3,32,3)self。maxpool1nn。MaxPool2d(2)self。conv2nn。Conv2d(32,64,3)self。maxpool2nn。MaxPool2d(2)self。conv3nn。Conv2d(64,128,3)self。maxpool3nn。MaxPool2d(2)self。conv4nn。Conv2d(128,128,3)self。maxpool4nn。MaxPool2d(2)self。fc1nn。Linear(6272,512)self。fc2nn。Linear(512,1)defforward(self,x):insizex。size(0)xself。conv1(x)xF。relu(x)xself。maxpool1(x)xself。conv2(x)xF。relu(x)xself。maxpool2(x)xself。conv3(x)xF。relu(x)xself。maxpool3(x)xself。conv4(x)xF。relu(x)xself。maxpool4(x)展开xx。view(insize,1)xself。fc1(x)xF。relu(x)xself。fc2(x)xtorch。sigmoid(x)returnxDEVICEtorch。device(cudaiftorch。cuda。isavailable()elsecpu)print(DEVICE)modelCNN()。to(DEVICE)optimizeroptim。Adam(model。parameters(),lr0。0001)
对图像数据集进行训练30次,打印损失forepochinrange(30):model。train()fori,(image,label)inenumerate(trainloader):data,targetVariable(image)。cuda(),Variable(label。cuda())。unsqueeze(1)optimizer。zerograd()outputmodel(data)outputoutput。to(torch。float32)targettarget。to(torch。float32)print(output。shape,target。shape)lossF。binarycrossentropy(output,target)loss。backward()optimizer。step()if(i1)100:print(TrainEpoch:{}〔{}{}({:。0f})〕Loss:{:。6f}。format(epoch,(i1)len(data),len(trainloader。dataset),100。(i1)len(trainloader),loss。item()))
对测试集数据进行验证评估,打印精确度forepochinrange(30):model。eval()testloss0correct0withtorch。nograd():fordata,targetintestloader:data,targetdata。to(DEVICE),target。to(DEVICE)。float()。unsqueeze(1)outputmodel(data)testlossF。binarycrossentropy(output,target,reductionsum)。item()将一批的损失相加predtorch。tensor(〔〔1〕ifnum〔0〕0。5else〔0〕fornuminoutput〕)。to(DEVICE)correctpred。eq(target。long())。sum()。item()print(Testset:Averageloss:{:。4f},Accuracy:{}{}({:。0f})。format(testloss,correct,len(testloader。dataset),100。correctlen(testloader。dataset)))
3。迁移学习实现图像分类
问题来了?什么是迁移学习?迁移学习(Transferlearning)顾名思义就是把已训练好的模型(预训练模型)参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务都是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习。其中,实现迁移学习有以下三种手段:
1。TransferLearning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层。
2。ExtractFeatureVector:先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络。
3。Finetuning:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层,因为这些层保留了大量底层信息)甚至不冻结任何网络层,训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层。
预训练模型有很多,本文选用InceptionV3预训练模型,它是由谷歌团队从ImageNet的1000个类别的超大数据集训练而来的,表现优异,经常用来做计算机视觉方面的迁移学习研究和应用。
同样,首先导入所需要的包fromsklearn。modelselectionimporttraintestsplitimportnumpyasnpimportosfromtqdmimporttqdmfromPILimportImageimporttorchimporttorchvision。datasetsimporttorchvision。transformsastransformsimporttorchvision。modelsasmodels图片数据预处理trainpath。pytorchdatasetstraintestpath。pytorchdatasetstestbatchsize16traintransformtransforms。Compose(〔transforms。RandomRotation(20),transforms。ColorJitter(brightness0。1),transforms。Resize(〔224,224〕),transforms。ToTensor()〕)valtransformtransforms。Compose(〔transforms。Resize(〔224,224〕),transforms。ToTensor()〕)trainDatatorchvision。datasets。ImageFolder(trainpath,transformtraintransform)testDatatorchvision。datasets。ImageFolder(testpath,transformvaltransform)trainLoadertorch。utils。data。DataLoader(datasettrainData,batchsizebatchsize,shuffleTrue)testLoadertorch。utils。data。DataLoader(datasettestData,batchsizebatchsize,shuffleFalse)微调模型进行训练modelmodels。resnet34(pretrainedTrue)model。fctorch。nn。Linear(512,2)定义损失函数和优化器criteriontorch。nn。CrossEntropyLoss()optimizertorch。optim。Adam(model。parameters(),lr0。0001)进行训练数据集fromtorch。autogradimportVariableimporttimetrainloss〔〕validloss〔〕accuracy〔〕forepochinrange(100):epochstarttimetime。time()model。train()totalloss0traincorrects0fori,(image,label)inenumerate(trainLoader):imageVariable(image。cuda())labelVariable(label。cuda())model。cuda()targetmodel(image)losscriterion(target,label)optimizer。zerograd()loss。backward()optimizer。step()totallossloss。item()maxvalue,maxindextorch。max(target,1)predlabelmaxindex。cpu()。numpy()truelabellabel。cpu()。numpy()traincorrectsnp。sum(predlabeltruelabel)losstotallossfloat(len(trainLoader))trainacctraincorrects100trainloss。append(loss)forepochinrange(100):model。eval()correctsevalloss0withtorch。nograd():forimage,labelintestLoader:imageVariable(image。cuda())labelVariable(label。cuda())model。cuda()predmodel(image)losscriterion(pred,label)evallossloss。item()maxvalue,maxindextorch。max(pred,1)predlabelmaxindex。cpu()。numpy()truelabellabel。cpu()。numpy()correctsnp。sum(predlabeltruelabel)lossevallossfloat(len(testLoader))acccorrects100validloss。append(loss)accuracy。append(acc)importmatplotlib。pyplotaspltprint(ending)plt。plot(trainloss)plt。plot(validloss)plt。title(loss)plt。ylabel(loss)plt。xlabel(epoch)plt。legend(〔train,test〕,locupperleft)plt。show()
原文链接:https:blog。csdn。netqq43018832articledetails127832688?spm1001。2014。3001。5502
36氪出海关注TikTok也淘宝化,东南亚上线商城2月20日,TikTokShop正式宣布在东南亚上线商城。目前商城已在印尼泰国菲律宾上线,并将向更多东南亚国家和跨境商家开放。去年TikTok商城已在印尼上线,入口Shop位于应用
用编剧的视角看狂飙,九大不可思议情节说明了什么?撇去喧嚣和泡沫,把领掌效果组赏金追剧人的尬吹放到一边,用最基础的编剧视角审视狂飙,会发现这就是一部烂剧。主干故事自相矛盾,狂飙编剧把自己编成笑话!一部电视剧能否成立,关键是主干故事
比娱乐圈更乱的圈你根本想象不到淫侈之俗日日以长,是天下之大贼也。贾谊娱乐圈的乱大家已是有目共睹。导演要求女演员陪睡的新闻层出不穷。娱乐圈换伴侣的速度估计比普通人换衣服的速度都快。大多数人追星只是喜欢这个人在影视
新华全媒4天盖好一层楼!探秘空中造楼机视频加载中它让露天工地变室内工厂,它让建筑施工在百米高空如履平地,它最快4天盖好一层楼造楼机实现了市区精细施工低污染施工安全施工,为中国建筑第三工程局带来了实在效益,推动了高质量城
多地疾控部门紧急提醒!这种病毒进入高发期!具有聚集性发病特点来源央视财经近日,北京河南浙江等多地疾控部门发布消息,提醒家长诺如病毒引起的急性感染性腹泻进入发病高峰期。什么是诺如病毒?该如何预防呢?近期,在广东福建等地一些医院的儿科门诊,不少
莒南五小幼儿园开展园所计划研讨会鲁网2月22日讯为提高教师的教科研水平,坚持理论联系实际,牢固树立以人为本的教育思想,2月20日,莒南五小幼儿园开展园所计划研讨会活动,提高教师的教育技能,凸现该园的特色教育。园长
另类的文化人胡兰成抗战期间,中华民族国土沦丧深蒙国难。这时候绝大部分文化人没有丧失应有的民族气节。他们不畏倭寇威逼暴虐,为全民族抗战奔走呼号,但也有极个别文人在民族危亡之际失节失义成为民族罪人。胡兰
艺评丨李云龙管窥,也是致敬大兵和南派相声管窥,也是致敬大兵和南派相声文丨李云龙契诃夫给米齐诺娃写信,其中有一句话,叫我依旧迷人。那是大作家隐含往事回望,包孕心理呈露的自况。这句话让我体会到了世事之奇我跟大兵,彼此从来没有
保尔谁最懂赵构?秦桧,岳飞,还是乾隆?文观察者网专栏作者保尔最近,电影满江红的热映带火了关于南宋历史的讨论。宋高宗自然也难逃热议。对于帝王,正史中都会有长短不一的评价,象征着盖棺定论。但是有的皇帝因为人生经历特殊,需要
一图流看懂APEX英雄16赛季角色强度探路者胜率Pick双登顶在前段时间2月15日APEX英雄进行了周年庆版本的更新之后,许多武器传奇的强度都遭到了洗牌,再加上新玩家的大量涌入和崭新登场的五大职业系统,彻底地改变了游戏内的战斗生态。新的生态为
近四十年最难破的5大纪录!科比81分太经典,乔丹不愧历史第一人作为世界篮球的最高殿堂,NBA拥有着最为完善的球队球员薪资规则,成熟的商业运营模式,技术强大的转播方式,以及最科学的选材机制。毫不夸张的说,NBA的专业性放在在世界众多体育联赛中,