运行keras时出现Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR的原因和解决方法

Tensorflow和Keras的关系

在正式进入这个问题之前,我们先来了解一下tensorflow和keras之间的关系,因为后面会用到这个地方的知识。

  • 首先,tensorflow和keras都是深度学习框架,当你遇到上面这个问题的时候表明你至少用过两者之一。

  • 其次,tensorflow相较于keras更偏向于底层,而keras封装性更好,类似于接口。

  • keras是在tensorflow的基础上建立起来的,可以把keras看做tensorflow或者theano(已经停更的深度学习框架)的接口
    两者的直观关系如图:
    运行keras时出现Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR的原因和解决方法_第1张图片
    图片来自link

  • 所以说在运行keras的时候,实际上在底层还是运行tensorflow,但是keras封装性好,学习起来比较简单。

进入正题

  • 原因:出现Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR的原因是你运行代码的电脑的显存不够导致的
    • 一般情况下,如果不加以限制,很多深度学习框架的代码在运行的时候会申请整个显存空间(即便它不需要这么多的资源,但是它申请了之后就不允许其他的程序使用),所以在这种状态下运行代码,就会出现显存不够用的问题(因为还有其他的程序或操作需要显存资源)
  • 解决方法:通过编写代码,控制显存的使用就可以避免这个问题
import tensorflow as tf
config = tf.compat.v1.ConfigProto(gpu_options=tf.compat.v1.GPUOptions(allow_growth=True))
sess = tf.compat.v1.Session(config=config)
# tf.compat.v1.ConfigProto() 这是tensorflow2.0+版本的写法,这个方法的作用就是设置运行tensorflow代码的时候的一些配置,例如如何分配显存,是否打印日志等;所以它的参数都是 配置名称=True/False(默认为False) 这种形式
# gpu_options=tf.compat.v1.GPUOptions(allow_growth=True) 限制GPU资源的使用,此处allow_growth=True是动态分配显存,需要多少,申请多少,不是一成不变、而是一直变化
# sess = tf.compat.v1.Session(config=config) 让这些配置生效

+ 为什么使用tensorflow的代码能够解决keras的问题,这就可以用第一部分两者的关系来解释了,keras的底层是tensorflow

你可能感兴趣的:(Debug&Knowledge,python,深度学习,人工智能)