keras实现多GPU或指定GPU的使用介绍
1. keras新版本中加入多GPU并行使用的函数
下面程序段即可实现一个或多个GPU加速:
注意:使用多GPU加速时,Keras版本必须是Keras2.0.9以上版本
from keras.utils.training_utils import multi_gpu_model #导入keras多GPU函数
import VGG19 #导入已经写好的函数模型,例如VGG19
if G <= 1:
print("[INFO] training with 1 GPU...")
model = VGG19()
# otherwise, we are compiling using multiple GPUs
else:
print("[INFO] training with {} GPUs...".format(G))
# we'll store a copy of the model on *every* GPU and then combine
# the results from the gradient updates on the CPU
with tf.device("/cpu:0"):
# initialize the model
model1 = VGG19()
# make the model parallel(if you have more than 2 GPU)
model = multi_gpu_model(model1, gpus=G)
2.指定使用某个GPU
首先在终端查看主机中GPU编号:
watch -n -9 nvidia-smi
查询结果如下所示:
显示主机中只有一块GPU,编号为0
2.1 下面方法是直接在终端运行时加入相关语句实现指定GPU的使用
export CUDA_VISIBLE_DEVICES=0 python test.py
# 表示运行test.py文件时,使用编号为0的GPU卡
export CUDA_VISIBLE_DEVICES=0,2 python test.py
# 表示运行test.py文件时,使用编号为0和2的GPU卡
2.2 下面方法是在Python程序中添加
import os
# 使用第一张与第三张GPU卡
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 2"
补充知识:踩坑记—-large batch_size cause low var_acc
有时候,我们在训练模型前期,会出现很高的train_acc(训练准确率),但var_acc(验证准确率)却很低。这往往是因为我们模型在训练过程中已经进入局部最优,或者出现过拟合的现象。造成这种情况有多种原因,我只提出以下几点,有补充的可以在下面留言,我补充。
(1).训练数据分布不均匀,可能你的训练数据某一类别占据了大多数,比如95%的数据为苹果,5%的数据为其他类别,那么模型为了拟合训练数据,则模型会偏袒于把识别结果归属于苹果,而验证集的数据是正常的,那么便会出现高train_acc,低val_acc。
(2).训练数据没有shuffle,那么整个batch里面将会是同一个类别数据,比如都为苹果的图片,那么训练一个batch,那么模型输出将会往这一类别靠拢,会形成一个很高的acc的假象,但这个模型泛化能力却很低,因为这个模型都只会为了拟合这批同类的数据。
(3).训练集跟验证集的预处理不一致,这个是细节问题,输入的图片分布不一致,那么必然会影响到验证结果。
(4).模型过于复杂,造成过拟合现象,特别是在于训练数据集不多的情况下,更容易出现过拟合。
(5).这个也是最难发现的,就是过大的batch_size,造成训练前期,模型还未收敛,出现很高的train_acc,却有很低的val_acc,亲测,在120个类别,参数只有七万的分类模型中,在batch-size等于64的情况下,在第二个epoch时,train_acc达到80%,val_acc却只有6%,train_loss跟val_loss也是相差很大,而在batch_size在等于8的情况下,在第二个epoch,train_acc跟val_acc皆能达到60%,且还有上升的趋势。至于为什么,个人认为,模型在大的batch_size的情况下,模型泛化能力下降,且更难拟合,每个epoch所包含的step也更少,且在adam的优化算法,前期的学习率较高,模型出现了振荡,一直在局部最优值徘徊,具体原因不知。
接下来分析下,batc_size对模型的影响:
large batch_size:
好处:训练的更快,每一step都包含更多的训练集,模型准确率会更高,不容易受到噪声的影响,稳定性更好。
small batch_size:
好处:不容易陷入局部最优,泛化能力更强。
总结:
(1).large batch_size,虽然训练模型的训练误差会更低,但往往在execute的时候,效果却不尽人意。
(2).在时间允许的情况下,建议batch_size在32或以下。
以上这篇keras实现多GPU或指定GPU的使用介绍就是小编分享给大家的全部内容了,希望能给大家一个参考。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- dubbo 配置优先级 集群模式 负载均衡策略
- 【STM32F407开发板用户手册】第33章 STM32F407的SPI总线应用之驱动DAC8563
- Salesforce LWC学习(二十) CLI篇:新版本不支持Audience解决方案
- 【STM32F429开发板用户手册】第33章 STM32F429的SPI总线应用之驱动DAC8563
- ELK学习笔记之filbeat pod无法将容器日志发送
- 小学生看了都会的Apache配置虚拟主机教程
- 【STM32F407开发板用户手册】第34章 STM32F407的SPI总线应用之驱动DAC8501
- 学长冷月带你怒刷LeetCode之反转链表
- php面试笔记-php基础知识-变量和引用变量
- 【STM32F429开发板用户手册】第34章 STM32F429的SPI总线应用之驱动DAC8501
- docker 安装mysql5.7
- php面试笔记(5)-php基础知识-自定义函数及内部函数考点
- AJAX的一个简单实例,跨域的解决,使用JQuery来进行ajax的调用
- ASP.NET Core 将文件夹内容输出为压缩包文件方法
- 如何阻止指定类型的SAP CRM附件被上传到服务器