pytorch + visdom 處理簡單分類問題的示例
環(huán)境
系統(tǒng) : win 10
顯卡:gtx965m
cpu :i7-6700HQ
python 3.61
pytorch 0.3
包引用
import torch from torch.autograd import Variable import torch.nn.functional as F import numpy as np import visdom import time from torch import nn,optim
數(shù)據(jù)準備
use_gpu = True ones = np.ones((500,2)) x1 = torch.normal(6*torch.from_numpy(ones),2) y1 = torch.zeros(500) x2 = torch.normal(6*torch.from_numpy(ones*[-1,1]),2) y2 = y1 +1 x3 = torch.normal(-6*torch.from_numpy(ones),2) y3 = y1 +2 x4 = torch.normal(6*torch.from_numpy(ones*[1,-1]),2) y4 = y1 +3 x = torch.cat((x1, x2, x3 ,x4), 0).float() y = torch.cat((y1, y2, y3, y4), ).long()
可視化如下看一下:

visdom可視化準備
先建立需要觀察的windows
viz = visdom.Visdom()
colors = np.random.randint(0,255,(4,3)) #顏色隨機
#線圖用來觀察loss 和 accuracy
line = viz.line(X=np.arange(1,10,1), Y=np.arange(1,10,1))
#散點圖用來觀察分類變化
scatter = viz.scatter(
X=x,
Y=y+1,
opts=dict(
markercolor = colors,
marksize = 5,
legend=["0","1","2","3"]),)
#text 窗口用來顯示loss 、accuracy 、時間
text = viz.text("FOR TEST")
#散點圖做對比
viz.scatter(
X=x,
Y=y+1,
opts=dict(
markercolor = colors,
marksize = 5,
legend=["0","1","2","3"]
),
)
效果如下:

邏輯回歸處理
輸入2,輸出4
logstic = nn.Sequential( nn.Linear(2,4) )
gpu還是cpu選擇:
if use_gpu:
gpu_status = torch.cuda.is_available()
if gpu_status:
logstic = logstic.cuda()
# net = net.cuda()
print("###############使用gpu##############")
else : print("###############使用cpu##############")
else:
gpu_status = False
print("###############使用cpu##############")
優(yōu)化器和loss函數(shù):
loss_f = nn.CrossEntropyLoss() optimizer_l = optim.SGD(logstic.parameters(), lr=0.001)
訓(xùn)練2000次:
start_time = time.time()
time_point, loss_point, accuracy_point = [], [], []
for t in range(2000):
if gpu_status:
train_x = Variable(x).cuda()
train_y = Variable(y).cuda()
else:
train_x = Variable(x)
train_y = Variable(y)
# out = net(train_x)
out_l = logstic(train_x)
loss = loss_f(out_l,train_y)
optimizer_l.zero_grad()
loss.backward()
optimizer_l.step()
訓(xùn)練過成觀察及可視化:
if t % 10 == 0:
prediction = torch.max(F.softmax(out_l, 1), 1)[1]
pred_y = prediction.data
accuracy = sum(pred_y ==train_y.data)/float(2000.0)
loss_point.append(loss.data[0])
accuracy_point.append(accuracy)
time_point.append(time.time()-start_time)
print("[{}/{}] | accuracy : {:.3f} | loss : {:.3f} | time : {:.2f} ".format(t + 1, 2000, accuracy, loss.data[0],
time.time() - start_time))
viz.line(X=np.column_stack((np.array(time_point),np.array(time_point))),
Y=np.column_stack((np.array(loss_point),np.array(accuracy_point))),
win=line,
opts=dict(legend=["loss", "accuracy"]))
#這里的數(shù)據(jù)如果用gpu跑會出錯,要把數(shù)據(jù)換成cpu的數(shù)據(jù) .cpu()即可
viz.scatter(X=train_x.cpu().data, Y=pred_y.cpu()+1, win=scatter,name="add",
opts=dict(markercolor=colors,legend=["0", "1", "2", "3"]))
viz.text("<h3 align='center' style='color:blue'>accuracy : {}</h3><br><h3 align='center' style='color:pink'>"
"loss : {:.4f}</h3><br><h3 align ='center' style='color:green'>time : {:.1f}</h3>"
.format(accuracy,loss.data[0],time.time()-start_time),win =text)
我們先用cpu運行一次,結(jié)果如下:

然后用gpu運行一下,結(jié)果如下:

發(fā)現(xiàn)cpu的速度比gpu快很多,但是我聽說機器學(xué)習(xí)應(yīng)該是gpu更快啊,百度了一下,知乎上的答案是:

我的理解就是gpu在處理圖片識別大量矩陣運算等方面運算能力遠高于cpu,在處理一些輸入和輸出都很少的,還是cpu更具優(yōu)勢。
添加神經(jīng)層:
net = nn.Sequential( nn.Linear(2, 10), nn.ReLU(), #激活函數(shù) nn.Linear(10, 4) )
添加一層10單元神經(jīng)層,看看效果是否會有所提升:
使用cpu:
使用gpu:

比較觀察,似乎并沒有什么區(qū)別,看來處理簡單分類問題(輸入,輸出少)的問題,神經(jīng)層和gpu不會對機器學(xué)習(xí)加持。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python光學(xué)仿真學(xué)習(xí)處理高斯光束分布圖像
這篇文章主要為大家介紹了Python光學(xué)仿真學(xué)習(xí)之如何處理高斯光束的分布圖像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10
pytest使用parametrize將參數(shù)化變量傳遞到fixture
這篇文章主要為大家介紹了pytest使用parametrize將參數(shù)化變量傳遞到fixture的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
python使用BeautifulSoup分頁網(wǎng)頁中超鏈接的方法
這篇文章主要介紹了python使用BeautifulSoup分頁網(wǎng)頁中超鏈接的方法,涉及Python使用BeautifulSoup模塊操作網(wǎng)頁鏈接的技巧,需要的朋友可以參考下2015-04-04
Python導(dǎo)入模塊包原理及相關(guān)注意事項
這篇文章主要介紹了Python導(dǎo)入模塊包原理及相關(guān)注意事項,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
回調(diào)函數(shù)的意義以及python實現(xiàn)實例
本篇文章主要介紹了回調(diào)函數(shù)的意義以及python實現(xiàn)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

