我的电脑配置:

cpu:i5-4200H

gpu:gtx 950M

昨天测试了训练一般的神经网络使用cpu和gpu各自的速度,使用gpu比使用cpu大概能节省42%的时间,当时我以为这么个程度已经很不错了。今天我测试了一下使用keras框架训练一个简单的卷积神经网络,在分别测试cpu和gpu所消耗的时间之前,我其实心里是明白的,节约的时间肯定会比42%要多,因为卷积神经网络的数据特性使然,使用gpu计算肯定是最好的选择,但是测试结果还是让我有点吃惊,照例,先上代码:

from __future__ import print_function
import tensorflow as tf
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
with tf.device('/cpu:0'):   #选择使用的设备,设备编号之前已经得到batch_size = 256num_classes = 10epochs = 2# input image dimensionsimg_rows, img_cols = 28, 28# 国内好像不能直接导入数据集,我们试了几次都不行,后来将数据集下载到本地'~/.keras/datasets/',也就是当前目录(我的是用户文件夹下)下的.keras文件夹中。#下载的地址为:https://s3.amazonaws.com/img-datasets/mnist.npz(x_train, y_train), (x_test, y_test) = mnist.load_data()#iamge_data_format选择"channels_last"或"channels_first",该选项指定了Keras将要使用的维度顺序。#"channels_first"假定2D数据的维度顺序为(channels, rows, cols),3D数据的维度顺序为(channels, conv_dim1, conv_dim2, conv_dim3)if K.image_data_format() == 'channels_first':x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)input_shape = (1, img_rows, img_cols)#"channels_last"假定2D数据维度顺序为(rows,cols,channels),3D数据维度顺序为(conv_dim1, conv_dim2, conv_dim3, channels)else:x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)input_shape = (img_rows, img_cols, 1)#字段类型的转换x_train = x_train.astype('float32')x_test = x_test.astype('float32')#数据中每个像素值取值转换为0到1之间x_train /= 255x_test /= 255print('x_train shape:', x_train.shape)print(x_train.shape[0], 'train samples')print(x_test.shape[0], 'test samples')# 将标注的0-9数值转换为一个长度为10的one-hot 编码。注意从tensorflow.examples.tutorials.mnist导入的MNIST数据集标注已经是one-hot编码,#所以从tutorials中导入MNIST数据集不需要下面两步。y_train = keras.utils.to_categorical(y_train, num_classes)y_test = keras.utils.to_categorical(y_test, num_classes)#下面开始搭建模型的架构,首先导入序贯模型(sequential),即多个网络层的线性堆叠model = Sequential()#第一层添加一个2维卷积层,卷积核大小为3×3,激活函数为ReLU,输入shape在‘channels_first’模式下为(samples,channels,rows,cols)#在‘channels_last’模式下为(samples,rows,cols,channels)model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))model.add(Conv2D(64, (3, 3), activation='relu'))#为空域信号施加最大值池化,pool_size取(2,2)代表使图片在两个维度上均变为原长的一半model.add(MaxPooling2D(pool_size=(2, 2)))#Dropout将在训练过程中每次更新参数时按一定概率(rate)随机断开输入神经元,Dropout层用于防止过拟合。model.add(Dropout(0.25))#Flatten层把多维输入一维化,常用在从卷积层到全连接层的过渡。model.add(Flatten())#Dense层即全连接层model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(num_classes, activation='softmax'))#编译用来配置模型的学习过程,下面包括交叉熵损失函数、Adadelta优化器。指标列表metrics在分类问题一般设置为metrics=['accuracy']。model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])#fit函数指定模型训练的epoch数model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test))score = model.evaluate(x_test, y_test, verbose=0)print('Test loss:', score[0])print('Test accuracy:', score[1])

代码是网上搬运的,我的目的只是单纯地测试gpu和cpu在用于训练时的性能差别,最后的运行结果如下:

先上cpu的运行结果:

可以看到,训练一个卷积神经网络的计算量比训练一个bp神经网络的计算量要大很多很多,大约需要三分钟才能完成训练,每个step需要3ms。

上gpu的运行结果:

所需时间仅为用cpu所需时间的1/8,每个step耗时约为335us。

总结:使用cpu训练卷积神经网络时,每个epoch耗时162秒,每个step耗时3ms;使用gpu训练卷积神经网络时,每个epoch耗时约20s,每个step耗时约335us。相比较使用cpu训练卷积神经网络而言,使用gpu训练卷积神经网络可以节省约88%的时间,果然深度学习使用gpu才是王道。

如果想看bp神经网络分别使用cpu和gpu的训练所需时间对比可以看我之前的文章,这个速度测试阶段大概就告一段落了,以后应该会持续更新有关深度学习的文章还有leetcode题解,当然还会更新一些杂七杂八的文章,喜欢可以点个关注!

我试着在windows系统中跑了一下上述代码,使用cpu训练大概需要20分钟,所以我就没有完整地跑完程序,而使用gpu则完全无法进行训练,看来不是用哪个系统跑深度学习更好的问题了,是windows系统根本跑不了稍微复杂一点的神经网络!所以想要学习深度学习算法还是尽早装一个ubuntu系统吧。

ubuntu16.04 简单的卷积神经网络 cpu和gpu训练时间对比相关推荐

  1. atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现

    前两篇文章分别介绍了卷积层和池化层,卷积和池化是卷积神经网络必备的两大基础.本文我们将介绍一个早期用来识别手写数字图像的卷积神经网络:LeNet[1].LeNet名字来源于论文的第一作者Yann Le ...

  2. Pytorch:手把手教你搭建简单的卷积神经网络(CNN),实现MNIST数据集分类任务

    关于一些代码里的解释,可以看我上一篇发布的文章,里面有很详细的介绍!!! 可以依次把下面的代码段合在一起运行,也可以通过jupyter notebook分次运行 第一步:基本库的导入 import n ...

  3. 构建一个简单的卷积神经网络,使用DRL框架tianshou匹配DQN算法

    在之前的文章中,我们做了如下工作: 如何设计一个类flappy-bird小游戏:[python实战]使用pygame写一个flappy-bird类小游戏 | 设计思路+项目结构+代码详解|新手向 DF ...

  4. 简单的卷积神经网络,实现手写英文字母识别

    简单的卷积神经网络,实现手写英文字母识别 1 搭建Python运行环境(建议用Anaconda),自学Python程序设计 安装Tensorflow.再安装Pycharm等环境.(也可用Pytorch ...

  5. Ubuntu16.04配置pytorch环境(CPU版)

    最近在入手pytorch,但由于电脑硬件的限制,暂时体验了一下无GPU版的pytorch环境,顺便将此配置过程记录下来,供自己和他人以后参考.话不多说,just do it! 一.目标环境 ubunt ...

  6. 第五章:Tensorflow 2.0 利用十三层卷积神经网络实现cifar 100训练(理论+实战)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/LQ_qing/article/deta ...

  7. PyTorch 深度学习实践 GPU版本B站 刘二大人第11讲卷积神经网络(高级篇)GPU版本

    第11讲 卷积神经网络(高级篇) GPU版本源代码 原理是基于B站 刘二大人 :传送门PyTorch深度学习实践--卷积神经网络(高级篇) 这篇基于博主错错莫:传送门 深度学习实践 第11讲博文 仅在 ...

  8. 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测...

    话题 3: 基于深度学习的二进制恶意样本检测 分享主题:全球正在经历一场由科技驱动的数字化转型,传统技术已经不能适应病毒数量飞速增长的发展态势.而基于沙箱的检测方案无法满足 APT 攻击的检测需求,也 ...

  9. CPU比GPU训练神经网络快十几倍,英特尔:别用矩阵运算了

    来源丨机器之心 神经网络训练通常是 GPU 大显身手的领域,然而莱斯大学和英特尔等机构对 GPU 的地位发起了挑战. 在深度学习与神经网络领域,研究人员通常离不开 GPU.得益于 GPU 极高内存带宽 ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task15. 有效的括号
  2. ToolPart的简单开发
  3. 关于NOMINMAX这个预处理宏
  4. Android之android.graphics.drawable.Drawable.Callback回调接口
  5. 2021高考甘肃师大附中成绩查询,2021甘肃理科高考成绩排名一分一档表,甘肃高考理科成绩排名查询...
  6. Keil 使用教程(详解)
  7. 樱花动漫中的视频下载分析
  8. Error in macro ./uart_scope_run_msim_rtl
  9. 两次碰到编译错误: crosses initialization of...
  10. C C++实现网络验证和本地验证
  11. 百度3D地球,高清地图!地形混合!
  12. eureka相同服务名注册多个不同服务
  13. clcl.bz index.php,BZPHP
  14. newLISP你也行 --- 字符串
  15. 魔兽地图服务器修改,如何修改魔兽地图(傻瓜版)
  16. linux:线程同步的5种方法
  17. maven基础:mvn命令常用参数整理;如:-am构建指定模块,同时构建指定模块依赖的其他模块
  18. 根据微信号,生成微信公众号二维码
  19. 分享 9 条消除 if...else 的锦囊妙计
  20. 计算机系统实验六:程序的链接

热门文章

  1. (1)AWD入门攻略大纲
  2. spark-总览(二)
  3. 1029: 挖掘机技术哪家强
  4. Go 每日一库之 cobra
  5. mha mysql_mysql高可用之mha_MySQL
  6. 关闭笔记本自带鼠标触摸键
  7. TCHAR的作用、typedef简介和ASCII,ANSI与Unicode的区别与联系
  8. 第十届蓝桥杯省赛C/C++B组省赛题解(留下了不学无术的泪水)
  9. Mutual Information
  10. 是分支循环还是分支和循环?