当前位置: 首页 > 科技观察

使用TensorFlow训练图像分类模型的指南

时间:2023-03-15 19:55:30 科技观察

AGuidetoTrainingImageClassificationModelswithTensorFlow今天,随着机器学习和深度学习算法的不断迭代,计算机已经能够对捕获的图像进行大规模的高精度分类。目前,此类先进算法的应用场景包括:解读肺部扫描图像的健康状况、通过移动设备进行人脸识别、为零售商区分不同类型的消费对象。接下来,我将与大家讨论计算机视觉的一个应用——图像分类,并逐步展示如何使用TensorFlow在小型图像数据集上训练模型。1.数据集和目标在这个例子中,我们将使用MNIST数据集的数字图像从0到9。它的形状如下图所示:我们训练模型的目的是将图像分类到它们各自的标签中,即也就是在上图中对应的编号处。通常,深度神经网络架构提供一个输入、一个输出、两个隐藏层(HiddenLayers)和一个dropout层来训练模型。CNN或卷积神经网络(ConvolutionalNeuralNetwork)是识别较大图像的首选,它可以在减少输入量的同时捕获相关信息。2.准备工作首先,我们通过TensorFlow、to_categorical(用于将数值转换为其他类别)、Sequential、Flatten、Dense、Dropout导入所有相关代码库,构建神经网络架构。此处提到的一些代码库对您来说可能是新的。我将在下面详细解释它们。3.超参数我将通过以下几个方面来选择正确的超参数集:首先,让我们定义一些超参数作为起点。以后可以根据不同的需要进行调整。在这里,我选择128作为较小的批量大小。其实batchsize可以取任意值,但是size的2次方往往可以提高内存效率,所以应该是首选。值得注意的是,决定合适的批大小的主要理由是批大小太小会使收敛变得太麻烦,而太大的批大小可能不适合您的计算机内存。让我们将epoch数(训练集中的每个示例都参与一次训练)保持在50,以实现模型的快速训练。epoch值越低,越适合小而简单的数据集。接下来,您需要添加隐藏层。在这里,我为每个隐藏层保留了128个神经元。当然,你也可以用64个和32个神经元来测试。对于这个例子,像MINST这样的简单数据集,我不建议使用更高的值。您可以尝试不同的学习率,例如0.01、0.05和0.1。在这个例子中,我将它保持在0.01。对于其他超参数,我选择了衰减步长和衰减率分别为2000和0.9。随着训练的进行,它们可以用来降低学习率。在这里,我选择Adamax作为优化器。当然你也可以选择其他的优化器比如Adam、RMSProp、SGD等。importtensorflowastffromtensorflow.keras.utilsimportto_categoricalfromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportFlatten,Dense,Dropoutparams={'dropout':0.25,'batch-size':128,'epochs':,'layer-1-size':128,'layer-2-size':128,'initial-lr':0.01,'decay-steps':2000,'decay-rate':0.9,'optimizer':'adamax'}mnist=tf.keras.datasets.mnistnum_class=10#在训练集和测试集之间拆分(x_train,y_train),(x_test,y_test)=mnist.load_data()#重塑和归一化数据x_train=x_train.reshape(60000,784).astype("float32")/255x_test=x_test.reshape(10000,784).astype("float32")/255#将类向量转换为二元类矩阵sy_train=to_categorical(y_train,num_class)y_test=to_categorical(y_test,num_class)4.创建训练集和测试集由于TensorFlow库中也包含了MNIST数据集,可以通过在对象上调用datasets.mnist,然后调用load分别得到训练集(60000个样本)_data()方法和测试(10,000个样本)数据集。接下来,您需要重塑和规范化训练和测试图像。其中,归一化会将图像的像素强度钳制在0和1之间。最后,我们使用之前导入的to_categorical方法将训练和测试标签转换为分类标签。这对于向TensorFlow框架传达输出标签(即:0到9)是类而不是数字这一点非常重要。5.设计神经网络架构接下来,让我们详细了解如何设计神经网络架构。我们通过添加Flatten将2D图像矩阵转换为向量来定义DNN(深度神经网络)的结构。输入神经元对应于向量中的数字。接下来,我使用Dense()方法添加两个隐藏的密集层,并从先前定义的“params”字典中提取超参数。我们可以使用“relu”(整流线性单元)作为这些层的激活函数。它是神经网络隐藏层中最常用的激活函数之一。然后,我们使用Dropout方法添加Dropout层。它将用于在训练神经网络时避免过度拟合。毕竟,过拟合模型往往会准确地记住训练集,而无法泛化到未见过的数据集。输出层是我们网络中的最后一层,它是使用Dense()方法定义的。请注意,输出层有10个神经元,对应于类别(数字)的数量。#模型定义#从记录的超参数获取参数2-size'),activatinotallow='relu'),Dropout(params('dropout')),Dense(10)])lr_schedule=tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate=experiment.get_parameter('initial-lr'),decay_steps=experiment.get_parameter('decay-steps'),decay_rate=experiment.get_parameter('decay-rate'))loss_fn=tf.keras.losses.CategoricalCrossentropy(from_logits=True)model.compile(优化器='adamax',loss=loss_fn,metrics=['accuracy'])model.fit(x_train,y_train,batch_size=experiment.get_parameter('batch-size'),epochs=experiment.get_parameter('epochs'),validation_data=(x_test,y_test),)score=model.evaluate(x_test,y_test)#LogModelmodel.save('tf-mnist-comet.h5')6.训练到此为止,我们已经定义了架构。让我们用给定的训练数据编译和训练神经网络。首先,我们使用ExponentialDecay(指数衰减学习率)来定义一个以初始学习率、衰减步长和衰减率作为参数的学习率计划。其次,将损失函数定义为CategoricalCrossentropy(用于多类分类)。接下来,通过将优化器(即adamax)、损失函数和指标作为参数传递来编译模型(我选择准确性,因为所有类别都同等重要且分布均匀)。然后,我们使用x_train、y_train、batch_size、epochs和validation_data调用拟合方法,对模型进行拟合。同时调用模型对象的评估方法,得到模型在未见数据集上的性能得分。最后,您可以使用在模型对象上调用的save方法保存要在生产中部署的模型对象。7.总结总之,我们讨论了为图像分类任务训练深度神经网络的一些介绍性方面。您可以以此为起点,熟悉使用神经网络进行图像分类。基于此,您可以了解如何选择正确的参数集以及架构背后的思维逻辑。原文链接:https://www.kdnuggets.com/2022/12/guide-train-image-classification-model-tensorflow.html