VGG16 精度太低

问题描述 投票:0回答:1

我正在尝试在张量流中使用迁移学习(VGG16)制作一个机器学习模型,以从叶子的图像中识别药用植物的图像。问题是模型的准确率没有增加,它低至 0.05。

我的数据集有 30 个不同的文件夹。每个文件夹均以图像所属的类命名。我有 30 个不同的类别标签,带有其所属植物的名称。这 30 个不同的类别是 - 'Alpinia Galanga (Rasna)'、'Amaranthus Viridis (Arive-Dantu)'、 “菠萝蜜”, 'Azadirachta Indica (印楝)', 'Basella Alba (巴塞尔)', 'Brassica Juncea(印度芥末)','Carissa Carandas(卡兰达)', 'Citrus Limon(柠檬)'、'Ficus Auriculata(罗克斯堡无花果)'、 '榕树(菩提树)','木槿', '茉莉花(茉莉花)','芒果(芒果)','薄荷(薄荷)', '辣木(鼓槌)', 'Muntingia Calabura(牙买加樱桃加沙加斯)', 'Murraya Koenigii(咖喱)'、'Nerium Oleander(夹竹桃)'、 'Nyctanthes Arbor-tristis (Parijata)', 'Ocimum Tenuiflorum (Tulsi)', 'Piper Betle (Betel)', 'Plectranthus Amboinicus(墨西哥薄荷)', 'Pongamia Pinnata(印度山毛榉)'、'Psidium Guajava(番石榴)'、 'Punica Granatum(石榴)'、'檀香专辑(檀香)'、 'Syzygium Cumini(Jamun)','Syzygium Jambos(玫瑰苹果)', 'Tabernaemontana Divaricata(紫薇)', 'Trigonella Foenum-graecum(胡芦巴)'

我正在使用图像

ImageDataGenerator
进行增强。生成器如下-

#Definig ImageDataGenerator With Augmentation
datagen = ImageDataGenerator(
        rotation_range=20,
        width_shift_range=0.1,
        height_shift_range=0.1,
        shear_range=0.1,
        zoom_range=0.1,
        fill_mode='nearest',
        validation_split=0.2
        ) 

是的,数据已经分为训练、测试和验证。主目录包含3个子目录,每个子目录下有30个文件夹,文件夹名称与里面的图像所属类别相同。使用 flow_from_directory 加载数据,代码如下

#Loading Training DS
def load_ttv_ds(train_dir,test_dir,val_dir):
  train_ds = datagen.flow_from_directory(
      train_dir,
      target_size=(IMAGE_SIZE, IMAGE_SIZE),
      batch_size=BATCH_SIZE,
      shuffle=True,
      # subset='training'
  )
  test_ds = datagen.flow_from_directory(
      test_dir,
      target_size=(IMAGE_SIZE, IMAGE_SIZE),
      batch_size=BATCH_SIZE,
      shuffle=False
  )
  val_ds = datagen.flow_from_directory(
      val_dir,
      target_size=(IMAGE_SIZE, IMAGE_SIZE),
      batch_size=BATCH_SIZE,
      shuffle=False,
    #   subset="validation"
  )

  return train_ds,test_ds,val_ds

加载图像时,我将其大小调整为 256x256 像素 即

IMAGE_SIZE=256
BATCH_SIZE=16
我的数据集中共有 30 个类。

在火车上找到属于 30 个类别的 917 张图像 在 val 中找到属于 30 个类别的 570 张图像 在测试中找到了属于 30 个类别的 357 张图像。

from tensorflow.keras import layers, models
from tensorflow.keras.applications import VGG16

def build_model(lr=0.0001):
    base_model = VGG16(
        weights='imagenet',
        include_top=False,
        input_shape=(256, 256, 3)
    )

    # Freeze the VGG16 layers

    base_model.trainable = False

    model = models.Sequential()
    model.add(base_model)

    model.add(layers.Conv2D(64, kernel_size=3, activation='relu', padding='same'))
    model.add(layers.MaxPooling2D(pool_size=(2, 2)))

    model.add(layers.Conv2D(128, kernel_size=3, activation='relu', padding='same'))
    model.add(layers.MaxPooling2D(pool_size=(2, 2)))

    model.add(layers.Conv2D(256, kernel_size=3, activation='relu', padding='same'))
    model.add(layers.MaxPooling2D(pool_size=(2, 2)))

    model.add(layers.Flatten())

    model.add(layers.Dense(512, activation='relu'))
    model.add(layers.Dropout(0.5))

    model.add(layers.Dense(len(class_names), activation='softmax'))

    model.compile(
        optimizer=keras.optimizers.Adam(learning_rate=lr),
        loss='categorical_crossentropy',
        metrics=['accuracy']
    )

    model.summary()
    return model

这是我正在使用的模型。我正在对其进行 25 个 epoch 的训练,这就是输出。

29/29 [==============================] - 36s 1s/step - loss: 5238.8730 - accuracy: 0.0556 - val_loss: 4.9995 - val_accuracy: 0.1211
Epoch 2/25
29/29 [==============================] - 35s 1s/step - loss: 7077.9985 - accuracy: 0.0774 - val_loss: 6.2652 - val_accuracy: 0.0825
Epoch 3/25
29/29 [==============================] - 34s 1s/step - loss: 7518.0254 - accuracy: 0.0720 - val_loss: 5.7178 - val_accuracy: 0.1035
Epoch 4/25
29/29 [==============================] - 34s 1s/step - loss: 6460.3145 - accuracy: 0.0665 - val_loss: 5.5556 - val_accuracy: 0.1404
Epoch 5/25
29/29 [==============================] - 34s 1s/step - loss: 10283.3672 - accuracy: 0.0774 - val_loss: 4.8519 - val_accuracy: 0.1509
Epoch 6/25
29/29 [==============================] - 34s 1s/step - loss: 7203.8867 - accuracy: 0.0742 - val_loss: 5.3104 - val_accuracy: 0.1140
Epoch 7/25
29/29 [==============================] - 34s 1s/step - loss: 7828.9897 - accuracy: 0.0752 - val_loss: 5.2341 - val_accuracy: 0.1175
Epoch 8/25
29/29 [==============================] - 34s 1s/step - loss: 10705.5059 - accuracy: 0.0709 - val_loss: 5.3684 - val_accuracy: 0.1333
Epoch 9/25
29/29 [==============================] - 35s 1s/step - loss: 8385.2148 - accuracy: 0.0774 - val_loss: 5.1373 - val_accuracy: 0.1246

测试精度0.05

这里有什么错误吗?我该如何解决?

我也尝试过其他不同的型号。 EfficientNetB2 给出了几乎 0.9875 的相当好的结果。但我们被严格要求使用VGG。

tensorflow machine-learning deep-learning conv-neural-network image-classification
1个回答
0
投票

尝试增强数据以生成更多数据。我认为 970 图像非常低。如果您有或尝试增强技术,请使用更多数据以获得更多数据,然后尝试迁移学习。 您也可能认为 VGG 不适合您的方法。尝试使用 Resnet 模型或其他模型并评估您的模型。 VGG 可能不是您任务的最佳选择。

© www.soinside.com 2019 - 2024. All rights reserved.