【tensorflow】mnists训练不收敛,并在迭代训练后,提示内存申请错误

学习tensorflow,自然是会想要先从mnist开始,简单看了官方教程之后,我选择了这篇博客文章follow一下:
https://my.oschina.net/u/876354/blog/1926060

训练不收敛问题

而在follow这篇文章代码的时候,遇到了训练不收敛的情况,并且在训练迭代的最后,会提示内存不够用了,大部分报错附在文末。网上很多提到内存申请错误的帖子,都说是batch设置太大了,不过这个明显不是这个问题,因为是在最后内存不够了,而且之前迭代过程中的training accuracy 明显没有向1收敛,很明显是死循环了(当然,期间排错的时候,我也尝试了,把batch size设置成更小,也不行的;而且迭代次数只设置到100次,还是会报相同的错误)。

所以,对于不收敛的问题,应该还是在于前面模型网络的定义里面。

最后,经过细心的review,我发现,问题出在熵函数定义里面,函数前面的负号被漏掉了(这意味着,如果你最小化这个错误的函数,本来就是在朝着training accuracy变小的方向走)。虽然是自己敲代码留的坑,但是这个排错过程中的痛苦,还是磨砺了我的耐心。

# define cross entropy function
# y_ is true label
cross_entropy = tf.reduce_mean(tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))

修改为如下,training accuracy就可以正常收敛了:

cross_entropy = -tf.reduce_mean(tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))

另外的问题和另外的尝试:

在可以收敛以后,问题并没有完全解决,在迭代的最后,内存问题仍然出现。

step 9300, training accuracy 0.96
step 9400, training accuracy 0.94
step 9500, training accuracy 1
step 9600, training accuracy 0.98
step 9700, training accuracy 0.94
step 9800, training accuracy 0.92
step 9900, training accuracy 0.94
Optimization Finished!
2020-07-05 20:48:15.217061: W tensorflow/core/common_runtime/bfc_allocator.cc:273] Allocator (GPU_0_bfc) ran out of memory trying to allocate 957.03MiB. Current allocation summary follows.
2020-07-05 20:48:15.217103: I tensorflow/core/common_runtime/bfc_allocator.cc:643] Bin (256): Total Chunks: 0, Chunks in use: 0 0B allocated for chunks. 0B client-requested for chunks. 0B in use in bin. 0B client-requested in use in bin.

另外,我使用官方教程follow使用intersession方式的代码出来,可以很快收敛,但是也会在迭代的最后,报出内存的问题(不太一样的是,calle

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用TensorFlow进行训练时,内存的持续增加并占满可能有以下几个原因: 1. 数据量过大:如果训练时使用了大量的数据,例如大型图像数据集或大型文本数据集,那么TensorFlow会将这些数据加载到内存中进行处理。如果数据量过大,内存的需求也会相应增加。 2. 模型复杂度过高:如果使用了复杂的神经网络模型,例如深度卷积神经网络(CNN)或长短期记忆网络(LSTM),那么模型中的参数数量会非常庞大。在每次训练代过程中,这些参数需要在内存中保存和更新,导致内存的占用增加。 3. 批量大小设置过大:批量大小是指在每次训练代中同时处理的样本数量。如果将批量大小设置得过大,那么在每次代过程中,需要同时存储和计算大量的样本数据。这也会导致内存的占用增加。 4. 内存泄漏:如果在代码中存在内存泄漏的问题,即申请内存没有正确释放,在长时间的训练过程中会导致内存占用逐渐增加,最终可能占满内存。 针对这些问题,可以采取以下措施来尽量减少内存的占用: 1. 减少数据量:如果可能的话,可以考虑缩小训练数据集的规模,或者使用数据集的子集进行训练,以减少内存的需求。 2. 简化模型:如果模型过于复杂,可以尝试使用更简单的模型结构,以减少参数数量和内存占用。 3. 调整批量大小:通过逐渐增大批量大小,找到一个合适的值,既能保证训练效果,又能降低内存占用。 4. 检查内存泄漏:仔细检查代码中是否有内存泄漏的问题,确保申请内存都得到了正确地释放。 5. 使用分布式训练:如果单个设备的内存无法满足需求,可以考虑使用分布式训练,将计算和存储任务分配到多个设备上,从而减少单个设备的内存压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值