深度学习关键问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang15061955806/article/details/81222144

一、深度学习开发为啥需要pythonn语言和C++

    模型训练python➕gpu就够了,真正需要C++的地方是部署,直接用gpu服务器部署实在太昂贵,而CPU服务器则廉价的多
很多深度学习模型都很重,计算量非常大,python实在太慢,C++则必不可少。C++ OpenMP MKL MPI了解一下?现在的算力还是非常不足, 我们的深度学习的语言模型效果已经比N-gram的好了非常多, 但部署不了 ,就是速度还是不行。

二、调参方案

参考:https://blog.csdn.net/xiaogao556/article/details/79349412,主要对于FCN的调参

1、参数范数惩罚,即L1、L2正则化 (L2比L1好,更容易求解)

2、数据增强,即将原数据给裁剪,或加入噪声,或翻转图像,使用更多的数据来训练网络

3、提前终止,可以有效的减缓过拟合现象

4、RNN中用到的参数共享,在其整条时间链上可以进行参数的共享,这样才使得其能够被训练.

5、bagging 和其他集成方法  
         其实bagging的方法是可以起到正则化的作用,因为正则化就是要减少泛化误差,而bagging的方法可以组合多个模型起到减      少泛化误差的作用. 
    在深度学习中同样可以使用此方法,但是其会增加计算和存储的成本

 6、dropout
 7、辅助分类节点  
        Google Inception V1中,采用了辅助分类节点的策略,即将中间某一层的输出用作分类,并按一个较小的权重加到最终的分      类结果中,这样相当于做了模型的融合,同时给网络增加了反向传播的梯度信号,提供了额外的正则化的思想.

8. Batch Normalization
       在Google Inception V2中所采用,是一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同时收敛后分      类的准确率也可以大幅度的提高. 
    BN在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正太分布,减少了                 Internal convariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍。

9、可变的学习率

    import tensorflow as tf

    global_step = tf.Variable(0, trainable=False)

    initial_learning_rate = 0.1   #初始学习率
    learning_rate = tf.train.exponential_decay(initial_learning_rate,
                                           global_step=global_step,
                                           decay_steps=10,decay_rate=0.9)

10、初始化反卷积层的参数W时用双线性插值

11、U-Net

12、RefineNet   编码用的ResNet,主要在于解码部分RefineNet。

13、DeconvNet/SegNet  卷积部分与FCN一致,主要针对上采样部分进行改进。DeconvNet/SegNet这两个网络区别不          大,细节上的改动。

14、使用momentum优化函数

当然,这些方法不一定都有用,我也只是暂时搜集了这么多,只能慢慢的来花时间来验证到底有没有用。后面的那几个网络我也只是想参考一下结构,看能不能借鉴到FCN里。

   谈到BN:由于网络结构越深,则后面网络层的输入发生的偏移越大,则对于网络的收敛越不利,所以BN 的思想就是对网络中的每一层都做规范化,也就是均值为0方差为1的标准正态分布,这样可以使得输入值可以落在非线性函数对于输入比较敏感的地方,也就是说让梯度变大,避免梯度消失的问题。

猜你喜欢

转载自blog.csdn.net/wang15061955806/article/details/81222144