下一步是使用从sklearn包导入的函数train_test_split拆分数据集。具有后缀RI、RL的集合是rawImages和标签对的拆分结果,另一个是特征和标签对的拆分结果。我们使用数据集的85%作为训练集,15%作为测试集。 最后,我们运用KNN、SVM和BP神经网络函数来评估数据。对于KNN,我们使用KNeighborsClassifier;对于SVM,我们使用SVC;对于BP神经网络,我们使用MLPClassifier。 第二种方法: 使用TensorFlow构建CNN。TensorFlow的目的是让你构建一个计算图(使用任何类似Python的语言),然后用C ++来执行图形操作,这比直接用Python来执行相同的计算要高效得多。 TensorFlow还可以自动计算优化图形变量所需的梯度,以便使模型更好地运行。这是因为图形是简单数学表达式的组合,因此可以使用导数的链式规则来计算整个图形的梯度。 TensorFlow图由以下部分组成: 用于将数据输入图表的占位符变量。 要进行优化的变量,以便使卷积网络更好地得以运行。 卷积网络的数学公式。 可用于指导变量优化的成本衡量标准。 一种更新变量的优化方法。 CNN架构由不同层的堆叠形成,其通过可微函数将输入量转换成输出量(例如类别分数)。 所以在我们的实现操作中,第一层是保存图像,然后我们构建了3个具有2×2最大池和修正线性单元(ReLU)的卷积层。 输入是一个具有以下尺寸的四维张量: 图像编号。 每个图像的Y轴。 每个图像的X轴。 每个图像的通道。 输出是另一个四维张量,具有以下尺寸: 图像号,与输入相同。 每个图像的Y轴。如果使用的是2×2池,则输入图像的高度和宽度除以2。 每个图像的X轴。同上。 由卷积滤波器产生的通道。 然后我们在网络末端构建了2个完全连接的层。输入是形状为[num_images,num_inputs]的2维张量。输出是形状为[num_images,num_outputs]的2维张量。 然而,为了连接卷积层和完全连接层,我们需要一个平坦层,将4维张量减小到2维,从而可以用作完全连接层的输入。 CNN的最后端始终是一个softmax层,它将来自全连接层的输出归一化,使得每个元素被限制在0和1之间,而所有元素总和为1。 为了优化训练结果,我们需要一个成本衡量标准,并尽量减少每次迭代。我们在这里使用的成本函数是交叉熵(从tf.nn.oftmax_cross_entropy_with_logits()调用),并对所有图像分类采用交叉熵的平均值。优化方法是tf.train.AdamOptimizer(),它是Gradient Descent的高级形式。这是一个调整的参数学习率。 第三种方法: Retrain Inception V3物体识别模型有数百万个参数,可能需要几周才能完全训练。迁移学习是一种技术,可以通过为一组类别(如ImageNet)采用训练有素的模型来快速完成此项工作,并从新类别的现有权重中进行训练。虽然它不如全训练运行得那么好,但对于许多应用来说,这是非常有效的,并且可以在笔记本电脑上运行,只要运行三十分钟即可,无需GPU。对于这部分的实现,我们可以按照下边的说明进行操作: https://www.tensorflow.org/tutorials/image_retraining。 首先,我们需要获得预先训练的模型,删除旧的顶层,并在我们拥有的数据集上训练一个新的模型。在一个没有猫品种的原始ImageNet类中,要对完整的网络进行训练。迁移学习的神奇之处在于,经过训练以区分某些对象的较低层可以重用于许多识别任务,而无需任何更改。然后我们分析磁盘上的所有图像,并计算其中每个图像的瓶颈值(bottleneck values)。点击这里查看bottleneck的详细信息(https://www.tensorflow.org/tutorials/image_retraining)。每个图像在训练过程中被重复使用多次,所以计算每个瓶颈值都需要花费大量的时间,因此可以加快缓存这些瓶颈值,从而不必重复计算。 该脚本将运行4000个训练步骤。每个步骤从训练集中随机选择十个图像,从缓存中发现其瓶颈,并将它们馈送到最后一层以获得预测。然后将这些预测与实际标签进行比较,从而通过反向传播过程更新最终层的权重。 开始实验 数据集 牛津IIIT宠物数据集(~vgg/data/pets/) 有25个品种的狗和12个品种的猫。每个品种有200张图像。 我们在项目中只使用了10个猫品种。 (责任编辑:本港台直播) |