pytorch + visdom 處理簡單分類問題

來源:互聯網
上載者:User
這篇文章主要介紹了關於pytorch + visdom 處理簡單分類問題,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

環境

系統 : win 10
顯卡:gtx965m
cpu :i7-6700HQ
python 3.61
pytorch 0.3

包引用

import torchfrom torch.autograd import Variableimport torch.nn.functional as Fimport numpy as npimport visdomimport timefrom torch import nn,optim

資料準備

use_gpu = Trueones = 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 +1x3 = torch.normal(-6*torch.from_numpy(ones),2)y3 = y1 +2x4 = 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 和 accuracyline = 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##############")

最佳化器和loss函數:

loss_f = nn.CrossEntropyLoss()optimizer_l = optim.SGD(logstic.parameters(), lr=0.001)

訓練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()

訓練過成觀察及可視化:

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"]))   #這裡的資料如果用gpu跑會出錯,要把資料換成cpu的資料 .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運行一次,結果如下:

然後用gpu運行一下,結果如下:

發現cpu的速度比gpu快很多,但是我聽說機器學習應該是gpu更快啊,百度了一下,知乎上的答案是:

我的理解就是gpu在處理圖片識別大量矩陣運算等方面運算能力遠高於cpu,在處理一些輸入和輸出都很少的,還是cpu更具優勢。

添加神經層:

net = nn.Sequential(  nn.Linear(2, 10),  nn.ReLU(),  #啟用函數  nn.Linear(10, 4))

添加一層10單元神經層,看看效果是否會有所提升:

使用cpu:


使用gpu:

比較觀察,似乎並沒有什麼區別,看來處理簡單分類問題(輸入,輸出少)的問題,神經層和gpu不會對機器學習加持。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.