在深度知识追踪(DKT)
这方面,已经看了多篇论文,对其中的一些模型也是做了简单的了解。所以在这个基础上,我对一个已有的DKT
程序进行调试学习。本文主要是对训练模型的过程进行学习总结。
在进行程序调试的时候,首先遇到的问题就是环境不能满足程序的运行。虽说配置环境是一个并不是很难, 但是容易处处出现问题。
首先是python
的版本问题,在下载程序以前,我的电脑上是存在一个版本的python。但是根据程序所需要的版本与我本机上的不同,同时我也并不想删除原有版本的python,所以这就需要设计python版本切换
的问题了。
这里使用的开发工具是pycharm
,下好对应版本的python后,通过设置选择对应的版本:
使用这个工具的好处是,我不需要对环境变量进行更改,直接就可以切换我所需要的版本,同时还不会影响到其他程序使用的版本问题。
tensorflow-cpu
和tensorflow-gpu
的选择。在一般进行小数据量的处理时,选择两种之间的差别并不大,但是在进行大数据量的计算的时候,cpu
版的计算时间就会出现明显的增加。
基于该程序性的数据量比较大的基础,这里就选择使用gpu
版。
安装tensorflow-gpu
直接使用python包管理安装工具pip
进行安装。
pip install tensorflow-gpu==1.10.0
注意:如果在安装的过程中提示出现pip版本
的问题,直接将pip更新到最新的版本就可以了。
因为上面选择了tensorflow-gpu==1.10.0
,所以对CUDA
的版本也是有对应的要求,这就跟我之前的版本出现了冲突,
tensorflow:ImportError: Could not find 'cudart64_90.dll'
按照报错的提示,tensorflow
的导入需要CUDA9
的版本。
去官网下载完CUDA9之后,在进行环境变量
配置的时候,一定要将CUDA_PATH
设置为版本9的对路径。
安装完CUDA后,依然会出现报错:
ImportError: Could not find ‘cudnn64_7.dll’
报错提示导入需要cudnn7
的支持,在官网上找到对应CUDA9
版本的cudnn
,然后进行下载解压,并将对应文件放到安装好的cuda的文件夹下:
将bin\cudnn64_7.dll
放到\bin
目录下。
将include\cudnn.h
放到\include
目录下。
将lib\x64\cudnn.lib
放到\lib\x64
目录下。
继续报错:
ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject
出现该报错的主要原因,是numpy
的版本不对,需要将numpy的版本更新为1.16.0
。
pip install -U numpy==1.16.0
更新numpy,直接使用pip
进行更新。
pip show numpy
更新后查看一下numpy的版本,成功更新到1.16.0:
ResourceExhaustedError: OOM when allocating tensor with shape[512] and type float on /job:localhost
出现该报错的原因是:网络tensor
过大,训练时参数
过多,导致显存不够,资源耗尽。
因为按照训练的要求,训练参数不能修改,所以在解决时,将batch_size
改小。
在tensorflow中,batch_size
是每个训练批次的大小,它主要影响完成每个epoch(全数据集)
所需要的时间,以及每个迭代(iteration)
之间梯度的平滑程度。
一般来说,在合理范围内适当的增大batch_size能够增加内存的利用率
,提高大矩阵乘法的并行效率。这就使得完成每个epoch
的时间减少。
但是同时,增大batch_size
也可能会使得内存的容量不够,这也就是导致我们上面的问题。
解决:
1.缩小batch_size:程序开始时,batch_size
设置的大小为16
,将其缩小一半后,未能解决问题,继续缩小,最后,将其设置为4
.
2.关闭电脑中其他运行的无关程序:其他运行的程序也会在一定程度上占用内存,所以将这些程序关闭,也能增大一些可以使用的内存。
在训练循环中,定期调用saver.save()
方法,向文件夹中写入包含了当前模型中所有可训练变量的 checkpoint
文件。
saver.save(sess, FLAGS.train_dir, global_step=step)
其中sess
是tensorflow中的会话控制(session)
;FLAGS.train_dir
是训练的checkpoint
的存储位置;global_step
是指训练的第几步。
每次训练都会出现后面的三个文件,第一次训练会出现checkpoint
文件,并且每次都会在该文件中创建一个检查点。
注意:save方法中的路径并不能自动创建,所以在保存之前一定需要先建立好相应的文件夹。
相关参考:
https://blog.csdn.net/u011311291/article/details/81393933
https://blog.csdn.net/zhaotun123/article/details/99680151
https://blog.csdn.net/qq_37099552/article/details/105023680
https://stackoverflow.com/questions/60323366/valueerror-numpy-ufunc-size-changed-may-indicate-binary-incompatibility-expec
https://blog.csdn.net/winycg/article/details/78572438
https://blog.csdn.net/hl1hl/article/details/85638276