现在一直在用TensorFlow训练CNN和LSTM神经网络,但是训练期间遇到了好多坑,现就遇到的各种坑做一下总结

1.问题一;训练CNN的时候出现nan

CNN是我最开始接触的网络,我的研究课题就是利用CNN,LSTM等网络对人体动作做识别。动作数据来源于手机的加速度计,做动作的人在固定位置携带手机并做特定动作,实验人员接收手机的加速度计数值并打上特定的动作标签。

在训练CNN网络时一共遇到两处坑,一是遇到在训练期间遇到nan错误,这个错误很常见。nan的错误多源于你的学习率设置的太大或者batchsize设置的太大,可以10倍10倍的减小学习率直到nan错误不出现。其实要弄明白nan错误怎么出现的才能真正的解决这个错误。

这个错误是因为logits输出太大变成INF,对这个取log就会在求梯度就会变成nan,nan是not a number 的缩写,表示不是一个有理数。所以除了调小学习率这个解决方案,另一个解决方案还可以给loss加正则化项。

2.问题二;在训练CNN的时候loss一直降不下去

我用普通的卷积核对数据做卷积,准确率保持在0.4左右不动了,loss也是到后面基本不降,各种调网络结构终于找到一种深度可分离卷积结构可以使准确率达到0.9左右。深度卷积与我们了解的普通卷积网络的不同点就是它只做单通道卷积,也就是一次卷积后各个通道的卷积结果不相加,各自独立做为一个featuremap。但是这种网络结构的神经元个数增长很快,所以它的训练会比普通卷积慢很多,对于通道数过多的数据并不是很适合,但是这种网络的鲁棒性很好。

其实我这里出现loss不降的原因我后来找到了,是因为我的数据里有错误,数据本身就含有了nan的数据,错误的数据导致网络无法收敛

3.问题三;训练LSTM网络循环出现nan的错误,一到特定的batch就出现nan

一出现这个问题我就意识到肯定是数据出了问题,后来把数据中的nan替换掉就正常了。因为我的数据加载完后是numpy格式的,替换只需要加一句train= np.nan_to_num(train)就可以了

对数据做一个这样的简单处理,普通卷积网也正常了,真是豁然开朗啊,不用深度卷积,只用普通卷积就可以达到0.96的准确率。

4.我后来把CNN和LSTM联合起来对动作识别,发现不对数据处理nan错误,网络仍然可以正常运行并达到0.97的准确率。证明我自己搭的这个网络结构有很好的鲁棒性。

总结:

通过以上遇到问题可以总结出导致nan问题的原因有如下三个:

1.梯度爆炸:观察log,注意每一轮迭代后的loss。loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。

2.不当的损失函数:有时候损失层中loss的计算可能导致NaN的出现。比如,给InfogainLoss层(信息熵损失)输入没有归一化的值,使用带有bug的自定义损失层等等。观测训练产生的log时一开始并不能看到异常,loss也在逐步的降低,但突然之间NaN就出现了

3.错误的输入:输入中就含有NaN,每当学习的过程中碰到这个错误的输入,就会变成NaN。观察log的时候也许不能察觉任何异常,loss逐步的降低,但突然间就变成NaN了。

												

神经网络训练时出现nan错误的更多相关文章

  1. caffe 训练时,出现错误:Check failed: error == cudaSuccess (4 vs. 0) unspecified launch failure

    I0415 15:03:37.603461 27311 solver.cpp:42] Solver scaffolding done.I0415 15:03:37.603549 27311 solve ...

  2. Keras 训练时出现 CUDA_ERROR_OUT_OF_MEMORY 错误

    不用惊慌,再试一次.估计当时GPU内存可分配不足,可手动结束所有python程序后释放相关GPU内存,或者重新运行一次终端

  3. 一文读懂神经网络训练中的Batch Size,Epoch,Iteration

    一文读懂神经网络训练中的Batch Size,Epoch,Iteration 作为在各种神经网络训练时都无法避免的几个名词,本文将全面解析他们的含义和关系. 1. Batch Size 释义:批大小, ...

  4. caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization

    一.深度学习中常用的调节参数 本节为笔者上课笔记(CDA深度学习实战课程第一期) 1.学习率 步长的选择:你走的距离长短,越短当然不会错过,但是耗时间.步长的选择比较麻烦.步长越小,越容易得到局部最优 ...

  5. 深度学习与CV教程(6) | 神经网络训练技巧 (上)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  6. 神经网络训练中的Tricks之高效BP(反向传播算法)

    神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...

  7. tesorflow - create neural network+结果可视化+加速神经网络训练+Optimizer+TensorFlow

    以下仅为了自己方便查看,绝大部分参考来源:莫烦Python,建议去看原博客 一.添加层 def add_layer() 定义 add_layer()函数 在 Tensorflow 里定义一个添加层的函 ...

  8. tensorflow-gpu版本安装及深度神经网络训练与cpu版本对比

    tensorflow1.0和tensorflow2.0的区别主要是1.0用的静态图 一般情况1.0已经足够,但是如果要进行深度神经网络的训练,当然还是tensorflow2.*-gpu比较快啦. 其中 ...

  9. Cs231n课堂内容记录-Lecture 7 神经网络训练2

    Lecture 7  Training Neural Networks 2 课堂笔记参见:https://zhuanlan.zhihu.com/p/21560667?refer=intelligent ...

随机推荐

  1. mysql以下c连接mysql数据库

    1.安装sudo yum install mysql-devel  安装组件和库 2. #include <stdio.h> #include <stdlib.h> #incl ...

  2. 3个Activity间的切换

    package com.yarin.android.Examples_03_01; import android.app.Activity; import android.content.Intent ...

  3. mui请求数据

    var rh = new Object(); rh.ReqId = "ls123"; rh.Salt = "sssseee"; var rb = new Obj ...

  4. ThreadLocal 示例

    ThreadLocal, 从字面意思上看是本地线程. 但实际上它是一个线程本地变量.它的功能就是为每一个使用该变量的线程都提供一个变量值的副本, 从而使得不会与其他线程的副本冲突. 与使用synchr ...

  5. SVM学习笔记(二)----手写数字识别

    引言 上一篇博客整理了一下SVM分类算法的基本理论问题,它分类的基本思想是利用最大间隔进行分类,处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的.考 ...

  6. laravel相关插件

    1. Laravel-4-Generators Rapidly speed up your Laravel workflow with generators  https://packagist.or ...

  7. Python(迭代、三元表达式、列表生成、生成器、迭代器)

    迭代 什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). ...

  8. xpath(待补充)

    from lxml import etree html=""" <div> <ul> <li>1</li> <li ...

  9. Java基础知识陷阱(一)

    本文发表于本人博客. 事隔好多年了,重新拿起来Java这门语言,看似熟悉其实还很陌生,想想应该梳理下顺便提高下自己.这次先来看看Java里面的String这个对象. 经典的先看下面一段代码,请问最终创 ...

  10. oracle procedure简单的将临时表的数据插入或更新到目标表

    CREATE OR REPLACE PROCEDURE DEAL_SYNC_SCH_CUSTPHONE_NEW AS CURSOR C_CURU IS SELECT * FROM CBS_COS.SC ...