Python 在CIFAR100数据集[Keras]上对VGG16进行故障培训

Python 在CIFAR100数据集[Keras]上对VGG16进行故障培训,python,tensorflow,keras,computer-vision,vgg-net,Python,Tensorflow,Keras,Computer Vision,Vgg Net,我试图从CIFAR-100数据集上的Keras库中培训VGGNET-16,但验证精度和损失没有提高,我认为我在预处理数据时犯了一些错误 我尝试了Keras库中的CIFAR-100数据集,但仍然面临相同的问题 代码 from tensorflow.keras.applications.vgg16 import VGG16 from tensorflow.keras import optimizers from keras.utils import to_categorical import nu

我试图从
CIFAR-100
数据集上的
Keras
库中培训
VGGNET-16
,但验证精度和损失没有提高,我认为我在预处理数据时犯了一些错误

我尝试了Keras库中的CIFAR-100数据集,但仍然面临相同的问题

代码

from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras import optimizers
from keras.utils import to_categorical

import numpy as np
import cv2 as cv
import glob
import os


train_path = r'/content/cifar-100/train'
test_path  = r'/content/cifar-100/test'

classes = ['class1', 'class2', ...,  'class100']


def load_train():

    images    = []
    labels    = []

    for fields in classes:

        index = classes.index(fields)
        path = os.path.join(train_path, fields, '*g')
        files = glob.glob(path)

        for fl in files:

          # Image
          image = cv.imread(fl)
          images.append(image)

          # Label
          label = np.zeros(len(classes))
          label[index] = 1.0
          labels.append(label)

    images = np.array(images)
    labels = np.array(labels)

    return images, labels

X_train, y_train = load_train()

model = VGG16(weights=None, classes=len(classes), input_shape=(32, 32, 3))

model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

history = model.fit(x=X_train, y=y_train, batch_size=256, epochs=40, verbose=1, validation_split=0.1, shuffle=True)
输出

Epoch 1/40
45000/45000 [==============================] - 16s 357us/sample - loss: 4.5153 - acc: 0.0157 - val_loss: 7.7937 - val_acc: 0.0000e+00
...
Epoch 10/40
45000/45000 [==============================] - 11s 248us/sample - loss: 3.2936 - acc: 0.1981 - val_loss: 10.8545 - val_acc: 0.0000e+00
...
Epoch 20/40
45000/45000 [==============================] - 11s 248us/sample - loss: 2.3035 - acc: 0.3951 - val_loss: 13.5597 - val_acc: 0.0000e+00
...
Epoch 30/40
45000/45000 [==============================] - 11s 248us/sample - loss: 0.7384 - acc: 0.7818 - val_loss: 21.9027 - val_acc: 0.0000e+00
...
Epoch 40/40
45000/45000 [==============================] - 11s 248us/sample - loss: 0.1570 - acc: 0.9527 - val_loss: 30.7987 - val_acc: 0.0000e+00
数据目录


任何人都可以看一下代码。

如果标签和图像正确,您可以尝试多种方法

1) 您可以尝试在将t赋予模型之前对图像进行规格化

    image = image / 255.
或者也可以使用最小-最大规格化

min_val = np.min(image)
max_val = np.max(image)
image = (image-min_val) / (max_val-min_val)
2) 您可以通过以下方式使用imagenet中预先训练的权重:

model = VGG16(weights="imagenet", classes=len(classes), input_shape=(32, 32, 3))
3) 您可以使用自定义优化器并调整学习速率

optimizer = keras.optimizers.adam(lr=2e-5)

4) 正如Daniel所建议的,您可以添加辍学和批量标准化层,以减少过度拟合

如果标签和图像正确,您可以尝试多种方法

1) 您可以尝试在将t赋予模型之前对图像进行规格化

    image = image / 255.
或者也可以使用最小-最大规格化

min_val = np.min(image)
max_val = np.max(image)
image = (image-min_val) / (max_val-min_val)
2) 您可以通过以下方式使用imagenet中预先训练的权重:

model = VGG16(weights="imagenet", classes=len(classes), input_shape=(32, 32, 3))
3) 您可以使用自定义优化器并调整学习速率

optimizer = keras.optimizers.adam(lr=2e-5)

4) 正如Daniel所建议的,您可以添加辍学和批量标准化层,以减少过度拟合

听起来像是严重的过度拟合,可能是严重的类不平衡,或者是设计糟糕的模型,比如在
退出之后有
BatchNormalization
。听起来像是严重的过度拟合,可能是严重的类不平衡,或者是设计糟糕的模型,比如在
退出之后有
BatchNormalization