卷积神经网络之激活函数(一)

写在前面的话

本文为我在学习卷积神经网络的时候,对激活函数的一些理解。

总结起来,激活函数的作用就是:加入非线性因素,解决线性模型所不能解决的问题。

本文参考文章:神经网络激活函数的作用是什么?

欢迎扫码关注我的公众号,与我一同学习进步!主要致力于学习

  1. 使用深度学习解决计算机视觉相关问题
  2. Python为主的互联网应用服务
  3. 基于MIPS指令集的CPU微体系结构设计
    在这里插入图片描述

简单的二分类问题

现有问题为:对下图中的两类不同形状的图案进行分类;这实质上是一个线性不可分问题,即在该平面内很难找到一条直线将两类不同形状的图案区分开。

在这里插入图片描述

  1. 使用不带激活函数的单层感知机进行分类

    使用的单层感知机模型及对应的模型分类同如下图所示。
    在这里插入图片描述

    其中,W1、W2是模型的权重,b是偏置量。它的工作原理是:输入特征X1和X2,如果y大于0,就说明它是正类;如果y小于0,就说明它是负类。根据相应的网络模型,示例的分类线如右图所示。

  2. 使用不带激活函数的多层感知机进行分类

    使用的多层感知机分类模型及对应的函数如下图所示。

在这里插入图片描述

其中,不同的W参数表示感知机不同层的参数。与单层感知机类似,它也是一个线性分类模型,无法解决上述的分类问题。

对于该模型中的三个神经元,其本质上是三条直线的线性组合,使用三条直线对相关区域进行分类,模型的数学表示如下图所示。

在这里插入图片描述

问题:在该问题中,我们尝试了不同的分类方法,都无法解决该非线性二分类问题。同时,由于仅使用线性函数及其组合可解决的问题有限,必须采用相关方法进行改进,解决非线性问题。

复杂的线性组合与激活函数

那么,对于该问题,是否一定不能使用线性函数进行解决?答案显然是否定的。

如下图所示,图中的两条直线可以很好的区分出两类不同形状的图案。但问题是,对于机器来说,学得这样的两条直线是相当困难的。

在这里插入图片描述

为了方便机器的学习,我们引入激活函数,在模型中增加非线性因素,从而期望可以学到一个较好的结果,可用于该线性不可分的二分类问题。

为了尽可能的使模型简单,算法易于理解,这里仅引入激活函数Sigmoid。它的表达式如下图所示。

在这里插入图片描述

针对该表达式,做出它的图像如下图所示。

在这里插入图片描述

引入该激活函数之后,在多层感知机的每一层计算得到输出结果之后,再将输出结果传入到激活函数中进行计算。这一过程中,线性的输出结果转变为非线性。经过该过程,构建的模型如下图所示。

在这里插入图片描述

模型拟合表达出的直线就转变为曲线,如下图所示。

在这里插入图片描述

这与我们之前的使用自己所想的两条直线勾勒出的结果十分类似。只不过,该方法是计算机可以接受并且进行学习的。经过多轮的训练与迭代之后,计算机将可以学习到能够正确分类两类不同图案的曲线,如下图所示。

注:下图只是认为构想的一个例子,但实际上可能并不是该曲线,也可能为其他曲线。

在这里插入图片描述

激活函数的作用

经过以上简单的示例,我们了解到:激活函数的主要目的是在线性模型中引入非线性元素,从而使得机器学习(深度学习)相关模型可以处理线性不可分的问题,构建出良好的模型用于实际的应用中。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于卷积神经网络实现图像风格的迁移(含源码、数据集、说明文档)(深度学习实战).zip # 图像风格迁移 ## 简介 - 利用卷积神经网络实现图像风格的迁移。 ## 画风迁移 - 简单来说就是将另一张图像的绘画风格在不改变原图图像内容的情况下加入到原图像中,从而“创造”名家风格的绘画作品。 - 这其中牵扯到很多难题,但是很多问题已经被一一攻克,一般而言,这类问题将涉及到图像风格的捕捉、图像风格的迁移、图像风格的组合等主要流程。 - 整体看来,卷积核特征的捕捉及应用、图像相干性的优化、画风的组合将是难题。 ## 图像风格捕捉 - 原理 - 通过将格拉姆矩阵(gram matrix)应用于卷积神经网络各层能够捕获该层的样式,所以,如果从填充了随机噪声的图像开始,对其进行优化使得网络各层的格拉姆矩阵与目标图像的格拉姆矩阵相匹配,那么不难理解,生成的图像将会模仿目标图像的风格。 - 可以定义一个style损失函数,计算两组激活输出值各自减去格拉姆矩阵之后计算平方误差。在原始图像和目标图像(莫奈的《睡莲》)上进行训练,将两幅图片输入VGG16的卷积神经网络,对每个卷积层计算上述style损失并多层累加,对损失使用lbfgs进行优化(它需要梯度值和损失值进行优化)。 - 其实,很多观点认为,匹配图像风格的最好方式是直接匹配所有层的激活值,事实上,格拉姆矩阵效果会更好一些,这点并不容易理解。其背后的原理是,通过计算给定层的每个激活值与其他激活值的乘积,我们获得了神经元之间的相关性。这些相关性可以理解为图像风格的编码,因为他们衡量了激活值的分布情况,而不是激活值本身。 - 这也带来了几个问题。一个就是零值问题,在任一被乘数为零的情况下,一个向量和自己的转置的点积都会是零,模型无法在零值处识别相关性。由于零值频繁出现,可以在执行点积前为特征值添加一个小的差量delta,delta去-1即可。还有一个问题就是,我们计算了所有激活值的格拉姆矩阵,难道不是应该针对像素通道计算吗?事实上,我们为每个像素的通道都计算了格拉姆矩阵,然后观察它们在整个图像上的相关性,这样做提供了一个捷径:可以计算通道均值并将其用作格拉姆矩阵,这会帮助获得一幅平均风格的图像,更有普适性。 - 同时,添加了总变分损失(total variation loss),要求网络时刻检查相邻像素的差异,否则,图像会趋于像素化且更加不平缓。某种程度上,这种方法与用于持续检查层权重与层输出的正则化过程非常类似,整体效果相当于在输出像素上添加了一个略微模糊的滤镜。(本质上,这是一种模糊化的方法)该部分的结果是将最后一个组成成分添加到了损失函数中,使得图像整体更像内容图像而不是风格图像。这里所做的,就是有效优化生成图像,使得上层的激活值对应图像内容,下层的激活值对应图像风格,也就是网络底层对应图像风格,网络高层对应图像内容,通过这种方式实现图像风格转换。 - 代码 - ```python def gram_matrix(x): if K.image_data_format() != 'channels_first': x = K.permute_dimensions(x, (2, 0, 1)) features = K.batch_flatten(x) return K.dot(features - 1, K.transpose(features - 1)) - 1 def style_loss(layer_1, layer_2): gr1 = gram_matrix(layer_1) gr2 = gram_matrix(layer_2) return K.sum(K.square(gr1 - gr2)) / (np.prod(layer_2.shape).value ** 2) w, h = 740, 468 style_image = K.variable(preprocess_image(style1_image_path, target_size=(h, w))) result_image = K.placeholder(style_image.shape) input_tensor = K.concatenate([st

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值