使用神经网络训练,一个最大的问题就是训练速度的问题,特别是对于深度学习而言,过多的参数会消耗很多的时间,在神经网络训练过程中,运算最多的是关于矩阵的运算,这个时候就正好用到了GPU,GPU本来是用来处理图形的,但是因为其处理矩阵计算的高效性就运用到了深度学习之中。Theano支持GPU编程,但是只是对英伟达的显卡支持,而且对于Python编程而言,修改一些代码就可以使用GPU来实现加速了。
一,首先需要安装GPU环境(说明:我开始按照官网步骤发生了错误,下面是我综合网上一些资料最后安装成功之后的环境配置,本人机器能用)
- 安装Cuda,Cuda是英伟达公司提供的GPU开发环境,可以直接在官网上下载,我安装的是windows64位版本 ,按照制定的步骤一步一步安装即可
- 安装visual studio2010(cuda支持visual studio 2010,2012,2013) ,我就是因为没有装这个导致一直报错:找不到nvcc编译器
- 安装Cuda过程中会自动在windows的环境变量里面加上了CUDA_PATH这个环境变量:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5
- 在环境变量中的path配置如下:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\libnvvp;
5.在前面的文章中介绍了windows下安装theano,在里面有一个 .theanorc.txt文件,如果需要使用GPU,那么需要将其文件改为:[global]
device=gpu
floatX=float32
openmp=False
[blas]
ldflags=
[gcc]
cxxflags = -ID:\Anaconda2\MinGW
[cuda]
root=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin
[nvcc]
fastmath=True
flags= -LD:\Anaconda2\libs
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
如果需要验证是否成功开启了GPU ,可以使用下面的测试程序(见了解gputest.py),如果显示使用的是GPU则表示成功!
到这里,就可以使用Theano来编写GPU加速的程序了,在theano中编写Theano程序需要注意几个点:
1.Python中的浮点数默认是float64位的,但是如果需要用到cuda那么必须将浮点数转成float32,在上面的.theanorc.txt中就是使用了floatX=float32,就是为了这点,当然还是几种其他的方法,例如使用Tensor的T.fvector方法等
2.使用GPU编程,在Theano中得shared parameters需要全部转成float32位数据,array必须使用dtype=float32进行定义或者使用asType等方法转化成float32
3.从GPU中存取数据一定要小心,如果需要将全部数据存入GPU中,那么最好是讲参数全部变成32位的shared parameters,避免或者谨慎使用gpu_from_host方法
了解了上面的内容,我们就可以将前一篇文章的代码改成可以在GPU上运行的代码了,改动的地方如下:
二、将数据类型全部改成float32位的
np.random.seed(0)
train_X, train_y = datasets.make_moons(5000, noise=0.20)
train_y_onehot = np.eye(2)[train_y]
#设置参数
num_example=len(train_X)
nn_input_dim=2 #输入神经元个数
nn_output_dim=2 #输出神经元个数
nn_hdim=1000
#梯度下降参数
epsilon=np.float32(0.01) #learning rate
reg_lambda=np.float32(0.01) #正则化长度
#设置共享变量
# GPU NOTE: Conversion to float32 to store them on the GPU!
X = theano.shared(train_X.astype('float32')) # initialized on the GPU
y = theano.shared(train_y_onehot.astype('float32'))
# GPU NOTE: Conversion to float32 to store them on the GPU!
w1 = theano.shared(np.random.randn(nn_input_dim, nn_hdim).astype('float32'), name='W1')
b1 = theano.shared(np.zeros(nn_hdim).astype('float32'), name='b1')
w2 = theano.shared(np.random.randn(nn_hdim, nn_output_dim).astype('float32'), name='W2')
b2 = theano.shared(np.zeros(nn_output_dim).astype('float32'), name='b2')
w1.set_value((np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim)).astype('float32'))
b1.set_value(np.zeros(nn_hdim).astype('float32'))
w2.set_value((np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim)).astype('float32'))
b2.set_value(np.zeros(nn_output_dim).astype('float32'))
这里把输入数值traing_X和train_y也设置成theano的共享变量,也是为了将数据全部放入GPU中进行运算。其他的过程都不变,整个代码见下:
# -*- coding: utf-8 -*-
import theano
import theano.tensor as T
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
import time
#定义数据类型
np.random.seed(0)
train_X, train_y = datasets.make_moons(5000, noise=0.20)
train_y_onehot = np.eye(2)[train_y]
#设置参数
num_example=len(train_X)
nn_input_dim=2 #输入神经元个数
nn_output_dim=2 #输出神经元个数
nn_hdim=1000
#梯度下降参数
epsilon=np.float32(0.01) #learning rate
reg_lambda=np.float32(0.01) #正则化长度
#设置共享变量
# GPU NOTE: Conversion to float32 to store them on the GPU!
X = theano.shared(train_X.astype('float32')) # initialized on the GPU
y = theano.shared(train_y_onehot.astype('float32'))
# GPU NOTE: Conversion to float32 to store them on the GPU!
w1 = theano.shared(np.random.randn(nn_input_dim, nn_hdim).astype('float32'), name='W1')
b1 = theano.shared(np.zeros(nn_hdim).astype('float32'), name='b1')
w2 = theano.shared(np.random.randn(nn_hdim, nn_output_dim).astype('float32'), name='W2')
b2 = theano.shared(np.zeros(nn_output_dim).astype('float32'), name='b2')
#前馈算法
z1=X.dot(w1)+b1
a1=T.tanh(z1)
z2=a1.dot(w2)+b2
y_hat=T.nnet.softmax(z2)
#正则化项
loss_reg=1./num_example * reg_lambda/2 * (T.sum(T.square(w1))+T.sum(T.square(w2)))
loss=T.nnet.categorical_crossentropy(y_hat,y).mean()+loss_reg
#预测结果
prediction=T.argmax(y_hat,axis=1)
forword_prop=theano.function([],y_hat)
calculate_loss=theano.function([],loss)
predict=theano.function([],prediction)
#求导
dw2=T.grad(loss,w2)
db2=T.grad(loss,b2)
dw1=T.grad(loss,w1)
db1=T.grad(loss,b1)
#更新值
gradient_step=theano.function(
[],
updates=(
(w2,w2-epsilon*dw2),
(b2,b2-epsilon*db2),
(w1,w1-epsilon*dw1),
(b1,b1-epsilon*db1)
)
)
def build_model(num_passes=20000,print_loss=False):
w1.set_value((np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim)).astype('float32'))
b1.set_value(np.zeros(nn_hdim).astype('float32'))
w2.set_value((np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim)).astype('float32'))
b2.set_value(np.zeros(nn_output_dim).astype('float32'))
for i in xrange(0,num_passes):
start=time.time()
gradient_step()
end=time.time()
# print "time require:"
# print(end-start)
if print_loss and i%1000==0:
print "Loss after iteration %i: %f" %(i,calculate_loss())
def accuracy_rate():
predict_result=predict()
count=0;
for i in range(len(predict_result)):
realResult=train_y[i]
if(realResult==predict_result[i]):
count+=1
print "count"
print count
print "the correct rate is :%f" %(float(count)/len(predict_result))
def plot_decision_boundary(pred_func):
# Set min and max values and give it some padding
x_min, x_max = train_X[:, 0].min() - .5, train_X[:, 0].max() + .5
y_min, y_max = train_X[:, 1].min() - .5, train_X[:, 1].max() + .5
h = 0.01
# Generate a grid of points with distance h between them
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Predict the function value for the whole gid
Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the contour and training examples
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.scatter(train_X[:, 0], train_X[:, 1], c=train_y, cmap=plt.cm.Spectral)
plt.show()
build_model(print_loss=True)
accuracy_rate()
# plot_decision_boundary(lambda x: predict(x))
# plt.title("Decision Boundary for hidden layer size 3")
程序中为了使得加速效果更明显,将隐含层的个数调整为1000个然后将训练参数个数调整到5000个,首先来看一下执行结果:
然后我们对比一下在使用GPU加速之前和使用GPU加速之后一次迭代的时间代价,需要使用cpu只需要将上面配置文件的device的gpu改成cpu即可
在使用GPU之后,一次迭代gradient_step()的时间是:
使用CPU运行的结果是:
我的显卡是GT720,属于比较低端的显卡,我的CPU是Inter i5,算是还不多的CPU,但是就算配置相差大,但是加速效果也有5倍之多,在稍微好点的GPU中,这个实验可以跑到7.5ms,加速足足有40倍之多,所以GPU对训练过程的加速效果还是显而易见的
分享到:
相关推荐
neuralnetworks, java深度学习算法与基于gpu加速的深层神经网络 基于GPU支持的深神经网络这是我在ExB研究工作时开发的一个新版本的更新版本。 当前,可以生成项目,但有些测试不工作。 如果你想访问以前的版本,则...
基于java打造的深度学习框架,帮助你快速搭建神经网络,实现训练或测试模型,支持多线程运算,框架目前支持BP神经网络、卷积神经网络、vgg16、resnet、yolo等模型的构建,目前引擎最新版本支持CUDA和CUDNN两种GPU...
1)、分析深度神经网络、卷积神经网络的预测过程和训练过程算法共性和特 性,并以此为基础设计FPGA运算单元,算法包括前向计算算法、本地预训练算法和全局训练算法。 2)、根据FPGA资源情况设计基本运算单元,包括前向...
用Java编写的具有GPU加速(OpenCL)的深度学习框架。 特征 可以与任何支持OpenCL(1.1)的GPU一起使用。 但是,仅在AMD和Apple平台中对代码进行过调整。 Nvidia和Intel尚未经过全面测试,但未预见到重大问题。 就像...
本文来自于网络,介绍了如何选择并训练模型,处理数据,以及在终端移动设备上工程化落地深度神经网络并做GPU加速,。AI无疑是近几年的超级风口,“AllinAI“等押宝AI的口号层出不穷,AI的风头一时无两。实现AI有很多...
基于java打造的深度学习框架,帮助你快速搭建神经网络,实现训练或测试模型,支持多线程运算,框架目前支持BP神经网络、卷积神经网络、vgg16、resnet、yolo等模型的构建,目前引擎最新版本支持CUDA和CUDNN两种GPU...
吴恩达卷积神经网络,...3.加入了gpu加速所需的代码 4.含数据集+cnn_utils.py【对原版本做了简化】 5.含训练、模型保存、模型加载、单个图片预测代码 6.里面保存了个已经在gpu上训练好的模型,下载后也可以自行训练
15.1.2 深度神经网络训练和解码加速248 15.1.3 序列鉴别性训练248 15.1.4 特征处理249 15.1.5 自适应 250 15.1.6 多任务和迁移学习251 15.1.7 卷积神经网络 251 15.1.8 循环神经网络和长短时记忆神经网络251 ...
除此之外,PyTorch还提供了一些内置的神经网络层和损失函数,以及预训练模型的接口。这些工具和功能使得我们可以轻松地构建和训练深度学习模型,而不需要从头开始编写所有的代码。 视频大小:2.8G
在机器学习中,深度信念网络 (DBN) 是一种生成图形模型,或者是一种深度神经网络,由多层潜在变量(“隐藏单元”)组成,层之间有连接,但内部的单元之间没有连接。每一层。 当以无监督的方式对一组示例进行训练时...
本文介绍了一种用于学习反应势能面(PESs)的开源GPU 加速神经网络(NN)框架。并研究在虚拟现实(iMD VR)中实时交互从头开始分子动力学的使用,作为一种新策略,使人类用户能够沿着反应路径快速采样几何图形,随后可用于...
网络训练:设计神经网络模型,使用服务器或者具有外部图形处理单元或GPU的PC上通过大型数据集离线训练以调整模型参数,通常在PC上使用Caffe 、TensorFlow等框架完成。 模型部署:采用包含参数的预训练模型,对输入...
高阶信息如何加速神经网络训练?; 机智深度学习训练平台及应用; 基于 GPU 的机器翻译推理性能优化; 基于 Tensor Core 的 CNN INT8 定点训练加速; 如何快速搭建全 GPU 加速的 AI 应用; 使用 Triton 优化深度学习...
CUDNN库提供了一些高效的卷积、池化、归一化、循环神经网络等算法的实现,可以大大加速深度学习的训练和推断过程。CUDNN库可以与多种深度学习框架集成,包括TensorFlow、PyTorch、Caffe等。 CUDNN库提供了多种优化...
深度学习方法: 深度学习是近年来较为热门的领域,其基于神经网络,利用网络的自适应学习率不断调节损失函数的值,大大减少了人工调参的复杂度,并且由于目前计算机算力水平的大幅度提升,利用GPU加速运算使得在短...
基于YOLOv5的神经网络训练用于检测火灾初期的火焰和烟雾模型源代码+训练数据 Accelerate the engine.py 主要实现了使用TensorRT加速的YOLOv5目标检测模型的预处理、推理和后处理: serial.Serial:Python中的串口...
赫贝尔Python中的GPU加速的深度学习库Hebel是一个用于Python深度神经网络学习的库,它通过PyCUDA通过CUDA与GPU一起使用GPU加速。 它实现了最重要的神经网络模型类型,并提供了各种不同的激活函数和训练方法,例如...
使用 GPU 加速训练 模型保存与加载 TensorBoard 可视化 TensorFlow 生态系统 TensorFlow Hub TensorFlow Lite TensorFlow.js TensorFlow Extended (TFX) TensorFlow 社区与资源 TensorFlow 官方文档 TensorFlow ...
一种常见的深度学习 ECG 模型是卷积神经网络(CNN),它可以有效地捕获时间序列数据中的模式和特征。研究人员使用 PyTorch 构建 CNN 模型,输入是原始的心电图信号,输出是对心脏状态的分类或预测。通过大量的心电图...