使用TensorFlow训练图像分类模型的指南
译者 | 陈峻
审校 | 孙淑娟
众所周知,人类在很小的时候就学会了识别和标记自己所看到的事物。如今,随着机器学习和深度学习算法的不断迭代,计算机已经能够以非常高的精度,对捕获到的图像进行大规模的分类了。目前,此类先进算法的应用场景已经涵括到了包括:解读肺部扫描影像是否健康,通过移动设备进行面部识别,以及为零售商区分不同的消费对象类型等领域。
下面,我将和您共同探讨计算机视觉(Computer Vision)的一种应用——图像分类,并逐步展示如何使用TensorFlow,在小型图像数据集上进行模型的训练。
1、数据集和目标
在本示例中,我们将使用MNIST数据集的从0到9的数字图像。其形态如下图所示:
我们训练该模型的目的是为了将图像分类到其各自的标签下,即:它们在上图中各自对应的数字处。通常,深度神经网络架构会提供一个输入、一个输出、两个隐藏层(Hidden Layers)和一个用于训练模型的Dropout层。而CNN或卷积神经网络(Convolutional Neural Network)是识别较大图像的首选,它能够在减少输入量的同时,捕获到相关的信息。
2、准备工作
首先,让我们通过TensorFlow、to_categorical(用于将数字类的值转换为其他类别)、Sequential、Flatten、Dense、以及用于构建神经网络架构的 Dropout,来导入所有相关的代码库。您可能会对此处提及的部分代码库略感陌生。我会在下文中对它们进行详细的解释。
3、超参数
- 我将通过如下方面,来选择正确的超参数集:
- 首先,让我们定义一些超参数作为起点。后续,您可以针对不同的需求,对其进行调整。在此,我选择了128作为较小的批量尺寸(batch size)。其实,批量尺寸可以取任何值,但是2的幂次方大小往往能够提高内存的效率,因此应作为首选。值得注意的是,在决定合适的批量尺寸时,其背后的主要参考依据是:过小的批量尺寸会使收敛过于繁琐,而过大的批量尺寸则可能并不适合您的计算机内存。
- 让我们将epoch(训练集中每一个样本都参与一次训练)的数量保持为50 ,以实现对模型的快速训练。epoch数值越低,越适合小而简单的数据集。
- 接着,您需要添加隐藏层。在此,我为每个隐藏层都保留了128个神经元。当然,你也可以用64和32个神经元进行测试。就本例而言,像MINST这样的简单数据集,我并不建议使用较高的数值。
- 您可以尝试不同的学习率(learning rate),例如0.01、0.05和0.1。在本例中,我将其保持为0.01。
- 对于其他超参数,我将衰减步骤(decay steps)和衰减率(decay rate)分别选择为2000和0.9。而随着训练的进行,它们可以被用来降低学习率。
- 在此,我选择Adamax作为优化器。当然,您也可以选择诸如Adam、RMSProp、SGD等其他优化器。
import tensorflow as tf from tensorflow.keras.utils import to_categorical from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Flatten, Dense, Dropout params = { 'dropout': 0.25, 'batch-size': 128, 'epochs': 50, '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.mnist num_class = 10 # split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() # reshape and normalize the data x_train = x_train.reshape(60000, 784).astype("float32")/255 x_test = x_test.reshape(10000, 784).astype("float32")/255 # convert class vectors to binary class matrices y_train = to_categorical(y_train, num_class) y_test = to_categorical(y_test, num_class)
4、创建训练和测试集
由于TensorFlow库也包括了MNIST数据集,因此您可以通过调用对象上的 datasets.mnist ,再调用load_data() 的方法,来分别获取训练(60,000个样本)和测试(10,000个样本)的数据集。
接着,您需要对训练和测试的图像进行整形和归一化。其中,归一化会将图像的像素强度限制在0和1之间。
最后,我们使用之前已导入的to_categorical 方法,将训练和测试标签转换为已分类标签。这对于向TensorFlow框架传达输出的标签(即:0到9)为类(class),而不是数字类型,是非常重要的。
5、设计神经网络架构
下面,让我们来了解如何在细节上设计神经网络架构。
我们通过添加Flatten ,将2D图像矩阵转换为向量,以定义DNN(深度神经网络)的结构。输入的神经元在此处对应向量中的数字。
接着,我使用Dense() 方法,添加两个隐藏的密集层,并从之前已定义的“params”字典中提取各项超参数。我们可以将“relu”(Rectified Linear Unit)作为这些层的激活函数。它是神经网络隐藏层中最常用的激活函数之一。
然后,我们使用Dropout方法添加Dropout层。它将被用于在训练神经网络时,避免出现过拟合(overfitting)。毕竟,过度拟合模型倾向于准确地记住训练集,并且无法泛化那些不可见(unseen)的数据集。
输出层是我们网络中的最后一层,它是使用Dense() 方法来定义的。需要注意的是,输出层有10个神经元,这对应于类(数字)的数量。
# Model Definition # Get parameters from logged hyperparameters model = Sequential([ Flatten(input_shape=(784, )), Dense(params('layer-1-size'), activatinotallow='relu'), Dense(params('layer-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(optimizer='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) # Log Model model.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
以上是使用TensorFlow训练图像分类模型的指南的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

想象一下,一个人工智能模型,不仅拥有超越传统计算的能力,还能以更低的成本实现更高效的性能。这不是科幻,DeepSeek-V2[1],全球最强开源MoE模型来了。DeepSeek-V2是一个强大的专家混合(MoE)语言模型,具有训练经济、推理高效的特点。它由236B个参数组成,其中21B个参数用于激活每个标记。与DeepSeek67B相比,DeepSeek-V2性能更强,同时节省了42.5%的训练成本,减少了93.3%的KV缓存,最大生成吞吐量提高到5.76倍。DeepSeek是一家探索通用人工智

AI,的确正在改变数学。最近,一直十分关注这个议题的陶哲轩,转发了最近一期的《美国数学学会通报》(BulletinoftheAmericanMathematicalSociety)。围绕「机器会改变数学吗?」这个话题,众多数学家发表了自己的观点,全程火花四射,内容硬核,精彩纷呈。作者阵容强大,包括菲尔兹奖得主AkshayVenkatesh、华裔数学家郑乐隽、纽大计算机科学家ErnestDavis等多位业界知名学者。AI的世界已经发生了天翻地覆的变化,要知道,其中很多文章是在一年前提交的,而在这一

本月初,来自MIT等机构的研究者提出了一种非常有潜力的MLP替代方法——KAN。KAN在准确性和可解释性方面表现优于MLP。而且它能以非常少的参数量胜过以更大参数量运行的MLP。比如,作者表示,他们用KAN以更小的网络和更高的自动化程度重现了DeepMind的结果。具体来说,DeepMind的MLP有大约300,000个参数,而KAN只有约200个参数。KAN与MLP一样具有强大的数学基础,MLP基于通用逼近定理,而KAN基于Kolmogorov-Arnold表示定理。如下图所示,KAN在边上具

波士顿动力Atlas,正式进入电动机器人时代!昨天,液压Atlas刚刚「含泪」退出历史舞台,今天波士顿动力就宣布:电动Atlas上岗。看来,在商用人形机器人领域,波士顿动力是下定决心要和特斯拉硬刚一把了。新视频放出后,短短十几小时内,就已经有一百多万观看。旧人离去,新角色登场,这是历史的必然。毫无疑问,今年是人形机器人的爆发年。网友锐评:机器人的进步,让今年看起来像人类的开幕式动作、自由度远超人类,但这真不是恐怖片?视频一开始,Atlas平静地躺在地上,看起来应该是仰面朝天。接下来,让人惊掉下巴

谷歌力推的JAX在最近的基准测试中性能已经超过Pytorch和TensorFlow,7项指标排名第一。而且测试并不是在JAX性能表现最好的TPU上完成的。虽然现在在开发者中,Pytorch依然比Tensorflow更受欢迎。但未来,也许有更多的大模型会基于JAX平台进行训练和运行。模型最近,Keras团队为三个后端(TensorFlow、JAX、PyTorch)与原生PyTorch实现以及搭配TensorFlow的Keras2进行了基准测试。首先,他们为生成式和非生成式人工智能任务选择了一组主流

特斯拉机器人Optimus最新视频出炉,已经可以在厂子里打工了。正常速度下,它分拣电池(特斯拉的4680电池)是这样的:官方还放出了20倍速下的样子——在小小的“工位”上,拣啊拣啊拣:这次放出的视频亮点之一在于Optimus在厂子里完成这项工作,是完全自主的,全程没有人为的干预。并且在Optimus的视角之下,它还可以把放歪了的电池重新捡起来放置,主打一个自动纠错:对于Optimus的手,英伟达科学家JimFan给出了高度的评价:Optimus的手是全球五指机器人里最灵巧的之一。它的手不仅有触觉

目标检测在自动驾驶系统当中是一个比较成熟的问题,其中行人检测是最早得以部署算法之一。在多数论文当中已经进行了非常全面的研究。然而,利用鱼眼相机进行环视的距离感知相对来说研究较少。由于径向畸变大,标准的边界框表示在鱼眼相机当中很难实施。为了缓解上述描述,我们探索了扩展边界框、椭圆、通用多边形设计为极坐标/角度表示,并定义一个实例分割mIOU度量来分析这些表示。所提出的具有多边形形状的模型fisheyeDetNet优于其他模型,并同时在用于自动驾驶的Valeo鱼眼相机数据集上实现了49.5%的mAP

这篇论文探讨了在自动驾驶中,从不同视角(如透视图和鸟瞰图)准确检测物体的问题,特别是如何有效地从透视图(PV)到鸟瞰图(BEV)空间转换特征,这一转换是通过视觉转换(VT)模块实施的。现有的方法大致分为两种策略:2D到3D和3D到2D转换。2D到3D的方法通过预测深度概率来提升密集的2D特征,但深度预测的固有不确定性,尤其是在远处区域,可能会引入不准确性。而3D到2D的方法通常使用3D查询来采样2D特征,并通过Transformer学习3D和2D特征之间对应关系的注意力权重,这增加了计算和部署的
