了解数据科学-建立图像分类器

嗨! 我的名字叫Gabi,我正在学习数据科学。 我计划写一些我正在学习的内容,以帮助我整理思想,并跟踪所涵盖的内容。

面临的挑战:建立图像分类器,可以正确识别图像中是否存在入侵植物(并将结果提交给Kaggle以查看与其他植物的比较)。 我有2295张排序后的图像来训练我的模型,然后将其用于分类1531张图像。

设定:

我将使用Python进行编程,并使用Keras(带有Theano后端)运行模型。 Theano是一个Python库,可让我“有效地定义,优化和评估涉及多维数组的数学表达式”。 鉴于神经网络由许多数组乘法组成,这是构建一个数组的第一步。 然后Keras利用Theano的表达式来构建深度学习库。

我将使用Jupyter Notebook进行编程。 让我们开始吧:

创建模型:

由于数据集非常小,因此我将使用预先训练的模型。 实际上,这在图像分类问题中相当普遍,因为已经存在可以在数百万个图像上训练的良好模型。 如果没有资源去做同样的事情,使用预先训练的模型并根据我的需要对其进行调整很方便。 具体来说,我将使用VGG模型,该模型在ImageNet 2014挑战赛中获胜,该挑战赛训练了150万张图像。

VGG网络是卷积神经网络。

为了了解它与“传统”神经网络有何不同,我将首先考虑如何使用神经网络进行图像识别:我将为每个像素分配一个节点,并在该节点上进行一些数学运算。 然后,这些节点将通过某种加权组合连接到其他节点,最终产生输出。 这称为完全连接的网络。 由此产生的一个重要问题是它缺乏翻译不变性。 如果我训练我的网络来识别图像右下角的花朵,那么它将无法识别新图像左上角的花朵(因为每个像素都是单独考虑的)。

卷积神经网络占据一个区域的一部分图像,并对该区域中的每个像素进行加权。 然后,它将在图像上滑动“考虑区域”,并考虑具有相同权重的新像素。 这意味着网络将善于识别特征(例如花朵的花瓣),然后可以在图像中的任何地方查找它们。

在图像上传递“过滤器”; 然后,滤波器中的像素将用作卷积神经网络的输入。 完全连接的层等效于过滤器,即图像的完整大小。

VGG模型由卷积层和完全连接的层组成,其中空间池由最大池层进行。 这些池化层组合了多个神经元的输出。 由于这些层都有相似的配置,因此我可以定义一些方法来帮助我建立模型:

上面写的最后一个方法是均值中心方法,它使我可以在模型中添加一层自动对图像应用均值中心的方法,这是需要执行的重要预处理步骤。 我使用Lambda层添加该层,该层将表达式(在本例中为均值中心方法)包装为模型层。 该方法由VGG研究人员提供,因此我对图像进行的预处理与VGG模型所训练的内容一致。

然后,我可以使用编写的方法来构建模型:

注意:权重有多种来源。 我正在从fast.ai课程中学习,它们的权重占预处理层的比重。 这就是为什么我使用fast.ai权重。

作为设置的一部分,最后一点要注意:Keras要求每个类别都在其自己的文件夹中。 我还将来自Kaggle的训练数据分为一个训练集(2095张图像)和一个验证集(200张图像,每个班级100张),这些数据将用于测试模型的成功性。