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中的自省(反射)详解
Jun 02 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
python生成二维码的实例详解
Oct 29 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
python调用其他文件函数或类的示例
Jul 16 Python
python超时重新请求解决方案
Oct 21 Python
基于python监控程序是否关闭
Jan 14 Python
python实现飞机大战项目
Mar 11 Python
Python基础之常用库常用方法整理
Apr 30 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
PHP生成Flash动画的实现代码
2010/03/12 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
JS长整型精度问题实例分析
2015/01/13 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python根据经纬度计算距离示例
2014/02/16 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
Python更换pip源方法过程解析
2020/05/19 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
物理专业本科生自荐信
2014/01/30 职场文书
关爱留守儿童标语
2014/06/18 职场文书
博士生专家推荐信
2015/03/25 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
python生成随机数、随机字符、随机字符串
2021/04/06 Python