Классификатор изображений фруктов (Python) - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь закодировать классификатор изображений фруктов с помощью python, попробуйте классифицировать 7 фруктов. У меня есть 15077 изображений для train_set и 4204 изображений для validation_set. Я скомпилировал код для 10 эпох и получил следующие результаты:

Обучить на 15077 образцах, проверить на 4204 образцах Эпоха 1/10 15077/15077 [============= =================] - 264 с 17 мс / шаг - потеря: 1.0652 - точность: 0.5325 - val_loss: 0.3722 - val_accuracy: 0.8428 Эпоха 2/10 15077/15077 [=== ===========================] - 256 с 17 мс / шаг - потеря: 0,4236 - точность: 0,8405 - val_loss: 0,2910 - val_accuracy: 0,9034 эпохи 3/10 15077/15077 [==============================] - 499 с 33 мс / шаг - потеря: 0,2682 - точность: 0.9107 - val_loss: 0.3614 - val_accuracy: 0.8830 Эпоха 4/10 15077/15077 [==============================] - 243 сек. 16 мс / шаг - потеря: 0,2022 - точность: 0,9381 - val_loss: 0,0985 - val_accuracy: 0,9724 Эпоха 5/10 15077/15077 [======================= =======] - 245 с 16 мс / шаг - потеря: 0,1500 - точность: 0,9548 - val_loss: 0,1258 - val_accuracy: 0,9536 Эпоха 6/10 15077/15077 [============= =================] - 253 с 17 мс / шаг - потеря: 0,1509 - точность: 0,9529 - val_loss: 0,1831 - val_ точность: 0,9317 Эпоха 7/10 15077/15077 [==============================] - 245 с 16 мс / шаг - потеря: 0.1020 - точность: 0,9678 - val_loss: 0,2164 - val_accuracy: 0,9391 Эпоха 8/10 15077/15077 [============================= =] - 255 с 17 мс / шаг - потеря: 0,0668 - точность: 0,9816 - val_loss: 0,3004 - val_accuracy: 0,9229 Эпоха 9/10 15077/15077 [=================== ===========] - 243 с 16 мс / шаг - потеря: 0,1081 - точность: 0,9704 - val_loss: 1,4997 - val_accuracy: 0,8639 Эпоха 10/10 15077/15077 [========= =====================] - 240 с 16 мс / шаг - потеря: 0,0765 - точность: 0,9784 - val_loss: 0,1763 - val_accuracy: 0,9424 Потери при тестировании: 0,17632227091173225 Точность теста: 0,9424358010292053 Интересно, почему точность действует как волна греха? Я думаю, он должен увеличиваться с каждой эпохой. У вас есть рекомендации по изменению кода? Спасибо за ответ.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import cv2
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.layers import LSTM, Input, TimeDistributed
from keras.models import Model
from keras.optimizers import RMSprop, SGD

# Import the backend
from keras import backend as K

dataDirTrain = "C:/Users/TCSEAKIN/Desktop/Py/AI-hack/AI/Training"
dataDirTest = "C:/Users/TCSEAKIN/Desktop/Py/AI-hack/AI/Test"
categories = ["Armut", "Cilek", "Elma_Kirmizi", "Elma_Yesil", "Mandalina", "Muz","Portakal"]


training_data = []
test_data = []

for category in categories:
    path = os.path.join(dataDirTrain, category)
    class_num = categories.index(category)
    for img in os.listdir(path):
        try:
            imgTrainArray = cv2.imread(os.path.join(path,img))
            newTrainArray = cv2.resize(imgTrainArray, (50, 50))
            training_data.append([newTrainArray, class_num])
        except Exception as e:
            pass


for category in categories:
    path = os.path.join(dataDirTest, category)
    class_num = categories.index(category)
    for img in os.listdir(path):
        try:
            imgTestArray = cv2.imread(os.path.join(path,img))
            newTestArray = cv2.resize(imgTestArray, (50, 50))
            test_data.append([newTestArray, class_num])
        except Exception as e:
            pass

X_train = []
x_test = []
y_train = []
y_test = []

for features, label in training_data:
    X_train.append(features)
    y_train.append(label)

for features, label in test_data:
    x_test.append(features)
    y_test.append(label)

X_train = np.array(X_train).reshape(-1, 50, 50, 3)
y_train = np.array(y_train).reshape(-1, 1)

x_test = np.array(x_test).reshape(-1, 50, 50, 3)
y_test = np.array(y_test).reshape(-1, 1)


X_train = X_train/255
x_test = x_test/255

from keras.utils import to_categorical

Y_train_one_hot = to_categorical(y_train)
Y_test_one_hot = to_categorical(y_test)

model_cnn = Sequential()
# First convolutional layer, note the specification of shape
model_cnn.add(Conv2D(64, kernel_size=(3, 3),activation='relu',input_shape=(50, 50, 3)))


model_cnn.add(Conv2D(128, (3, 3), activation='relu'))
model_cnn.add(MaxPooling2D(pool_size=(2, 2)))
model_cnn.add(Conv2D(256, (3, 3), activation='relu'))
model_cnn.add(MaxPooling2D(pool_size=(2, 2)))
model_cnn.add(Dropout(0.5))

model_cnn.add(Flatten())
model_cnn.add(Dense(128, activation='relu'))
model_cnn.add(Dropout(0.5))
model_cnn.add(Dense(64, activation='relu'))
model_cnn.add(Dropout(0.5))
model_cnn.add(Dense(7, activation='softmax'))

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

model_cnn.fit(X_train, Y_train_one_hot,
          batch_size=64,
          epochs=10,
          verbose=1,
          validation_data=(x_test, Y_test_one_hot))
score = model_cnn.evaluate(x_test, Y_test_one_hot, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

model_cnn.save("C:/Users/TCSEAKIN/Desktop/Training3.py"

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Думаю, точность тренировки уже хорошая. Вы можете сделать несколько вещей, чтобы повысить точность проверки и общую производительность.

  1. использовать ImageDataGenerator для увеличения изображений, чтобы повысить точность модели
  2. использовать более низкую скорость обучения или скорость адаптивного обучения.
  3. Обновите две строки, как показано ниже. Недавно было обнаружено, что существуют числовые нестабильности, вносимые слоем softmax в конце модели.

Замените эти две строки
с

model_cnn.add(Dense(7, activation='softmax'))

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

на

model_cnn.add(Dense(7))

model_cnn.compile(loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              optimizer="adam",
              metrics=['accuracy'])
Попробуйте настроить некоторые гиперпараметры, например, изменение batch_size с 64 на 32, что увеличивает количество шагов, попробуйте другие методы оптимизации, увеличьте количество эпох и т. Д. c.

Надеюсь, это поможет.

0 голосов
/ 04 мая 2020

На самом деле это нормальное поведение. Вы можете уменьшить скорость обучения, чтобы уменьшить различия в точности между эпохами обучения (также, попробуйте другие оптимизаторы, если хотите)

Кроме того, вы должны нормализовать свои изображения, чтобы улучшить способность вашей сети обобщать знание. Здесь вы можете узнать больше о нормализации: https://machinelearningmastery.com/how-to-normalize-center-and-standardize-images-with-the-imagedatagenerator-in-keras/

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