Pytorch和Tensorflow在10000*1000数据规模线性回归算法中的运算速度对比

因为在学习人工智能相关知识,于是将学习过程与程序放在这里,希望对大家有帮助,共同学习,共同进步(不喜勿喷)

线性回归算法基本原理

回归问题是基于已有数据对新的数据进行预测,如预测股票走势。这里我们主要讲简单的线性回归。
下面举一个简单的例子:
假设我们想要求出橘子的产量在天气,温度,湿度等情况下的关系,那么我们就可以用线性回归来求解。那么我们假设橘子的产量为y,天气为x1,温度为x2,湿度为x3。那么产量y与x1,x2,x3的关系为:

那么写成向量形式就是:

那么接下来要求的就是最适合的w和b,那么怎么判断w和b最合适呢,那就要用到损失函数(Loss).

损失函数(Loss)

在回归问题中常用的损失函数是均方差损失(MSE),回归中的输出是一个实数值,这里采样的平方损失函数类似于线性回归中的最小二乘法。对于每个输入实例都有一个输出值,在将所有输入实例预测值和真实值间的误差求平方,取平均。
那么在计算机当中如何实现呢,我们随机设定w和b的值,此时得到的y为模型的预测值记作
那么损失就为
接下来我们的问题就转化为了求最小Loss的问题。而为了得到最新的Loss,采用的方法为梯度下降法。

梯度下降法

梯度下降法的基本思想可以类比为一个下山的过程。
假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了

Pytorch实现

#导入要用到的库
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import timex = np.ones((10000,1000))
inputs = x+np.random.rand(10000,1000)
targets = np.ones((10000,1))#将numpy转化为tensor 并设为float32类型
inputs = torch.from_numpy(inputs)
targets = torch.from_numpy(targets)
inputs = torch.as_tensor(inputs,dtype=torch.float32)
targets = torch.as_tensor(targets,dtype=torch.float32)
#创建权重和偏置的初始化矩阵
model = nn.Linear(1000,1)
#创建一个TensorDataset,可以读取 inputs 和 targets 的行作为元组
from torch.utils.data import TensorDataset
#将inputs,targets放入train_ds中
train_ds=TensorDataset(inputs,targets)
from torch.utils.data import DataLoader#创建一个 DataLoader,它可以在训练时将数据分成预定义大小的批次。它还能提供其它效用程序,如数据的混洗和随机采样
batch_size=10#设定一次运行的数据量
#在每次迭代中,数据加载器都会返回一批给定批大小的数据。如果 shuffle 设为 True,则在创建批之前会对训练数据进行混洗。混洗能帮助优化算法的输入随机化,这能实现损失的更快下降。
train_dl=DataLoader(train_ds,batch_size,shuffle=True)
preds = model(inputs)#得到模拟值但是和真实值之相差较大
loss_fn = nn.MSELoss()#定义损失函数 预测值和真实值差值平方的平均数
loss = loss_fn(preds,targets)
opt= torch.optim.SGD(model.parameters(),lr=0.0001)#选择优化器 SGD为随机梯度下降函数
def fit(num_epochs,model,loss_fn,opt):px,py=[],[]for epoch in range(num_epochs):for xb,yb in train_dl:pred=model(xb)loss = loss_fn(pred,yb)#计算损失loss.backward()#梯度下降函数opt.step()#用opt.step()实现model中的w和b的改变opt.zero_grad()px.append(epoch)py.append(loss.item())if(epoch+1)%10==0:print("Epoch[{}/{}],Loss:{:.4f}".format(epoch+1,num_epochs,loss.item()))if epoch % 10 ==0:plt.cla()plt.plot(px,py,'r-',lw=1)
start = time.perf_counter()
fit(100,model,loss_fn,opt)
elapsed = (time.perf_counter() - start)
print("Time used:",elapsed)

运行结果如下图所示:

此时会发现用cpu运行的时间很长,那我们将其设置为给gpu模式下运行,将代码改为

#导入要用到的库
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import timeuse_cuda = torch.cuda.is_available()#检查gpu是否可用
x = np.ones((10000,1000))
inputs = x+np.random.rand(10000,1000)
targets = np.ones((10000,1))#将numpy转化为tensor 并设为float32类型
inputs = torch.from_numpy(inputs)
targets = torch.from_numpy(targets)
inputs = torch.as_tensor(inputs,dtype=torch.float32)
targets = torch.as_tensor(targets,dtype=torch.float32)
#创建权重和偏置的初始化矩阵
model = nn.Linear(1000,1)
#创建一个TensorDataset,可以读取 inputs 和 targets 的行作为元组
if use_cuda:#如果gpu可用,将数据和模型都放到gpu中inputs=inputs.cuda()targets = targets.cuda()model=model.cuda()
from torch.utils.data import TensorDataset
#将inputs,targets放入train_ds中
train_ds=TensorDataset(inputs,targets)
from torch.utils.data import DataLoader#创建一个 DataLoader,它可以在训练时将数据分成预定义大小的批次。它还能提供其它效用程序,如数据的混洗和随机采样
batch_size=10#设定一次运行的数据量
#在每次迭代中,数据加载器都会返回一批给定批大小的数据。如果 shuffle 设为 True,则在创建批之前会对训练数据进行混洗。混洗能帮助优化算法的输入随机化,这能实现损失的更快下降。
train_dl=DataLoader(train_ds,batch_size,shuffle=True)
preds = model(inputs)#得到模拟值但是和真实值之相差较大
loss_fn = nn.MSELoss()#定义损失函数 预测值和真实值差值平方的平均数
loss = loss_fn(preds,targets)
opt= torch.optim.SGD(model.parameters(),lr=0.0001)#选择优化器 SGD为随机梯度下降函数
def fit(num_epochs,model,loss_fn,opt):px,py=[],[]for epoch in range(num_epochs):for xb,yb in train_dl:pred=model(xb)loss = loss_fn(pred,yb)loss.backward()opt.step()#用opt.step()实现model中的w和b的改变opt.zero_grad()px.append(epoch)py.append(loss.item())if(epoch+1)%10==0:print("Epoch[{}/{}],Loss:{:.4f}".format(epoch+1,num_epochs,loss.item()))if epoch % 10 ==0:plt.cla()plt.plot(px,py,'r-',lw=1)
start = time.perf_counter()
fit(100,model,loss_fn,opt)#运行100次计算时间
elapsed = (time.perf_counter() - start)
print("Time used:",elapsed)


此时发现运算时间大大加长,查资料得到gpu善于并行运算,而将数据分为10个一组显然是不正确的。于是删掉代码中的

from torch.utils.data import TensorDataset
#将inputs,targets放入train_ds中
train_ds=TensorDataset(inputs,targets)
from torch.utils.data import DataLoader#创建一个 DataLoader,它可以在训练时将数据分成预定义大小的批次。它还能提供其它效用程序,如数据的混洗和随机采样
batch_size=10#设定一次运行的数据量
#在每次迭代中,数据加载器都会返回一批给定批大小的数据。如果 shuffle 设为 True,则在创建批之前会对训练数据进行混洗。混洗能帮助优化算法的输入随机化,这能实现损失的更快下降。
train_dl=DataLoader(train_ds,batch_size,shuffle=True)

将代码归改为

#导入要用到的库
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import timeuse_cuda = torch.cuda.is_available()#检查gpu是否可用
x = np.ones((10000,1000))
inputs = x+np.random.rand(10000,1000)
targets = np.ones((10000,1))#将numpy转化为tensor 并设为float32类型
inputs = torch.from_numpy(inputs)
targets = torch.from_numpy(targets)
inputs = torch.as_tensor(inputs,dtype=torch.float32)
targets = torch.as_tensor(targets,dtype=torch.float32)
#创建权重和偏置的初始化矩阵
model = nn.Linear(1000,1)
#创建一个TensorDataset,可以读取 inputs 和 targets 的行作为元组
if use_cuda:#如果gpu可用,将数据和模型都放到gpu中inputs=inputs.cuda()targets = targets.cuda()model=model.cuda()
preds = model(inputs)#得到模拟值但是和真实值之相差较大
loss_fn = nn.MSELoss()#定义损失函数 预测值和真实值差值平方的平均数
loss = loss_fn(preds,targets)
opt= torch.optim.SGD(model.parameters(),lr=0.0001)#选择优化器 SGD为随机梯度下降函数
def fit(num_epochs,model,loss_fn,opt):px,py=[],[]for epoch in range(num_epochs):pred=model(inputs)loss = loss_fn(pred,targets)loss.backward()opt.step()#用opt.step()实现model中的w和b的改变opt.zero_grad()px.append(epoch)py.append(loss.item())if(epoch+1)%10==0:print("Epoch[{}/{}],Loss:{:.4f}".format(epoch+1,num_epochs,loss.item()))if epoch % 10 ==0:plt.cla()plt.plot(px,py,'r-',lw=1)
start = time.perf_counter()
fit(100,model,loss_fn,opt)#运行100次计算时间
elapsed = (time.perf_counter() - start)
print("Time used:",elapsed)


运算速度大大提升,由此可知gpu在运算时比cpu运算的速度快的多。

Tensorflow实现(GPU)

import numpy as np
import tensorflow as tfpx,py=[],[]
x = np.ones((10000,1000))
inputs = x+np.random.rand(10000,1000)
targets = np.ones((10000,1))X = tf.constant(inputs,dtype=tf.float32)#创建一个tensor常量
y = tf.constant(targets,dtype=tf.float32)
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)variables = [a, b]
num_epoch = 100
optimizer = tf.keras.optimizers.SGD(learning_rate=0.0001)
# 定义随机梯度下降法中的优化器和学习率
start = time.perf_counter()
for e in range(num_epoch):# 使用tf.GradientTape()记录损失函数的梯度信息with tf.GradientTape() as tape:y_pred = a * X + b#计算损失函数loss = tf.reduce_mean(tf.square(y_pred - y))#对每一个数平方并累加px.append(e)py.append(loss)# TensorFlow自动计算损失函数关于自变量(模型参数)的梯度grads = tape.gradient(loss, variables)# TensorFlow自动根据梯度更新参数optimizer.apply_gradients(grads_and_vars=zip(grads, variables))if num_epoch % 10 ==0:plt.cla()plt.plot(px,py,'r-',lw=1)
print(loss)
elapsed = (time.perf_counter() - start)
print("Time used:",elapsed)


可以看出tensorflow在相同学习率与计算次数的情况下运行的速度不如pytorch

将计算次数设置为1000,进行比较

pytorch在1000次运行下的计算时间

tensorflow在1000次运行下的计算时间

比较之下,在线性回归的计算中pytorch更胜一筹

总结

相同的学习率以及计算次数下,gpu比cpu运算速度更快,同时pytorch比tensorflow更快,顺带一提,在cpu的运行速度比较上,tensorflow比pytorch更快。

本人为新人,还在学习阶段如果有写的不正确的地方欢迎大佬指正,不喜勿喷。

Pytorch和Tensorflow在10000*1000数据规模线性回归算法中的运算速度对比相关推荐

  1. 同时安装pytorch和TensorFlow等多种深度学习开发环境(1)

    现在的开发环境比较多,在学习的过程中,经常会使用到不同的开发环境,最常用的就是TensorFlow和pytorch,以及其他的开发环境,我在学习的过程中使用的开发环境主要有pytorch和Tensor ...

  2. TensorFlow csv读取文件数据(代码实现)

    TensorFlow csv读取文件数据(代码实现) 大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 Tens ...

  3. 掌握深度学习,为什么要用PyTorch、TensorFlow框架?

    作者 | Martin Heller 译者 | 弯月 责编 | 屠敏 来源 | CSDN(ID:CSDNnews) [导读]如果你需要深度学习模型,那么 PyTorch 和 TensorFlow 都是 ...

  4. 2022年了,PyTorch和TensorFlow选哪个?

    Datawhale推荐 作者:Ryan O'Connor,来源:机器之心 坊间传闻:「TensorFlow 适合业界,PyTorch 适合学界」.都 2022 年了,还是这样吗? 2022年了,你是选 ...

  5. 谷歌研究院最新发现:训练结果不准确,超大数据规模要背锅!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:新智元 数据 ...

  6. PyTorch、TensorFlow最新版本对比,2021年了你选谁?

    选自towards data science 作者:Mostafa Ibrahim 机器之心编译 编辑:陈萍 PyTorch(1.8)和Tensorflow(2.5)最新版本比较. 自深度学习重新获得 ...

  7. 985博士分享Pytorch与Tensorflow,哪个更值得你学习?

    本文将探讨PyTorch和TensorFlow这两种流行深度学习框架之间的关键相似点和不同点.为什么选择这两个框架,而不是其他的呢?目前有很多的深度学习框架,而且很多都可用于实际的生产,我之所以选择这 ...

  8. 深度学习环境配置指南:Pytorch、TensorFlow、Keras

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Yukyin@知乎 来源丨https://zhuanlan.z ...

  9. 谁是深度学习框架一哥?2022 年,PyTorch 和 TensorFlow 再争霸

    来源:机器学习研究组订阅 用PyTorch还是TensorFlow,对于大部分深度学习从业者来说真是一个头疼的问题.最近Reddit上有个帖子从三个方面对比了两个框架,结果竟然是平手? 你用PyTor ...

最新文章

  1. 使用自定义材质球,实现NGUI屏幕溶解和灰显
  2. shell脚本中28个特殊字符的作用简明总结
  3. windows下gvim中文乱码解决方案
  4. 【代码笔记】iOS-播放从网络上下载的语音
  5. React开发(246):react项目理解 this打印
  6. info命令Linux,Linux zipinfo命令
  7. idea多行编辑_开发神器idea被玩残了,你们功不可没啊!
  8. SVN客户端安装教程
  9. 二维 稳态边界层问题MATLAB,第三章 边界层理论.ppt
  10. win11 恢复win10开始菜单及任务栏
  11. vue创建项目卡住不动,vue create project卡住不动 解决办法
  12. vm安装centos,黑屏或黑屏且左上角有光标闪动
  13. c语言第七章函数实验总结,C语言学习与总结---第七章:函数 [01]
  14. css实现图片虚化_css怎么虚化背景图片?css虚化背景图片的方法介绍
  15. 昆山中创张嘉平:软件成为软件工程才容易成功
  16. 本机电脑清除DNS缓存+浏览器清除DNS缓存
  17. 北林信息学院计算机导师名单,北京林业大学信息学院计算机应用技术导师介绍:刘文萍...
  18. dfs文件服务器详解,DFS文件服务器详解
  19. 兔子数列 - C语言
  20. js获取行内以及非行内样式

热门文章

  1. 中国药典 android,中国药典app下载_中国药典官网最新版安装 - 风云下载
  2. XSSFWorkbook 根据单元格内容 自动调整行高[自动换行]
  3. Can anybody get it?
  4. 【Python面向对象编程】第17篇 property类
  5. DELPHI四舍五入问题解决
  6. Android写文件到手机中
  7. php phalcon 中文手册,Phalcon7 内核开发手册
  8. 生物学丨PsbA丨D1 protein of PSII应用实例
  9. 英语结构句型200佳句
  10. 计算机测试题目及答案6,2015职称计算机《PowerPoint》章节习题及答案(6)