如何提高cifar-100数据集的准确性?我目前的准确度是10%

时间:2019-10-26 01:02:46

标签: python tensorflow keras

我正在做一个有趣的cifar-100数据集的小项目。我不确定为什么我的准确率低10%。这是我的代码,有人可以帮忙吗?谢谢(fyi,cifar-100数据集是一个包含100种图像的keras数据集。)

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

#print(train_images[0])
#print("Network Accuracy: " + str(test_acc))
# plt.imshow(train_images[0], cmap=plt.cm.binary) #greyscale
# plt.imshow(train_images[0]) #neon
# plt.show()

cifar100_mnist = keras.datasets.cifar100

(train_images, train_labels), (test_images, test_labels) = cifar100_mnist.load_data()
print(train_images)
print("-")
print(train_labels)
train_images = train_images/255
test_images = test_images/255
classes = [
    'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle',
    'bicycle', 'bottle', 'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel',
    'can', 'castle', 'caterpillar', 'cattle', 'chair', 'chimpanzee', 'clock',
    'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
    'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster',
    'house', 'kangaroo', 'keyboard', 'lamp', 'lawn_mower', 'leopard', 'lion',
    'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain', 'mouse',
    'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear',
    'pickup_truck', 'pine_tree', 'plain', 'plate', 'poppy', 'porcupine',
    'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket', 'rose',
    'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake',
    'spider', 'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table',
    'tank', 'telephone', 'television', 'tiger', 'tractor', 'train', 'trout',
    'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman',
    'worm'
]
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(32, 32, 3)),
    keras.layers.Dense(500, activation="relu"),
    keras.layers.Dense(100, activation="softmax")
])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=5)

test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc)
# print(test_images)
prediction = model.predict(test_images)
answer = np.argmax(prediction[0])
print(classes[answer])
# print(train_images[0])
plt.imshow(train_images[0])
plt.show()

希望我能得到答案,谢谢大家,我非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您在评论中提到要查看示例here is one in Github

需要声明的是,我没有亲自测试此代码存储库。

答案 1 :(得分:0)

关于您的任务的实施卷积示例:

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(32, 32, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(100, activation='softmax')
])

model.summary()

尝试更多的纪元(例如25个):

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=25)

您在训练集上获得了很高的准确性:

  

第25/25集       50000/50000 [=============================]-12s 248us / sample-损耗:0.2362-acc:0.9243

让我们来看看测试的准确性:

test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc)
prediction = model.predict(test_images)
  

10000/10000 [=============================]-1s 139us / sample-损耗:7.7701-acc: 0.3272   0.3272

这意味着您的模型超出了训练集。

亲自尝试:

image_number = 5
answer = np.argmax(prediction[image_number])
print(classes[answer])
plt.imshow(train_images[image_number])
  

蜥蜴

     

obviously no lizard :)

显然没有蜥蜴:)

这里开始机器学习的任务。改善模型以减少偏差和方差并获得高精度。我还在学习,所以我希望这可以为您指明正确的方向。

但是请注意此数据集。您可以在CIFAR-100页面上阅读:

  

有100个类别,每个类别包含600张图像。有500   培训图片和每班100张测试图片。

500张图像不足以训练CNN,这将导致过拟合。我认为CIFAR 10更适合初学者?他们在同一页上提到:

  

[...]没有数据扩充的18%测试错误[...]

尝试一下:)

答案 2 :(得分:0)

我认为您的模型有误。尝试执行conv2D,然后进行maxpooling几次。至于倒数第二个密集层,它在代码中的存在仅取决于您正在执行的时期数。使用张量板分析模型。另外,将train_images除以255时,最好使用255.0。我认为您的代码没有其他问题。但是,我建议使用与cifar100网站上给出的顺序相同的类