神经网络实验经验

1. 权重以及偏置的初始化影响很大。不能随便用标准正态分布直接初始化。

数据量小的时候,用

weights=tf.Variable(tf.random_normal([input_size,out_size]))*np.sqrt(1/float(input_size))

bias=tf.Variable(tf.random_normal([1,out_size]))*np.sqrt(1/float(input_size))

2. 小数据集, 优化函数的选取影响不大,直接使用GD即可。
一般来说,Adam的效果最好。
3. 数据量较小的时候,考虑k折交叉验证,重复多次计算。
4. 损失函数的选取:均方误差(多用于回归,分类也可以使用):loss=tf.reduce_mean(tf.square(youtput-output))
交叉熵(用于分类):
5. 如何 停止学习
①固定epochs
②当训练集的损失下降到一定范围的时候停止训练
6. 正则化项:加入到损失函数里,解决过拟合问题。
L2用的较多。

7. 训练的过程中,随着训练步数的增加,loss出现Nan情况。

原因:① 学习率太大,试着调小。

下面为知乎王赟的回答:

最常见的原因是学习率太高。对于分类问题,学习率太高会导致模型「顽固」地认为某些数据属于错误的类,而正确的类的概率为 0(实际是浮点数下溢),这样用交叉熵就会算出无穷大的损失函数。一旦出现这种情况,无穷大对参数求导就会变成 NaN,之后整个网络的参数就都变成 NaN 了。

解决方法是调小学习率,甚至把学习率调成 0,看看问题是否仍然存在。若问题消失,那说明确实是学习率的问题。若问题仍存在,那说明刚刚初始化的网络就已经挂掉了,很可能是实现有错误。


作者:王赟 Maigo
链接:https://www.zhihu.com/question/62441748/answer/232522878
来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

② 其他情况:(引用知乎回答)

loss函数用的什么函数?对于分类问题,用categorical cross entropy;对于回归问题,可能出现了除0 的计算,加一个很小的余项可能可以解决;数据本身,是否存在Nan,可以用numpy.any(numpy.isnan(x))检查一下input和target;target本身应该是能够被loss函数计算的,比如sigmoid激活函数的target应该大于0,同样的需要检查数据集


作者:猪了个去
链接:https://www.zhihu.com/question/62441748/answer/232520044
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

7.(随时补充中。。。

猜你喜欢

转载自blog.csdn.net/qq_31761357/article/details/79551349