Как бы я увеличил свою точность в наборе данных cifar-100? У меня на данный момент точность 10% - PullRequest
0 голосов
/ 26 октября 2019

Я делаю небольшой проект для развлечения с набором данных cifar-100. Я не уверен, почему у меня низкая точность 10%. Вот мой код, кто-нибудь может помочь? спасибо всем (к вашему сведению, набор данных cifar-100 - это набор данных keras с 100 типами изображений.)

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()

Надеюсь, что смогу получить ответ, спасибо, ребята, я действительно ценю помощь.

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Пример реализации Сверток относительно вашей задачи:

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)

Вы получаете высокую Точность на обучающем наборе:

Epoch 25/25 50000/50000 [==============================] - 12 с 248 мкс / образец -потеря: 0,2362 - акк: 0,9243

Давайте посмотрим на точность теста:

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

10000/10000 [===============================] - 1 с 139 мкс / выборка - потери: 7,7701 - в соотв. 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% -ная ошибка теста без увеличения данных [...]

Что было бы гораздо веселее экспериментироватьс:)

0 голосов
/ 26 октября 2019

Вы упомянули в комментариях, что хотите увидеть пример, вот один из них в Github .

Что нужно объявить, так это то, что я лично не тестировал этот репозиторий кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...