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的Bottle框架的一些使用技巧介绍
Apr 08 Python
在Python中用keys()方法返回字典键的教程
May 21 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
python中的单引号双引号区别知识点总结
Jun 23 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
python制作朋友圈九宫格图片
Nov 03 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
Python实现模拟时钟代码推荐
2015/11/08 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
windows下ipython的安装与使用详解
2016/10/20 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
python sorted函数的小练习及解答
2019/09/18 Python
软件测试工程师笔试题带答案
2015/03/27 面试题
物业门卫岗位职责
2013/12/28 职场文书
学习心得体会
2014/01/01 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
个人作风建设心得体会
2014/10/22 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
教师师德承诺书2016
2016/03/25 职场文书
php实现自动生成验证码的实例讲解
2021/11/17 PHP