как получить больше точности на CNN с меньшим количеством изображений - PullRequest
0 голосов
/ 30 сентября 2019

В настоящее время я работаю над набором цветочных классификаций kaggle, который имеет только 210 изображений, с этим набором изображений я получаю точность всего лишь 11% на проверочном наборе.

enter code here

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

import cv2
#from tqdm import tqdm
import os
import warnings
warnings.filterwarnings('ignore')

flower_img = r'C:\Users\asus\Downloads\flower_images\flower_images'

data = pd.read_csv(r'C:\Users\asus\Downloads\flower_images\flower_labels.csv')
img = os.listdir(flower_img)[1]
image_name = [img.split('.')[-2] for img in os.listdir(flower_img)]
label_array = np.array(data['label'])
label_unique = np.unique(label_array)
names = [' phlox','rose','calendula','iris','leucanthemum maximum','bellflower','viola','rudbeckia laciniata','peony','aquilegia']


Flower_names = {}
for i in range(10):
    Flower_names[i] = names[i]
print(Flower_names)
Flower_names.get(8)
x = data['label'][2]
Flower_names.get(x)

i=0
for img in os.listdir(flower_img):
    #print(img)

    path = os.path.join(flower_img,img)
    #img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
    img = cv2.imread(path)
    #print(img.shape)
    img = cv2.resize(img,(128,128))
    data['file'][i] = np.array(img)
    i+=1
data['file'][0].shape

plt.imshow(data['file'][0])
plt.show()

import keras
from keras.models import Sequential
from keras.layers import Dense,Conv2D,Activation,MaxPool2D,Dropout,Flatten

model = Sequential()
model.add(Conv2D(32,kernel_size=3,activation='relu',input_shape=(128,128,3)))
model.add(MaxPool2D(pool_size=(2,2)))

model.add(Conv2D(64,kernel_size=3,activation='relu'))
model.add(MaxPool2D(pool_size=(2,2)))

model.add(Conv2D(128,kernel_size=3,activation='relu'))
model.add(MaxPool2D(pool_size=(2,2)))

#model.add(Conv2D(512,kernel_size=3,activation='relu'))
#model.add(MaxPool2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.add(Dropout(0.25))

from keras.optimizers import Adam
model.compile(loss='categorical_crossentropy',optimizer=Adam(lr=0.002),metrics=['accuracy'])
model.summary()

x = np.array([i for i in data['file']]).reshape(-1,128,128,3)
y = np.array([i for i in data['label']])

from keras.utils import to_categorical
y = to_categorical(y)

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y)

model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=10)

model.evaluate(x_test,y_test)

model.evaluate(x_train,y_train)

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

Ссылка набора данных цветных изображений цветов: https://www.kaggle.com/olgabelitskaya/flower-color-images

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

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

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

Если вы не можете увеличить размер набора данных, вам следует выяснить, почему вам нужно использовать CNN. Существуют и другие алгоритмы, которые могут дать лучшие результаты при обучении с меньшим набором данных. Взгляните на Машины опорных векторов или k-NN .

Если вам необходимо использовать CNN, Transfer Learning является хорошим решением. Вы можете использовать функции обученной модели и применить их к вашей проблеме. Я имел большой успех с этим подходом.

1 голос
/ 30 сентября 2019

Что вы можете сделать:

Если честно, существует много и гораздо больше методов, которые могут быть использованы для повышения эффективности используемых данных. Попробуйте поискать по этой теме. Это те, которые я помню за минуту. Те, что я дал ссылку, являются лишь основными примерами. Вы можете копать лучше с помощью специального исследования.

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