Точность равна нулю для набора данных cifar10 с последовательной моделью Keras

Моя точность равна нулю для всех 15 эпох, несмотря на использование нескольких Conv2D и Max Pooling Layers. Я использую ImageDataGenerator вместо Data Augmentation.

Полный код приведен ниже:

# importing all the required libraries
import tensorflow as tf
from tensorflow.keras.layers import Dense, Conv2D, Flatten, MaxPool2D, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt

# Loading the Data from the in built library
(train_images, train_labels), (test_images, test_labels) = cifar10.load_data()

# Normalize the Pixel Data
train_images = train_images/255.0
test_images = test_images/255.0

# Instantiate the Image Data Generator Class with the Data Augmentation
datagen = ImageDataGenerator(width_shift_range = 0.2, height_shift_range = 0.2, 
                             rotation_range = 20, horizontal_flip = True, 
                             vertical_flip = True, validation_split = 0.2)

# Apply the Data Augmentation to the Training Images
datagen.fit(train_images)

# Create the Generator for the Training Images
train_gen = datagen.flow(train_images, train_labels, batch_size = 32, 
                         subset = 'training')

# Create the Generator for the Validation Images
val_gen = datagen.flow(train_images, train_labels, batch_size = 8, 
                         subset = 'validation')

num_classes = 10

# One Hot Encoding of Labels using to_categorical
train_labels = to_categorical(train_labels, num_classes)
test_labels = to_categorical(test_labels, num_classes)

img_height = 32
img_width = 32

# Building the Keras Model
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
#model.add(Dropout(rate = 0.2))
model.add(Dense(units = num_classes, activation = 'softmax'))
model.summary()

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

steps_per_epoch = len(train_images) * 0.8//32

history = model.fit(train_gen, validation_data = val_gen, 
          steps_per_epoch = steps_per_epoch, epochs = 15)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Превратите свой ярлык в один горячий прямо перед .flow.

...
# One Hot Encoding of Labels using to_categorical
train_labels = to_categorical(train_labels, num_classes)
test_labels = to_categorical(test_labels, num_classes)

# Create the Generator for the Training Images
train_gen = datagen.flow(train_images, train_labels, batch_size = 32, 
                         subset = 'training')

# Create the Generator for the Validation Images
val_gen = datagen.flow(train_images, train_labels, batch_size = 8, 
                         subset = 'validation')
...
Ответ принят как подходящий

Ваша проблема в том, что вы запустили этот код

train_gen = datagen.flow(train_images, train_labels, batch_size = 32, 
                         subset = 'training')

# Create the Generator for the Validation Images
val_gen = datagen.flow(train_images, train_labels, batch_size = 8, 
                         subset = 'validation')

но только после этого вы преобразовали ярлыки в категориальные. Так возьмите код

num_classes = 10

# One Hot Encoding of Labels using to_categorical
train_labels = to_categorical(train_labels, num_classes)
test_labels = to_categorical(test_labels, num_classes)

и поместите его ДО кода train_gen и val_gen. В более тонком вопросе у вас есть код

datagen.fit(train_images)

Вам нужно только установить генератор, если у вас есть какие-либо параметры featurewise_center, samplewise_center, featurewise_std_normalization или Для samplewise_std_normalization установлено значение true.

Другие вопросы по теме