Python|深度学习其实并不难:卷积神经网络的简单介绍( 三 )

  • 我们将结果分配给输出[i , j] , 其中包含输出中像素(i , j)的卷积结果 。
  • 对输出中的每个像素执行上面的序列 , 直到得到最终的输出卷为止!让我们测试一下我们的代码:
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    目前看起来不错 。
    注意:在Conv3x3实现中 , 为了简单起见 , 我们假设输入是一个2d numpy数组 , 因为MNIST图像就是这样存储的 。 这对我们有用 , 因为我们使用它作为我们网络的第一层 , 但大多数cnn有更多的Conv层 。 如果我们要构建一个更大的网络 , 需要多次使用Conv3x3 , 那么我们必须将输入设置为3d numpy数组 。
    4. 池化图像中的相邻像素往往具有相似的值 , 因此conv层通常也会为输出中的相邻像素生成相似的值 。 因此 , conv层输出中包含的大部分信息都是多余的 。 例如 , 如果我们使用边缘检测过滤器 , 并在某个位置找到一个强边缘 , 那么我们很可能也会在距离原始位置1像素的位置找到一个相对较强的边缘 。 然而 , 这些都是相同的边缘!我们没有发现任何新东西 。
    池化层解决了这个问题 。 他们所做的就是减少(通过猜测)在输入中汇总值的输入大小 。 池化层通常由一个简单的操作完成 , 比如max、min或average 。 下面是一个最大池层的例子 , 池的大小为2:
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    为了执行最大池化 , 我们在2x2块中输入了图像(因为池的大小= 2) , 并将最大值放入对应像素处的输出图像中 。 就是这样!
    它将输入的宽度和高度除以它的大小 。 对于MNIST CNN , 我们将在初始conv层之后放置一个池大小为2的最大池化层 。 池化层将26x26x8输入转换为13x13x8输出:
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    4.1 Implementing Pooling(实施池)
    我们将实现一个MaxPool2类与我们的conv类相同的方法从上一节:
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    这个类的工作原理类似于我们之前实现的Conv3x3类 。 关键行再次突出显示:要从给定的图像区域找到最大值 , 我们使用np.amax() ,numpy的array max方法 。 我们设置axis=(0,1) , 因为我们只想最大化前两个维度(高度和宽度) , 而不是第三个维度(num_filters) 。
    我们来试试吧!
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    我们的MNIST CNN开始走到一起了!
    5. Softmax为了完成我们的CNN , 我们需要赋予它实际预测的能力 。 我们将通过使用一个多类分类问题的标准最终层来实现这一点:Softmax层 , 这是一个使用Softmax激活函数的标准全连接(密集)层 。
    提醒:全连接层的每个节点都连接到上一层的每个输出 。 如果你需要复习的话 , 我们在介绍神经网络时使用了全连接层图层 。
    Softmax将任意实值转换为概率 。 它背后的数学原理很简单:给定一些数字 ,
    1. 取e(数学常数)的每一次方 。
    2. 把所有的指数(eee的幂)加起来 。 这个结果是分母 。
    3. 用每个数的指数作为它的分子 。
    4. 概率= Numerator/Denominator
    写得更妙的是 , Softmax对nnn数字执行以下转换X1...Xn:
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    Softmax变换的输出总是在[0,1][0,1][0,1][0,1]范围内 , 并且加起来等于1 , 由此转换成概率 。
    下面是一个使用数字-1、0、3和5的简单例子:
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    5.1使用方法
    我们将使用一个包含10个节点的softmax层 , 每个节点代表一个数字 , 作为CNN的最后一层 。 层中的每个节点都将连接到每个输入层 。 应用softmax变换后 , 以概率最高的节点表示的数字为CNN的输出!
    Python|深度学习其实并不难:卷积神经网络的简单介绍文章插图
    5.2交叉熵损失函数
    你可能会想 , 为什么要把输出转化为概率呢?最高的产值不总是有最高的概率吗?如果你这么做了 , 你绝对是对的 。 我们实际上不需要使用softmax来预测一个数字 , 而我们只需要从网络中选择输出最高的数字即可!
    softmax真正做的是帮助我们量化我们对预测的确定程度 , 这在训练和评估CNN时非常有用 。 更具体地说 , 使用softmax允许我们使用交叉熵损失函数 , 它考虑到我们对每个预测的确定程度 。 下面是我们计算交叉熵损失函数的方法: