1. 各种交叉熵损失函数的比较:
sparse_softmax_cross_entropy_with_logits(logits=net, labels=y):labels可以是直接的数字标签,会将其做one-hot操作
softmax_cross_entropy_with_logits中 labels接受one-hot标签 。相当于sparse_softmax_cross_entropy_with_logits 对标签多做一个one-hot动作
softmax 和log_softmax:
log_softmax 是在softmax的基础上再做log,目的是为了增加负采样
nn.CrossEntropyLoss() 与 NLLLoss():NLLLoss()接受做了log_softmax的数据和目标标签。nn.CrossEntropyLoss()会做softmax。若是数据需要负采样可以采用NLLLoss()
tf.nn.sigmoid_cross_entropy_with_logits(logits=net, labels=y):net和y需要具有相同的type(float)和shape(tensor),适用于 类别互不排斥的情况,比如一个样本[0,1,1,0],该样本可能属于两个类别,但这两类别互不排斥
tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None) 计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits(),
如:其实是直接正例样本的权重系数:targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))
2.各种激活函数比较:使用激活函数的作用:通过非线性函数的叠加,使神经网络有足够的能力来抓取复杂的特征,若是不使用激活函数,神经网络输出都是输入的线性函数,多层神经网络也相当于一层。
Sigmoid函数:0-1 区间
优点:1.便于求导的平滑函数。2.压缩数据,保证数据幅度不会特别大。3.适用于前向传播
缺点:1.容易梯度消失,激活函数接近饱和区时,导数为0,根据链式求导法则,后向传播时,需要之前各层导数的乘积,导数结果接近0,导致梯度消失,无法完成深程度训练。
2.sigmod的输出不是0均值的,会对梯度产生影响。比如 sigmod(wx+b) 对w求导,总是正数和负数,导致在反向传播时,要么往正方向跟新,要么往负方向跟新,导致捆绑效果,收敛缓慢。
3.幂运算缓慢
tanh函数:-1 - 1 区间 : 解决了sigmod非0均值的问题,但也存在梯度消失和幂运算缓慢问题
relu函数:max(0,x),斜的直线,大于0
优点:1.SGD算法的收敛速度比sigmod和tanh快,不会有梯度消失问题
2.计算复杂度低,不涉及指数运算。
3.适合用于后向传播。
缺点:1.输出不是0均值的。2.不会对数据幅度做压缩,因此数据维度会随着模型层数的增加不断扩张。
3.神经元坏死现象:某些神经元不会被激活(在负数部分,梯度为0)。产生原因:1.参数初始化问题(解决:每一层输出的方差应该尽量相等)。2.学习率调节太高,导致参数变化太大(解决:动态调节学习率)
3.过拟合和欠拟合
欠拟合:训练集和测试集效果均不好,模型过于简单,增加模型复杂度,调整模型参数等。<