pytorch + visdom 处理简单分类问题的示例


Posted in Python onJune 04, 2018

环境

系统 : 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

数据准备

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

可视化如下看一下:

pytorch + visdom 处理简单分类问题的示例

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"]
  ),
)

效果如下:

pytorch + visdom 处理简单分类问题的示例

逻辑回归处理

输入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运行一次,结果如下:

pytorch + visdom 处理简单分类问题的示例

然后用gpu运行一下,结果如下:

pytorch + visdom 处理简单分类问题的示例

发现cpu的速度比gpu快很多,但是我听说机器学习应该是gpu更快啊,百度了一下,知乎上的答案是:

pytorch + visdom 处理简单分类问题的示例

我的理解就是gpu在处理图片识别大量矩阵运算等方面运算能力远高于cpu,在处理一些输入和输出都很少的,还是cpu更具优势。

添加神经层:

net = nn.Sequential(
  nn.Linear(2, 10),
  nn.ReLU(),  #激活函数
  nn.Linear(10, 4)
)

添加一层10单元神经层,看看效果是否会有所提升:

使用cpu:

pytorch + visdom 处理简单分类问题的示例 

使用gpu:

pytorch + visdom 处理简单分类问题的示例

比较观察,似乎并没有什么区别,看来处理简单分类问题(输入,输出少)的问题,神经层和gpu不会对机器学习加持。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决python3 网络请求路径包含中文的问题
May 10 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
python实现超市商品销售管理系统
Nov 22 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
pytorch中torch.max和Tensor.view函数用法详解
Jan 03 Python
3种python调用其他脚本的方法
Jan 06 Python
浅析Python 字符编码与文件处理
Sep 24 Python
pytorch 中autograd.grad()函数的用法说明
May 12 Python
利用Python判断你的密码难度等级
Jun 02 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 #Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 #Python
Numpy array数据的增、删、改、查实例
Jun 04 #Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 #Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 #Python
python验证码识别教程之滑动验证码
Jun 04 #Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 #Python
You might like
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
如何实现浏览器上的右键菜单
2006/07/10 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
前端性能优化建议
2020/09/17 Javascript
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python引用计数操作示例
2018/08/23 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
postman和python mock测试过程图解
2020/02/22 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
客服实习的个人自我鉴定
2013/10/20 职场文书
结婚邀请函范文
2014/01/14 职场文书
教学实习自我评价
2014/01/28 职场文书
毕业设计说明书
2014/05/07 职场文书
同意报考公务员证明
2015/06/17 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python