图像分类 - cifar100 实验研究

为了解决 cifar100 val_acc 过低的问题,本质上是过拟合问题,所以特地去 papers with code 网站上看了下 cifar100 benchmark 目前第一名做到了多少,如下图所示,val_cc = 0.96,有点东西哈,所以目前要做的是研究 SAM (Sharpness-Aware Minimization),主要用于提升模型的泛化性。

我这里先把拿到的代码跑了下,不过数据集是 cifar10,val_acc = 0.97,我觉得还是很稳的,目前正在跑 cifar100,不过代码是 Pytorch 版本的,后续需要迁移到 Tensorflow 上来。cifar10 训练截图如下所示。代码地址: https://github.com/davda54/sam

更新: 跑完 cifar100 了,但是 val_acc 和想象中的有差别吧,总的来说是比之前的 0.8 有提升了,目前是 val_acc = 0.83,训练截图如下所示

特别说明: 模型训练 log 里的 Name,比如 DenseNet121_RandomFlip_…/validation,实际上用的网络是 DenseNet121,数据增强用的是 RandAugmentation,可以忽略 RandomFlip,因为上一个 flower_photos 实验研究遗留下来的原因

数据集: visual_domain_decathlon/cifar100

Config description: Data based on “CIFAR-100”, with images resized isotropically to have a shorter size of 72 pixels

train: 40000 张图片

test: 10000 张图片

validation: 10000 张图片

类别数为 100

训练的时候采用 180 x 180 x 3

其中 NASNetMobile 特殊一些,需要 resize 成 224 x 224 x 3

第一阶段,我们利用在 ImageNet 上做过预训练的模型来做 feature extraction,意思就是要 freeze 预训练模型的卷积部分,然后只训练新添加的 top-classifier,训练结果如下图所示

此处我们可以看到,val_acc 最高的是 ResNet50,值为 0.7421,其实最高的是 ResNet101,但是考虑到计算量,我们取 ResNet50。不过这里比较神奇的是 ResNet50 的 val_acc 竟然是最高的,猜测是数据集的分辨率大小问题,毕竟我们此次的任务,原始图像分辨率只有 72 x 72 x 3。

我们粘贴一下第一阶段的代码

rand_aug = iaa.RandAugment(n=3, m=7)

def augment(images):
    # Input to `augment()` is a TensorFlow tensor which
    # is not supported by `imgaug`. This is why we first
    # convert it to its `numpy` variant.
    images = tf.cast(images, tf.uint8)
    return rand_aug(images=images.numpy())


AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.shuffle(buffer_size=len(train_ds)).cache().batch(batch_size).map(
    lambda x, y: (tf.py_function(augment, [x], [tf.float32])[0], y), num_parallel_calls=AUTOTUNE).prefetch(
    buffer_size=AUTOTUNE)
val_ds = val_ds.cache().batch(batch_size).prefetch(buffer_size=AUTOTUNE)


preprocess_input = tf.keras.applications.resnet.preprocess_input
base_model = tf.keras.applications.ResNet101(input_shape=img_size,
                                             include_top=False,
                                             weights='imagenet')

这里,我没有粘贴全部的代码,如果需要查看源码,请到这里: https://github.com/MaoXianXin/Tensorflow_tutorial

如上图所示,我们需要 checkout 对应的分支。

基于此,我们对 ResNet50 和 InceptionResNetV2 分别做了 fine-tune,结果如下所示

此处未对第一阶段的所有模型做 fine-tune,从上图可以发现,还是 ResNet50 的 val_acc 略高,不过到这里为止,我们在 visual_domain_decathlon/cifar100 上的 val_acc 还是低了些,只有 0.8041,需要做改进。

preprocess_input = tf.keras.applications.resnet50.preprocess_input
base_model = tf.keras.applications.ResNet50(input_shape=img_size,
                                            include_top=False,
                                            weights='imagenet')
base_model.trainable = True
# Let's take a look to see how many layers are in the base model
print("Number of layers in the base model: ", len(base_model.layers))

# Fine-tune from this layer onwards
fine_tune_at = 120

# Freeze all the layers before the `fine_tune_at` layer
for layer in base_model.layers[:fine_tune_at]:
    layer.trainable = False

inputs = tf.keras.Input(shape=img_size)
x = data_augmentation(inputs)
x = preprocess_input(x)
x = base_model(x, training=False)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dropout(0.2)(x)
outputs = tf.keras.layers.Dense(num_classes)(x)
model = tf.keras.Model(inputs, outputs)
model.load_weights('./save_model/my_model_1')
print(model.summary())

最后上一下 fine-tune 阶段的代码,这里需要注意的是,不同模型,网络层数不一样,所以 fine_tune_at 这个参数我们需要看情况而定,还有就是加载模型的地址不要搞错。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: CIFAR-100图片是一个被广泛用于图像识别和计算机视觉任务的数据集。该数据集共包含100个类别,每个类别有600张图片,总共有60000张彩色图像。每个图像的大小为32x32像素,分为训练集和测试集两部分。 CIFAR-100图片数据集中的图像类别非常多样化,包括动物、植物、物体、食物等多个领域。每个类别有600张图片,其中500张用于训练,100张用于测试。这样的设置可以有效地用于训练机器学习算法和评估它们的性能。 CIFAR-100图片数据集的广泛应用使得研究人员可以在图像分类、目标检测、图像分割等领域开展各种实验研究。通过对CIFAR-100数据集的学习和分析,研究人员可以设计出更准确的分类器和目标检测算法,提高计算机对图像的理解能力。 此外,CIFAR-100数据集的特点也使得它成为很多机器学习算法的基准测试数据集。许多研究人员使用CIFAR-100数据集对他们的算法进行评估和比较,以确定算法的性能和效果。 总的来说,CIFAR-100图片是一个有着广泛应用价值的图像数据集,它促进了图像分类、目标检测和计算机视觉等领域的研究和发展。通过对CIFAR-100数据集的研究,我们可以更好地理解和应用计算机对图像的理解能力。 ### 回答2: CIFAR-100是一个广泛用于计算机视觉研究的图像数据集。它包含了100个类别的图像,每个类别都有600个图像样本。这些类别分为20个超类,每个超类包含5个小类。CIFAR-100中的图像是32x32像素大小的彩色图像。 CIFAR-100的数据集用于培训和测试计算机视觉算法的性能。研究者可以利用CIFAR-100来开发和评估图像分类、目标检测和语义分割等任务的算法。 CIFAR-100的每个样本都有一个标签,用于指示图像所属的类别。这些类别包括动物、植物、交通工具和日常物品等。例如,动物类别中包含了鸟类、猫类、狗类等不同的动物。而植物类别则包含了不同的花朵和树木。 CIFAR-100的图像多样性丰富,涵盖了各种真实世界中的对象和场景。这些图像具有挑战性,因为它们的分辨率较低、噪声较高,并且存在一定的干扰。因此,研究者需要设计有效的算法来提取和利用这些图像中的特征,以便准确地识别和分类不同的对象。 总之,CIFAR-100是一个重要的图像数据集,用于推动计算机视觉领域的研究和进展。它提供了一个丰富的图像样本集合,可以帮助算法开发者更好地理解和解决真实世界中的图像识别和分类问题。 ### 回答3: CIFAR-100是一个包含100个类别的图像数据集。每个类别包含600张32x32的彩色图像,其中500张用于训练,100张用于测试。这些类别可以分为20个超类别,每个超类别包含5个类别。 CIFAR-100的图像包含各种各样的物体,动物和场景,例如飞机,汽车,鸟类,猫,鹿,狗,青蛙,马,船,卡车,蜜蜂,田野,森林,海滩等等。这些图像是真实世界的图像,因此对图像识别算法的性能和可靠性提出了挑战。 CIFAR-100的目标是为机器学习算法和计算机视觉模型提供一个用于图像分类的测试平台。通过使用CIFAR-100,研究人员可以评估不同算法和模型的性能,并进行模型训练和调优。此外,CIFAR-100还可以用于开展图像分析,特征提取,物体检测,目标跟踪等相关研究。 与CIFAR-10相比,CIFAR-100更加复杂,因为它涵盖了更多的类别和更多的超类别。因此,对CIFAR-100的图像分类要求更高的特征提取和模型设计能力。CIFAR-100也常常被用来作为图像分类算法的比较基准,例如卷积神经网络(CNN)。 总之,CIFAR-100是一个用于图像分类和计算机视觉研究的重要数据集,提供了一个多样化和挑战性的图像样本集合。它对于训练和评估不同的图像处理算法和模型非常有用,并且可以帮助研究人员推动计算机视觉领域的进展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值