Python|深度学习其实并不难:卷积神经网络的简单介绍( 三 )
文章插图
目前看起来不错 。
注意:在Conv3x3实现中 , 为了简单起见 , 我们假设输入是一个2d numpy数组 , 因为MNIST图像就是这样存储的 。 这对我们有用 , 因为我们使用它作为我们网络的第一层 , 但大多数cnn有更多的Conv层 。 如果我们要构建一个更大的网络 , 需要多次使用Conv3x3 , 那么我们必须将输入设置为3d numpy数组 。
4. 池化图像中的相邻像素往往具有相似的值 , 因此conv层通常也会为输出中的相邻像素生成相似的值 。 因此 , conv层输出中包含的大部分信息都是多余的 。 例如 , 如果我们使用边缘检测过滤器 , 并在某个位置找到一个强边缘 , 那么我们很可能也会在距离原始位置1像素的位置找到一个相对较强的边缘 。 然而 , 这些都是相同的边缘!我们没有发现任何新东西 。
池化层解决了这个问题 。 他们所做的就是减少(通过猜测)在输入中汇总值的输入大小 。 池化层通常由一个简单的操作完成 , 比如max、min或average 。 下面是一个最大池层的例子 , 池的大小为2:
文章插图
为了执行最大池化 , 我们在2x2块中输入了图像(因为池的大小= 2) , 并将最大值放入对应像素处的输出图像中 。 就是这样!
它将输入的宽度和高度除以它的大小 。 对于MNIST CNN , 我们将在初始conv层之后放置一个池大小为2的最大池化层 。 池化层将26x26x8输入转换为13x13x8输出:
文章插图
4.1 Implementing Pooling(实施池)
我们将实现一个MaxPool2类与我们的conv类相同的方法从上一节:
文章插图
这个类的工作原理类似于我们之前实现的Conv3x3类 。 关键行再次突出显示:要从给定的图像区域找到最大值 , 我们使用np.amax() ,numpy的array max方法 。 我们设置axis=(0,1) , 因为我们只想最大化前两个维度(高度和宽度) , 而不是第三个维度(num_filters) 。
我们来试试吧!
文章插图
我们的MNIST CNN开始走到一起了!
5. Softmax为了完成我们的CNN , 我们需要赋予它实际预测的能力 。 我们将通过使用一个多类分类问题的标准最终层来实现这一点:Softmax层 , 这是一个使用Softmax激活函数的标准全连接(密集)层 。
提醒:全连接层的每个节点都连接到上一层的每个输出 。 如果你需要复习的话 , 我们在介绍神经网络时使用了全连接层图层 。
Softmax将任意实值转换为概率 。 它背后的数学原理很简单:给定一些数字 ,
- 取e(数学常数)的每一次方 。
- 把所有的指数(eee的幂)加起来 。 这个结果是分母 。
- 用每个数的指数作为它的分子 。
- 概率= Numerator/Denominator
文章插图
Softmax变换的输出总是在[0,1][0,1][0,1][0,1]范围内 , 并且加起来等于1 , 由此转换成概率 。
下面是一个使用数字-1、0、3和5的简单例子:
文章插图
文章插图
5.1使用方法
我们将使用一个包含10个节点的softmax层 , 每个节点代表一个数字 , 作为CNN的最后一层 。 层中的每个节点都将连接到每个输入层 。 应用softmax变换后 , 以概率最高的节点表示的数字为CNN的输出!
文章插图
5.2交叉熵损失函数
你可能会想 , 为什么要把输出转化为概率呢?最高的产值不总是有最高的概率吗?如果你这么做了 , 你绝对是对的 。 我们实际上不需要使用softmax来预测一个数字 , 而我们只需要从网络中选择输出最高的数字即可!
softmax真正做的是帮助我们量化我们对预测的确定程度 , 这在训练和评估CNN时非常有用 。 更具体地说 , 使用softmax允许我们使用交叉熵损失函数 , 它考虑到我们对每个预测的确定程度 。 下面是我们计算交叉熵损失函数的方法:
- 深度|iPhone12到底值得买吗 深度体验一周我发现了这些
- 采用|iPhone12mini和iPhone7深度对比:值得升级吗
- 设计|未来创意拒绝被垄断:欧拉共创成果深度解读!
- X50|vivo X50 Pro+深度测评:全能影像机皇登场
- 广度|华住创始人季琦:深度重要于广度
- 用于|用于半监督学习的图随机神经网络
- NeurIPS 2020论文分享第一期|深度图高斯过程 | 深度图
- iPhone12 mini|从华为P30换成iPhone12mini,深度体验一周,优缺点很明显
- 华为|华为Hicar一个月深度使用体验(途虎定制)
- 今日|“舜网”学习强国号今日上线 济南报业全媒体矩阵再添新成员