简体   繁体   中英

Keras CNN Model always returns less than 5% accuracy

I'm trying to train a CNN to predict pokemon, but I can't seem to get its accuracy above 5%. This is my first ML project so I'm pretty lost on what I could be doing wrong. I tested this same model on Cats vs Dogs and I'm getting around 60% accuracy. I've seen some articles online where people are using this exact same dataset( https://www.kaggle.com/lantian773030/pokemonclassification ) and are achieving around 55% accuracy. Any help is appreciated!

import matplotlib.pyplot as plt
import cv2
import os
import requests
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import Sequential, save_model, load_model
from tensorflow.keras.layers import Activation, Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau

TRAINING_DIR = "/content/training_set/training_set"
TESTING_DIR = '/content/test_set/test_set'
IMG_HEIGHT, IMG_WIDTH = 64, 64
SAVE_MODEL_DIR = './content/model'
train = ImageDataGenerator(rescale=1/255)
validation = ImageDataGenerator(rescale=1/255)

train_dataset = train.flow_from_directory(TRAINING_DIR, target_size=(IMG_HEIGHT,IMG_WIDTH), batch_size=32, class_mode='categorical')
testing_dataset = train.flow_from_directory(TESTING_DIR, target_size=(IMG_HEIGHT,IMG_WIDTH), batch_size=32, class_mode='categorical')
dataset_indices = train_dataset.class_indices

model = Sequential()
# VGG model
model.add(Conv2D(32, 3, padding = 'same', activation = 'relu', input_shape =(IMG_WIDTH,IMG_WIDTH,3), kernel_initializer = 'he_normal'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(Conv2D(64, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(128, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(Conv2D(128, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(256, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(Conv2D(256, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(256, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(len(dataset_indices), activation = 'softmax'))

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

model_fit = model.fit(train_dataset, steps_per_epoch=5, epochs=50, shuffle=True)

I'm trying to train a CNN to predict pokemon, but I can't seem to get its accuracy above 5%. This is my first ML project so I'm pretty lost on what I could be doing wrong. I tested this same model on Cats vs Dogs and I'm getting around 60% accuracy. I've seen some articles online where people are using this exact same dataset( https://www.kaggle.com/lantian773030/pokemonclassification ) and are achieving around 55% accuracy. Any help is appreciated!

import matplotlib.pyplot as plt
import cv2
import os
import requests
import numpy as np
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import Sequential, save_model, load_model
from tensorflow.keras.layers import Activation, Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau

TRAINING_DIR = "/content/training_set/training_set"
TESTING_DIR = '/content/test_set/test_set'
IMG_HEIGHT, IMG_WIDTH = 64, 64
SAVE_MODEL_DIR = './content/model'
train = ImageDataGenerator(rescale=1/255)
validation = ImageDataGenerator(rescale=1/255)

train_dataset = train.flow_from_directory(TRAINING_DIR, target_size=(IMG_HEIGHT,IMG_WIDTH), batch_size=32, class_mode='categorical')
testing_dataset = train.flow_from_directory(TESTING_DIR, target_size=(IMG_HEIGHT,IMG_WIDTH), batch_size=32, class_mode='categorical')
dataset_indices = train_dataset.class_indices

model = Sequential()
# VGG model
model.add(Conv2D(32, 3, padding = 'same', activation = 'relu', input_shape =(IMG_WIDTH,IMG_WIDTH,3), kernel_initializer = 'he_normal'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(Conv2D(64, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(128, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(Conv2D(128, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(256, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(Conv2D(256, 3, padding = 'same', kernel_initializer = 'he_normal', activation = 'relu'))
model.add(BatchNormalization(axis = -1))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(256, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(len(dataset_indices), activation = 'softmax'))

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

model_fit = model.fit(train_dataset, steps_per_epoch=5, epochs=50, shuffle=True)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM