深度學(xué)習(xí)計(jì)算機(jī)視覺(jué)入門過(guò)程

計(jì)算機(jī)視覺(jué)入門過(guò)程(用時(shí)約為2個(gè)月):

一富拗,理論學(xué)習(xí)

1研叫,復(fù)習(xí)了線性代數(shù)和概率論

2玫荣,學(xué)習(xí)了python的numpy庫(kù)和pytorch庫(kù)的使用

3巩螃,李飛飛cs213n課程視頻

4演怎,吳恩達(dá)深度學(xué)習(xí)課程視頻

二.實(shí)踐

1匕争,搭建深度學(xué)習(xí)環(huán)境

2避乏,mnist最高達(dá)到98.2%,cifar最高達(dá)到94.7%



因?yàn)槔铒w飛cs213n課程和吳恩達(dá)深度學(xué)習(xí)課程都是全英課程甘桑,所以在CSDN找了對(duì)應(yīng)的筆記拍皮,邊看筆記邊看視頻,這樣學(xué)起來(lái)輕松一些跑杭。

(課程視頻在B站可以找到)

筆記鏈接如下:

1.李飛飛cs213n課程:https://blog.csdn.net/qq_34611579/article/details/81072920?utm_source=app&app_version=4.8.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

2.吳恩達(dá)深度學(xué)習(xí)課程:https://blog.csdn.net/wuzhongqiang/article/details/89702268?utm_source=app&app_version=4.8.0&code=app_1562916241&uLinkId=usr1mkqgl919blen


還有一些在學(xué)習(xí)過(guò)程中疑問(wèn)百度到的結(jié)果:

1.numpy 中的隨機(jī)打亂數(shù)據(jù)方法np.random.shuffle

https://blog.csdn.net/weixin_43896259/article/details/106116955

2,圖像預(yù)處理Transforms與normalize

https://blog.csdn.net/aidanmo/article/details/104059612

3.關(guān)于transforms.Normalize()函數(shù)

https://blog.csdn.net/jzwong/article/details/104272600

4铆帽,numpy.floor()函數(shù)作用:向下取整

5.torch.utils.data.DataLoader()詳解

https://blog.csdn.net/qq_40520596/article/details/106981039

pytorch中 model.cuda的作用

https://www.cnblogs.com/pogeba/p/13890846.html

Pytorch里面nn.CrossEntropyLoss的含義

https://blog.csdn.net/lang_yubo/article/details/105108174

model.train()和model.eval()用法和區(qū)別

https://zhuanlan.zhihu.com/p/357075502

以optim.SGD為例介紹pytorch優(yōu)化器

https://www.sogou.com/link?url=hedJjaC291OV7dVab-QfvHtdr0qpeLU_JZ6a8oyfxdi0c29X6nLNTA..



下面來(lái)講講mnist和cifar數(shù)據(jù)集的訓(xùn)練過(guò)程

1.mnist數(shù)據(jù)集

from torchvision import datasets, transforms

import numpy as np

from sklearn.metrics import accuracy_score

import torch

# from tqdm import tqdm

import time

# matrix func

def knn(train_x, train_y, test_x, test_y,k):

? ? since = time.time()? ? # 獲取當(dāng)前時(shí)間

? ? m = test_x.size(0)? ? # test_s是torch.tensor類,m是在求它的數(shù)據(jù)個(gè)數(shù)

? ? n = train_x.size(0)

? ? # 計(jì)算歐幾里得距離德谅,得到m*n矩陣爹橱,ij表示第i個(gè)測(cè)試圖片與第j個(gè)圖片的歐幾里得距離

? ? print("cal dist matrix")

? ? xx = (test_x ** 2).sum(dim=1, keepdim=True).expand(m, n)

? ? # **2為對(duì)每個(gè)元素平方,.sum中dim=1,對(duì)行求和窄做,keepdim=True時(shí)保持二維愧驱,=false時(shí)降一維慰技。text原來(lái)是m*1,.expand后變成m*n组砚。

? ? yy = (train_x ** 2).sum(dim=1, keepdim=True).expand(n, m).transpose(0, 1)

? ? dist_mat = xx + yy - 2 * test_x.matmul(train_x.transpose(0, 1))

? ? mink_idxs = dist_mat.argsort(dim=-1)

? ? res = []

? ? for idxs in mink_idxs:

? ? ? ? # voting

? ? ? ? res.append(np.bincount(np.array([train_y[idx] for idx in idxs[:k]])).argmax())

? ? assert len(res) == len(test_y)

? ? print("識(shí)別率:", accuracy_score(test_y, res))

? ? time_elapsed = time.time() - since

? ? print('KNN mat training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))

if __name__ == "__main__":

? ? train_dataset = datasets.CIFAR10(root="./data2", transform=transforms.ToTensor(), train=True)

? ? #參數(shù)說(shuō)明: - root : processed/training.pt 和 processed/test.pt 的主目錄

? ? # -train : True = 訓(xùn)練集, False = 測(cè)試集

? ? # - download : True = 從互聯(lián)網(wǎng)上下載數(shù)據(jù)集吻商,并把數(shù)據(jù)集放在root目錄下.

? ? ? ? ? ? ? ? # 如果數(shù)據(jù)集之前下載過(guò),將處理過(guò)的數(shù)據(jù)(minist.py中有相關(guān)函數(shù))放在processed文件夾下糟红。

? ? test_dataset = datasets.CIFAR10(root="./data2", transform=transforms.ToTensor(), train=False)

? ? # build train&test data

? ? train_x = []

? ? train_y = []

? ? for i in range(len(train_dataset)):? #i為int艾帐,從0到len(train_dataset)-1

? ? ? ? img, target = train_dataset[i]? ? #train_dataset[i]是二元組

? ? ? ? train_x.append(img.view(-1))

? ? ? ? # view(-1)將多維img(tensor([? [[],[]] , [[],[]] ])轉(zhuǎn)化為一維tensor([])

? ? ? ? # ( train_x()是二維[tensor([ , , ,]) , tensor([ , , ,])],第一維是tensor([ , , ,]) )盆偿,

? ? ? ? # 然后加進(jìn)去train_x數(shù)組里面

? ? ? ? train_y.append(target)

? ? ? ? if i > 50000:

? ? ? ? ? ? break

? ? # print(set(train_y))

? ? test_x = []

? ? test_y = []

? ? for i in range(len(test_dataset)):

? ? ? ? img, target = test_dataset[i]

? ? ? ? test_x.append(img.view(-1))

? ? ? ? test_y.append(target)

? ? ? ? if i > 9000:

? ? ? ? ? ? break

? ? print("classes:", set(train_y))? ? ? #將所有標(biāo)簽類輸出柒爸,因?yàn)閟et變成集合后無(wú)重復(fù)

? ? knn(torch.stack(train_x), train_y, torch.stack(test_x), test_y, 7)#stack將[tensor([]),tensor([])]轉(zhuǎn)化為tensor([[],[]])

? ? # knn_by_iter(torch.stack(train_x), train_y, torch.stack(test_x), test_y, 10)

2.cifar數(shù)據(jù)集

import torch

import numpy as np

from torchvision import datasets

import torchvision.transforms as transforms

from torch.utils.data.sampler import SubsetRandomSampler

import torch.nn as nn

import torch.nn.functional as F

import torch.optim as optim

#將數(shù)據(jù)轉(zhuǎn)換為torch.FloatTensor,并標(biāo)準(zhǔn)化

#ToTensor()能夠把灰度范圍從0-255變換到0-1之間,而后面的transform.Normalize()則把0-1變換到(-1,1).

transform = transforms.Compose([

? ? transforms.ToTensor(),

? ? transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))

])

#選擇訓(xùn)練集與測(cè)試集的數(shù)據(jù)

train_data = datasets.CIFAR10( 'data',train=True,download=False,transform=transform)

test_data = datasets.CIFAR10('data',train=True,download=False,transform=transform)

# percentage of training set to use as validation

valid_size = 0.2

#obtain training indices that will be used for validation劃分訓(xùn)練集和驗(yàn)證集

num_train = len(train_data)

indices = list(range(num_train))

np.random.shuffle(indices)

split = int (np.floor(valid_size*num_train))

train_idx,valid_idx = indices[split:],indices[:split]

#define samplers for obtaining training and validation batches

train_sampler = SubsetRandomSampler(train_idx)

valid_sampler = SubsetRandomSampler(valid_idx)

#加載數(shù)據(jù)

num_workers = 0

#每批加載16張圖片

batch_size = 16

#perpare data loaders(combine dataset and sampler)

train_loader = torch.utils.data.DataLoader(train_data,batch_size=batch_size,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sampler=train_sampler,num_workers=num_workers)

valid_loader = torch.utils.data.DataLoader(train_data,batch_size=batch_size,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sampler=valid_sampler,num_workers=num_workers)

test_loader = torch.utils.data.DataLoader(test_data,batch_size=batch_size,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? num_workers=num_workers)

#10classes

classes = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']

# 定義卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)

class Net(nn.Module):

? ? def __init__(self):

? ? ? ? super(Net,self).__init__()

? ? ? ? #卷積層(32*32*3的圖像)

? ? ? ? self.conv1 = nn.Conv2d(3,16,3,padding=1)

? ? ? ? #卷積層(16*16*16)

? ? ? ? self.conv2 = nn.Conv2d(16,32,3,padding=1)

? ? ? ? #卷積層(8*8*32)

? ? ? ? self.conv3 = nn.Conv2d(32,64,3,padding=1)

? ? ? ? #最大池化層

? ? ? ? self.pool = nn.MaxPool2d(2,2)

? ? ? ? #LINEAR LAYER(64*4*4-->500)

? ? ? ? self.fc1 = nn.Linear(64*4*4,500)

? ? ? ? #linear層(500事扭,10)

? ? ? ? self.fc2 = nn.Linear(500,10)

? ? ? ? #dropout(p=0.3)

? ? ? ? self.dropout = nn.Dropout(0.3)

? ? def forward(self,x):

? ? ? ? #add sequence of convolutinal and max pooling layers

? ? ? ? x = self.pool(F.relu(self.conv1(x)))

? ? ? ? x = self.pool(F.relu(self.conv2(x)))

? ? ? ? x = self.pool(F.relu(self.conv3(x)))

? ? ? ? #flatten image input

? ? ? ? x = x.view(-1,64*4*4)

? ? ? ? #add dropout layer

? ? ? ? x = self.dropout(x)

? ? ? ? # add 1st hidden layer,with relu activation function

? ? ? ? x = F.relu(self.fc1(x))

? ? ? ? # add dropout layer

? ? ? ? x = self.dropout(x)

? ? ? ? # add 2nd hidden layer,with relu activation function

? ? ? ? x = self.fc2(x)

? ? ? ? return x

#create a complete CNN

model = Net()

print (model)

#檢查是否可以利用GPU

train_on_gpu = torch.cuda.is_available()

#

# if not train_on_gpu:

#? ? print ('CUDA IS NOT AVAILABLE!')

# else:

#? ? print('CUDA IS AVAILABEL!')

#可以將模型加載到GPU上去

if train_on_gpu:

? ? model.cuda()

#選擇損失函數(shù)與優(yōu)化函數(shù)

#使用交叉熵?fù)p失函數(shù)

criterion = nn.CrossEntropyLoss()

#使用隨機(jī)梯度下降揍鸟,學(xué)習(xí)率為0.01

optimizer = optim.SGD(model.parameters(),lr=0.01)

# 訓(xùn)練模型的次數(shù)

n_epochs = 40

valid_loss_min = np.Inf #track change in calidation loss

for epoch in range(1,n_epochs+1):

? ? #keep tracks of training and validation loss

? ? train_loss = 0.0

? ? valid_loss = 0.0

? ? ##################

? ? # 訓(xùn)練集的模型 #

? ? ##################

? ? model.train()

? ? for data,target in train_loader:

? ? ? ? #move tensors to gpu if cuda is available

? ? ? ? if train_on_gpu:

? ? ? ? ? ? data,target = data.cuda(),target.cuda()

? ? ? ? #clear the gradients of all optimized variables

? ? ? ? optimizer.zero_grad()

? ? ? ? #forward pass:compute predicted outputs by passing inputs to the model

? ? ? ? output = model(data)

? ? ? ? # calculate the batch loss

? ? ? ? loss = criterion(output,target)

? ? ? ? #backward pass:compute gradient of the loss with respect to model parameters

? ? ? ? loss.backward()

? ? ? ? #perform a single optimization step(parameters updata)

? ? ? ? optimizer.step()

? ? ? ? #updata training loss

? ? ? ? train_loss += loss.item()*data.size(0)

? ? ###############

? ? # 驗(yàn)證集模型 #

? ? ##################

? ? model.eval()

? ? for data,target in valid_loader:

? ? ? ? if train_on_gpu:

? ? ? ? ? ? data,target = data.cuda(),target.cuda()

? ? ? ? output = model(data)

? ? ? ? loss = criterion(output,target)

? ? ? ? valid_loss += loss.item()*data.size(0)

? ? #計(jì)算平均損失

? ? train_loss = train_loss/len(train_loader.sampler)

? ? valid_loss = valid_loss/len(valid_loader.sampler)

? ? #顯示訓(xùn)練集與驗(yàn)證集的損失函數(shù)

? ? print('Epoch:{} \tTraining loss:{} \tValidation loss:{}'.format(

? ? ? ? epoch,train_loss,valid_loss

? ? ))

? ? #如果驗(yàn)證集損失函數(shù)減少,就保存模型

? ? if valid_loss <= valid_loss_min:

? ? ? ? print ('Validation loss decreased ({} --> {}). Saving model ...'.format(

? ? ? ? ? ? valid_loss_min,valid_loss

? ? ? ? ))

? ? ? ? torch.save(model.state_dict(),'model_cifar.pt')

? ? ? ? valid_loss_min = valid_loss

model.load_state_dict(torch.load('model_cifar.pt',map_location=torch.device('cpu')))

# track test loss

test_loss = 0.0

class_correct = list(0. for i in range(10))

class_total = list(0. for i in range(10))

model.eval()

# iterate over test data

for data, target in test_loader:

? ? # move tensors to GPU if CUDA is available

? ? if train_on_gpu:

? ? ? ? data, target = data.cuda(), target.cuda()

? ? # forward pass: compute predicted outputs by passing inputs to the model

? ? output = model(data)

? ? # calculate the batch loss

? ? loss = criterion(output, target)

? ? # update test loss

? ? test_loss += loss.item()*data.size(0)

? ? # convert output probabilities to predicted class

? ? _, pred = torch.max(output, 1)

? ? # compare predictions to true label

? ? correct_tensor = pred.eq(target.data.view_as(pred))

? ? correct = np.squeeze(correct_tensor.numpy()) if not train_on_gpu else np.squeeze(correct_tensor.cpu().numpy())

? ? # calculate test accuracy for each object class

? ? for i in range(batch_size):

? ? ? ? label = target.data[i]

? ? ? ? class_correct[label] += correct[i].item()

? ? ? ? class_total[label] += 1

# average test loss

test_loss = test_loss/len(test_loader.dataset)

print('Test Loss: {:.6f}\n'.format(test_loss))

for i in range(10):

? ? if class_total[i] > 0:

? ? ? ? print('Test Accuracy of %5s: %2d%% (%2d/%2d)' % (

? ? ? ? ? ? classes[i], 100 * class_correct[i] / class_total[i],

? ? ? ? ? ? np.sum(class_correct[i]), np.sum(class_total[i])))

? ? else:

? ? ? ? print('Test Accuracy of %5s: N/A (no training examples)' % (classes[i]))

print('\nTest Accuracy (Overall): %2d%% (%2d/%2d)' % (

? ? 100. * np.sum(class_correct) / np.sum(class_total),

? ? np.sum(class_correct), np.sum(class_total)))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末句旱,一起剝皮案震驚了整個(gè)濱河市阳藻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谈撒,老刑警劉巖腥泥,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異啃匿,居然都是意外死亡蛔外,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門溯乒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夹厌,“玉大人,你說(shuō)我怎么就攤上這事裆悄∶疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵光稼,是天一觀的道長(zhǎng)或南。 經(jīng)常有香客問(wèn)我,道長(zhǎng)艾君,這世上最難降的妖魔是什么采够? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮冰垄,結(jié)果婚禮上蹬癌,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好逝薪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布伴奥。 她就那樣靜靜地躺著,像睡著了一般翼闽。 火紅的嫁衣襯著肌膚如雪拾徙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天感局,我揣著相機(jī)與錄音尼啡,去河邊找鬼。 笑死询微,一個(gè)胖子當(dāng)著我的面吹牛崖瞭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撑毛,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼书聚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了藻雌?” 一聲冷哼從身側(cè)響起雌续,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胯杭,沒(méi)想到半個(gè)月后驯杜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡做个,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鸽心,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片居暖。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顽频,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出太闺,到底是詐尸還是另有隱情糯景,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布跟束,位于F島的核電站莺奸,受9級(jí)特大地震影響丑孩,放射性物質(zhì)發(fā)生泄漏冀宴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一温学、第九天 我趴在偏房一處隱蔽的房頂上張望略贮。 院中可真熱鬧,春花似錦、人聲如沸逃延。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揽祥。三九已至讽膏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拄丰,已是汗流浹背府树。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留料按,地道東北人奄侠。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像载矿,于是被迫代替她去往敵國(guó)和親垄潮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容