版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第如何使用Pytorch完成圖像分類任務(wù)詳解params.append(
'tn=resultjson_comipn=rjct=201326592is=fp=resultqueryWord={}cl=2lm=-1ie=utf-8oe=utf-8adpicid=st=-1z=ic=hd=1latest=0copyright=0word={}s=se=tab=width=height=face=0istype=2qc=nc=1fr=expermode=force=cg=starpn={}rn=30gsm=781557125391211='.format(
keyword,keyword,30*i))
returnparams
defget_urls(self,params):
由url參數(shù)返回各個(gè)url拼接后的響應(yīng),存入列表并返回
:return:
urls=[]
foriinparams:
urls.append(self.url+i)
returnurls
defget_image_url(self,urls):
image_url=[]
forurlinurls:
json_data=requests.get(url,headers=self.headers).json()
json_data=json_data.get('data')
foriinjson_data:
ifi:
image_url.append(i.get('thumbURL'))
returnimage_url
defget_image(self,image_url):
根據(jù)圖片url,在本地目錄下新建一個(gè)以搜索關(guān)鍵字命名的文件夾,然后將每一個(gè)圖片存入。
:paramimage_url:
:return:
cwd=os.getcwd()
file_name=os.path.join(cwd,self.keyword)
ifnotos.path.exists(self.keyword):
os.mkdir(file_name)
forindex,urlinenumerate(image_url,start=1):
withopen(file_name+'\\{}.jpg'.format(index),'wb')asf:
f.write(requests.get(url,headers=self.headers_image).content)
ifindex!=0andindex%30==0:
print('{}第{}頁下載完成'.format(self.keyword,index/30))
def__call__(self,*args,**kwargs):
params=self.get_param()
urls=self.get_urls(params)
image_url=self.get_image_url(urls)
self.get_image(image_url)
if__name__=='__main__':
spider=Spider_baidu_image()
spider()
每個(gè)圖片要加上對應(yīng)的標(biāo)簽,那么在txt文檔當(dāng)中,選取圖片的名稱,在其后加上標(biāo)簽。如果是陽臺,則標(biāo)簽為1,如果不是陽臺,則標(biāo)簽為0。在2400張圖片中,分成兩個(gè)txt文檔為訓(xùn)練集和驗(yàn)證集train.txt和val.txt(如下圖2,3所示)
圖2
圖3
通過觀察自己爬取的圖片,可以發(fā)現(xiàn)陽臺各式各樣,有的半開放,有的是封閉式的,有的甚至和其他可識別物體花,草混在一起。同時(shí),圖片尺寸也不一致,有的是豎放的長方形,有的是橫放的長方形,但我們最終需要是合理尺寸的正方形。所以我們使用Resize的庫用于給圖像進(jìn)行縮放操作,我這里把圖片縮放到84*84的級別。除縮放操作以外還需對數(shù)據(jù)進(jìn)行預(yù)處理:
torchvision.transforms是pytorch中的圖像預(yù)處理包
一般用Compose把多個(gè)步驟整合到一起:
比如說
transforms.Compose([
transforms.CenterCrop(84),
transforms.ToTensor(),
])
這樣就把兩個(gè)步驟整合到一起
CenterCrop用于從中心裁剪圖片,目標(biāo)是一個(gè)長寬都為84的正方形,方便后續(xù)的計(jì)算。除CenterCrop外補(bǔ)充一個(gè)RandomCrop是在一個(gè)隨機(jī)的位置進(jìn)行裁剪。
ToTenser()這個(gè)函數(shù)的目的就是讀取圖片像素并且轉(zhuǎn)化為0-1的數(shù)字(進(jìn)行歸一化操作)。
代碼如下:
data_transforms={
'train':transforms.Compose([
transforms.Resize(84),
transforms.CenterCrop(84),
#轉(zhuǎn)換成tensor向量
transforms.ToTensor(),
#對圖像進(jìn)行歸一化操作
#[0.485,0.456,0.406],RGB通道的均值與標(biāo)準(zhǔn)差
transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])
'val':transforms.Compose([
transforms.Resize(84),
transforms.CenterCrop(84),
transforms.ToTensor(),
transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])
}
解決對圖像的處理過后,想要開始訓(xùn)練網(wǎng)絡(luò)模型,首先要解決的就是圖像數(shù)據(jù)的讀入,Pytorch使用DataLoader來實(shí)現(xiàn)圖像數(shù)據(jù)讀入,代碼如下:
classmy_Data_Set(nn.Module):
def__init__(self,txt,transform=None,target_transform=None,loader=None):
super(my_Data_Set,self).__init__()
#打開存儲(chǔ)圖像名與標(biāo)簽的txt文件
fp=open(txt,'r')
images=[]
labels=[]
#將圖像名和圖像標(biāo)簽對應(yīng)存儲(chǔ)起來
forlineinfp:
line.strip('\n')
line.rstrip()
information=line.split()
images.append(information[0])
labels.append(int(information[1]))
self.images=images
self.labels=labels
self.transform=transform
self.target_transform=target_transform
self.loader=loader
#重寫這個(gè)函數(shù)用來進(jìn)行圖像數(shù)據(jù)的讀取
def__getitem__(self,item):
#獲取圖像名和標(biāo)簽
imageName=self.images[item]
label=self.labels[item]
#讀入圖像信息
image=self.loader(imageName)
#處理圖像數(shù)據(jù)
ifself.transformisnotNone:
image=self.transform(image)
returnimage,label
#重寫這個(gè)函數(shù),來看數(shù)據(jù)集中含有多少數(shù)據(jù)
def__len__(self):
returnlen(self.images)
#生成Pytorch所需的DataLoader數(shù)據(jù)輸入格式
train_dataset=my_Data_Set('train.txt',transform=data_transforms['train'],loader=Load_Image_Information)
test_dataset=my_Data_Set('val.txt',transform=data_transforms['val'],loader=Load_Image_Information)
train_loader=DataLoader(train_dataset,batch_size=10,shuffle=True)
test_loader=DataLoader(test_dataset,batch_size=10,shuffle=True)
可驗(yàn)證是否生成了DataLoader格式數(shù)據(jù):
#驗(yàn)證是否生成DataLoader格式數(shù)據(jù)
fordataintrain_loader:
inputs,labels=data
print(inputs)
print(labels)
fordataintest_loader:
inputs,labels=data
print(inputs)
print(labels)
二.定義一個(gè)卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)一種典型的多層神經(jīng)網(wǎng)絡(luò),擅長處理圖像特別是大圖像的相關(guān)機(jī)器學(xué)習(xí)問題。卷積神經(jīng)網(wǎng)絡(luò)通過一系列的方法,成功地將大數(shù)據(jù)量的圖像識別問題不斷降維,最終使其能夠被訓(xùn)練。卷積神經(jīng)網(wǎng)絡(luò)(CNN)最早由YannLeCun提出并應(yīng)用在手寫體識別上。
一個(gè)典型的CNN網(wǎng)絡(luò)架構(gòu)如下圖4:
圖4
首先導(dǎo)入Python需要的庫:
importtorch
fromtorch.utils.dataimportDataLoader
fromtorchvisionimporttransforms,datasets
importtorch.nnasnn
importtorch.nn.functionalasF
importtorch.optimasoptim
fromtorch.autogradimportVariable
fromtorch.utils.dataimportDataset
importnumpyasnp
importos
fromPILimportImage
importwarnings
importmatplotlib.pyplotasplt
warnings.filterwarnings("ignore")
plt.ion()
定義一個(gè)卷積神經(jīng)網(wǎng)絡(luò):
classNet(nn.Module):
def__init__(self):
super(Net,self).__init__()
self.conv1=nn.Conv2d(3,6,5)
self.pool=nn.MaxPool2d(2,2)
self.conv2=nn.Conv2d(6,16,5)
self.fc1=nn.Linear(16*18*18,800)
self.fc2=nn.Linear(800,120)
self.fc3=nn.Linear(120,10)
defforward(self,x):
x=self.pool(F.relu(self.conv1(x)))
x=self.pool(F.relu(self.conv2(x)))
x=x.view(-1,16*18*18)
x=F.relu(self.fc1(x))
x=F.relu(self.fc2(x))
x=self.fc3(x)
returnx
net=Net()
我們首先定義了一個(gè)Net類,它封裝了所以訓(xùn)練的步驟,包括卷積、池化、激活以及全連接操作。
__init__函數(shù)首先定義了所需要的所有函數(shù),這些函數(shù)都會(huì)在forward中調(diào)用。從conv1說起,conv1實(shí)際上就是定義一個(gè)卷積層,3代表的是輸入圖像的像素?cái)?shù)組的層數(shù),一般來說就是輸入的圖像的通道數(shù),比如這里使用的圖像都是彩色圖像,由R、G、B三個(gè)通道組成,所以數(shù)值為3;6代表的是我們希望進(jìn)行6次卷積,每一次卷積都能生成不同的特征映射數(shù)組,用于提取圖像的6種特征。每一個(gè)特征映射結(jié)果最終都會(huì)被堆疊在一起形成一個(gè)圖像輸出,再作為下一步的輸入;5就是過濾框架的尺寸,表示我們希望用一個(gè)5*5的矩陣去和圖像中相同尺寸的矩陣進(jìn)行點(diǎn)乘再相加,形成一個(gè)值。定義好了卷基層,我們接著定義池化層。池化層所做的事說來簡單,其實(shí)就是因?yàn)榇髨D片生成的像素矩陣實(shí)在太大了,我們需要用一個(gè)合理的方法在降維的同時(shí)又不失去物體特征,所以使用池化的技術(shù),每四個(gè)元素合并成一個(gè)元素,用這一個(gè)元素去代表四個(gè)元素的值,所以圖像體積會(huì)降為原來的四分之一。再往下一行,我們又一次碰見了一個(gè)卷基層:conv2,和conv1一樣,它的輸入也是一個(gè)多層像素?cái)?shù)組,輸出也是一個(gè)多層像素?cái)?shù)組,不同的是這一次完成的計(jì)算量更大了,我們看這里面的參數(shù)分別是6,16,5。之所以為6是因?yàn)閏onv1的輸出層數(shù)為6,所以這里輸入的層數(shù)就是6;16代表conv2的輸出層數(shù),和conv1一樣,16代表著這一次卷積操作將會(huì)學(xué)習(xí)圖片的16種映射特征,特征越多理論上能學(xué)習(xí)的效果就越好。conv2使用的過濾框尺寸和conv1一樣,所以不再重復(fù)。
對于fc1,16很好理解,因?yàn)樽詈笠淮尉矸e生成的圖像矩陣的高度就是16層,前面我們把訓(xùn)練圖像裁剪成一個(gè)84*84的正方形尺寸,所以圖像最早輸入就是一個(gè)3*84*84的數(shù)組。經(jīng)過第一次5*5的卷積之后,我們可以得出卷積的結(jié)果是一個(gè)6*80*80的矩陣,這里的80就是因?yàn)槲覀兪褂昧艘粋€(gè)5*5的過濾框,當(dāng)它從左上角第一個(gè)元素開始卷積后,過濾框的中心是從2到78,并不是從0到79,所以結(jié)果就是一個(gè)80*80的圖像了。經(jīng)過一個(gè)池化層之后,圖像尺寸的寬和高都分別縮小到原來的1/2,所以變成40*40。緊接著又進(jìn)行了一次卷積,和上一次一樣,長寬都減掉4,變成36*36,然后應(yīng)用了最后一層的池化,最終尺寸就是18*18。所以第一層全連接層的輸入數(shù)據(jù)的尺寸是16*18*18。三個(gè)全連接層所做的事很類似,就是不斷訓(xùn)練,最后輸出一個(gè)二分類數(shù)值。
net類的forward函數(shù)表示前向計(jì)算的整個(gè)過程。forward接受一個(gè)input,返回一個(gè)網(wǎng)絡(luò)輸出值,中間的過程就是一個(gè)調(diào)用init函數(shù)中定義的層的過程。
F.relu是一個(gè)激活函數(shù),把所有的非零值轉(zhuǎn)化成零值。此次圖像識別的最后關(guān)鍵一步就是真正的循環(huán)訓(xùn)練操作。
#訓(xùn)練
cirterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.5)
forepochinrange(50):
running_loss=0.0
fori,datainenumerate(train_loader,0):
inputs,labels=data
inputs,labels=Variable(inputs),Variable(labels)
optimizer.zero_grad()#優(yōu)化器清零
outputs=net(inputs)
loss=cirterion(outputs,labels)
loss.backward()
optimizer.step()#優(yōu)化
running_loss+=loss.item()
ifi%200==199:
print('[%d%5d]loss:%.3f'%(epoch+1,i+1,running_loss/200))
running_loss=0.0
print('finishedtraining!')
在這里我們進(jìn)行了50次訓(xùn)練,每次訓(xùn)練都是批量獲取train_loader中的訓(xùn)練數(shù)據(jù)、梯度清零、計(jì)算輸出值、計(jì)算誤差、反向傳播并修正模型。我們以
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年宜賓市公安局公開招聘警務(wù)輔助人員備考題庫(110人)帶答案詳解
- 2026年烏審旗蘇里格現(xiàn)代煤化工產(chǎn)業(yè)研究院招聘備考題庫附答案詳解
- 2025年大姚縣公安局公開招聘警務(wù)輔助人員備考題庫(十七)及參考答案詳解1套
- 鄭州商品交易所招聘筆試題庫2026
- 中建一局一公司招聘筆試題庫2026
- 承租經(jīng)營公司合同范本
- 檢測工作受理制度規(guī)范
- 烹飪原料選取制度規(guī)范
- 瑜伽市場管理規(guī)范制度
- 電力安全規(guī)范三票制度
- 房地產(chǎn)樓盤介紹
- 2025內(nèi)蒙古潤蒙能源有限公司招聘22人考試題庫附答案解析(奪冠)
- 2026年國家電網(wǎng)招聘之電網(wǎng)計(jì)算機(jī)考試題庫500道有答案
- (2025年)遼寧省葫蘆島市輔警招聘警務(wù)輔助人員考試題庫真題試卷公安基礎(chǔ)知識及答案
- 鋼結(jié)構(gòu)施工組織方案大全
- 江蘇省徐州市2025-2026學(xué)年高二上學(xué)期期中考試信息技術(shù)試卷(含答案)
- 廣東省廣州市2025年上學(xué)期八年級數(shù)學(xué)期末考試試卷附答案
- 2025福建德化閩投抽水蓄能有限公司社會(huì)招聘4人備考題庫附答案
- 2025年物業(yè)管理中心工作總結(jié)及2026年工作計(jì)劃
- 雨課堂學(xué)堂在線學(xué)堂云軍事理論國防大學(xué)單元測試考核答案
- 多源醫(yī)療數(shù)據(jù)融合的聯(lián)邦學(xué)習(xí)策略研究
評論
0/150
提交評論