NLLLoss与CE
Adam优化算法
原址(https://www.cnblogs.com/yifdu25/p/8183587.html)
是一阶优化算法,全称适应性矩估计(adaptive moment estimation)。在非凸优化问题中有如下优势:
基本机制:
Adam通过计算梯度的一阶矩估计①和二阶矩估计②而为不同参数设计独立的自适应学习率。算法计算了梯度的指数移动均值。
算法流程:
初始化参数向量、一阶矩向量、二阶矩向量和时间步。当参数没有收敛的时候,迭代更新各个部分:时间步长、参数的梯度、更新偏差的一阶矩估计和二阶矩估计,偏差修正的一阶矩估计和二阶矩估计
①、②:矩估计就是通过样本矩来估计总体中相应的参数(比如期望和方差)。对于随机变量,矩是其最广泛、最常用的数字特征。由辛钦大数定律、样本矩依概率收敛到总体矩。故而样本矩可以估计总体矩。 一阶矩是数学期望 二阶中心矩是方差
-
计算高效
-
内存需要的少
-
梯度对角缩放不变
-
适用于大规模数据优化目标
-
适用于非稳态目标
-
解决高噪声稀疏梯度问题
基于Gram矩阵的损失函数
gram矩阵计算的是两两特征之间的相关性。比如哪两个特征是同时出现的,哪两个特征是此消彼长的等等。同时gram矩阵的对角线元素还体现出每个特征在图像中出现的量。总之,Gram有助于把握整个图像的大体风格。有了表示风格的Gram Matrix,要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。
首先给出gram矩阵的公式:
假设该层通道数为c,每个通道有k*t个像素,也就是有k个l维的特征
即有k个特征,则m,n<k
也就是在计算两个特征通道(也就是两个特征图)之间的关系。这两个特征图究竟是此消彼长还是共存亡?
最终得到的是一个c * c的gram矩阵
矩阵的每个元素是就是两张特征图对应位置的累加和
累加和越大,说明两张特征图差异越明显。(这里是假设了每层的特征图都有归一化操作,例如sigmoid\ batchnorm),这是因为,当两数相加为定值时,平方和最小。于是,gram矩阵的元素反映了不同特征图的差异度。
现在摆脱公式的限制。我们可以考虑将特征图降维,一个特征图就是一个特征,那么这一层的输出有c个特征,gram矩阵表示了两两特征间的关系。这对于描述风格很重要。例如,梵高的画里蓝色总是天空,天空总是有星星。这样,gram矩阵拥有了风格描述的特性。
损失函数
损失函数公式如下:
l是层数。实践证明,gram损失函数不比交叉熵等函数,只放在最后一层就有很好的的效果。放在中间各层会有更好的表现。这因为神经网络浅层学颜色,深层学空间关系,逻辑结构。gram控制每一层的话,会将所有的风格特质都学到。
也就是在计算训练得到的结果和目标结果的距离。尽可能缩小gram矩阵距离。
tensorflow代码实现
gram矩阵代码:
noise_layer_fea = tf.reshape(noise_layer_fea, [-1, c]) noise_fea = tf.matmul(noise_layer_fea, noise_layer_fea, transpose_a = True) #noise_layer_fea是每层得到的输出
损失函数:
loss_list = tf.square(noise_fea - source_fea) loss = tf.reduce_sum(loss_list) /tf.cast((4.0*h*h*w*w), tf.float32)