使用神经网络训练,一个最大的问题就是训练速度的问题,特别是对于深度学习而言,过多的参数会消耗很多的时间,在神经网络训练过程中,运算最多的是关于矩阵的运算,这个时候就正好用到了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对训练过程的加速效果还是显而易见的
分享到:
相关推荐
人工神经网络训练是机器学习和深度学习的核心组件之一,但随着神经元数量的增加,训练时间也随之增加。这篇论文提出了一种使用OpenCL实现的GPU加速人工神经网络训练方法,以提高训练速度。 首先,人工神经网络训练...
在本篇博文中,我们将深入探讨如何利用Theano这一强大的深度学习库来编写神经网络。Theano是一款Python库,它允许定义、优化并高效地计算数学表达式,特别是在多维数组处理方面,对于构建和训练神经网络模型尤其有用...
TensorFlow是一个广泛使用的深度学习框架,它支持GPU加速,使得处理大规模数据和复杂模型成为可能。下面我们将深入探讨如何在TensorFlow环境中设置和优化GPU使用。 首先,理解为何需要GPU加速至关重要。深度学习...
本文主要讨论基于虚拟化的多GPU深度神经网络训练框架,旨在解决深度神经网络在分布式多机多GPU上的加速训练问题。作者提出了基于虚拟化的远程多GPU调用方法,利用分布式环境中的远程GPU资源实现深度神经网络的加速...
4. **第5章** 探讨数据加载、GPU加速以及可视化等实用工具的使用方法,为实际项目打下基础。 第二部分(第6~10章)以实战案例为主线,引导读者将所学知识应用到具体任务中: 1. **第6章** 通过Kaggle上的图像二...
**PyTorch深度学习与图神经网络卷1:基础知识** PyTorch是当前最流行的深度学习框架之一,它以其灵活性和易用性受到广大研究人员和开发者的青睐。本卷主要介绍PyTorch的基础知识,包括核心概念、基本操作以及如何...
MATLAB中的深度学习工具箱支持创建和训练CNN,它提供了一系列的函数和类,使得构建复杂的神经网络结构变得简单。在GPU上运行CNN,可以利用其并行计算能力,大幅减少训练时间,这对于处理大规模数据集或者复杂模型...
深度学习的核心在于训练过程,而并行计算则能显著加速这一过程。MATLAB支持CPU多线程和GPU并行计算,这使得在大型数据集上训练模型变得更加高效。在GPU上执行计算可以极大地减少训练时间,特别是对于那些计算密集型...
这个压缩包“MATLAB神经网络案例:并行运算与神经网络——基于CPUGPU的并行神经网络运算.zip”显然是一个教学资源,它详细探讨了如何利用MATLAB的并行计算能力来提升神经网络的训练速度,特别是涉及到CPU和GPU的并行...
5. **深度学习的GPU加速**:了解如何在GPU上运行深度学习模型,如CNN(卷积神经网络),提升模型训练和推理的速度。 6. **性能优化技巧**:学习如何进行CUDA程序的性能分析和优化,包括内存管理、计算效率的提升等...
GPU(图形处理器)因其并行计算能力的优越性,逐渐成为加速神经网络计算的重要工具。 GPU的发展现状表明,它们已经从原本主要用于图形渲染和游戏性能提升的角色,转变为高性能计算的重要平台。相比于CPU,GPU具有更...
标题中的“Python-深度学习GPU训练系统”表明我们将探讨如何使用Python编程语言来构建和优化在GPU上运行的深度学习模型。深度学习是人工智能的一个分支,它利用神经网络对复杂数据进行模式识别和预测。GPU(图形处理...
在深度学习模型的训练过程中,需要使用大量的标记数据来训练神经网络,使其能够学习数以百万计的权重或参数。然后,使用训练好的模型来进行预测,以满足实时应用的需求。然而,这个过程中存在着许多挑战,例如模型的...
深度学习是一种基于人工神经网络的学习技术,它在过去的几年里取得了显著的进展,特别是在图像识别、自然语言处理和游戏智能等领域。随着社会数据化的到来,深度学习模型由于其高复杂度和巨大的计算需求而被广泛研究...
其简洁明了的语法和强大的第三方库支持使得Python成为神经网络与深度学习领域首选的语言之一。 #### 2.2 常用Python库介绍 - **NumPy**:提供高性能的数组操作和数学函数。 - **Pandas**:用于数据处理和分析的...
其中,多层神经网络是深度学习的核心技术之一,它的复兴与变革对推动整个领域的发展具有重要意义。本文旨在探讨多层神经网络的历史背景、发展历程以及最新进展,并对其未来趋势进行展望。 #### 二、多层神经网络的...
neuralnetworks, java深度学习算法与基于gpu加速的深层神经网络 基于GPU支持的深神经网络这是我在ExB研究工作时开发的一个新版本的更新版本。 当前,可以生成项目,但有些测试不工作。 如果你想访问以前的版本,则...
基于java打造的深度学习框架,帮助你快速搭建神经网络,实现训练或测试模型,支持多线程运算,框架目前支持BP神经网络、卷积神经网络、vgg16、resnet、yolo等模型的构建,目前引擎最新版本支持CUDA和CUDNN两种GPU...
文档中提到,在NVIDIA的推动下,GPU加速计算领域在过去几年里实现了显著的增长,尤其是在深度学习方面,GPU的应用掀起了全球热潮,许多企业和研究机构依靠GPU在深度学习领域实现了创新。 3. GPU技术的发展与展望 ...
Omega-AI是一个基于Java开发的深度学习框架,其设计目标是简化神经网络的构建过程,加速模型的训练和推理,并且充分利用硬件资源,如多线程计算和GPU加速。这个框架的核心特性包括自动求导、多线程优化以及对CUDA和...