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 相关文章推荐
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
Python中for循环控制语句用法实例
Jun 02 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
Python中@property的理解和使用示例
Jun 11 Python
python按比例随机切分数据的实现
Jul 11 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
详解Python中namedtuple的使用
Apr 27 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
python能做哪些生活有趣的事情
Sep 09 Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
php仿ZOL分页类代码
2008/10/02 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
php输入数据统一类实例
2015/02/23 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
Python unittest模块用法实例分析
2018/05/25 Python
python 美化输出信息的实例
2018/10/15 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
Python包和模块的分发详细介绍
2020/06/19 Python
总经理岗位职责说明书
2014/07/30 职场文书
争做文明公民倡议书
2014/08/29 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
期末复习计划
2015/01/19 职场文书
教学质量月活动总结
2015/05/11 职场文书
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL