Как повысить точность в CNN? - PullRequest
0 голосов
/ 25 июня 2019

Я новичок в CNN, но обладаю базовым пониманием ML и нейронных сетей.

Я хотел создать свой собственный CNN, который работает с набором данных о кошках и собаках. Я предварительно обработал данные и построил свою сеть, но когда я подгоняю модель к данным, я не могу получить точность более 55%, что означает, что модель ничего не изучает.

Кто-нибудь может объяснить, что я здесь делаю не так?

Уже пробовали разные скорости обучения и даже отсев, но тщетно

Часть обработки данных:

train_directory = r'C:\Users\atjayade\Downloads\P14-Convolutional-Neural-Networks\Convolutional_Neural_Networks\dataset\training_set'

test_directory = r'C:\Users\atjayade\Downloads\P14-Convolutional-Neural-Networks\Convolutional_Neural_Networks\dataset\test_set'

def label_image(img):
    label = img.split('.')[-3]
    if label == 'cat':
        return [1,0]
    if label == 'dog':
        return [0,1]

training=[]

for item1 in os.listdir(train_directory):
    path1 = os.path.join(train_directory, item1)
    for item in tqdm.tqdm(os.listdir(path1)):
        lab = label_image(item)
        img_path = os.path.join(path1, item)
        img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, (50,50))
        training.append([np.array(img), lab])

testing=[]

for item1 in os.listdir(test_directory):
    path1 = os.path.join(test_directory, item1)
    for item in tqdm.tqdm(os.listdir(path1)):
        lab = label_image(item)
        img_path = os.path.join(path1, item)
        img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, (50,50))
        testing.append([np.array(img), lab])

test_x = np.array([i[0] for i in testing]).reshape(-1,50,50,1)
test_y = [i[1] for i in testing]

X = np.array([i[0] for i in training]).reshape(-1,50,50,1)
Y = [i[1] for i in training]

И модель CNN и часть оптимизатора:

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3),padding='SAME', input_shape=X[0].shape))

model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))

model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.4))

model.add(Conv2D(filters=128, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.35))

#model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
#model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(rate=0.3))

model.add(Dense(2))
model.add(Activation('softmax'))

opt = keras.optimizers.SGD(lr=0.0001, decay=0.0)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics['accuracy'])
print(model.summary())

model.fit(X, np.array(Y), validation_data=(test_x, np.array(test_y)), epochs=30, verbose=2)

Приведенная выше модель не дает точность более 50%. Пробовал разные варианты сборок CNN, разные оптимизаторы, но тщетно.

Есть что-то, чего я не вижу?

1 Ответ

0 голосов
/ 25 июня 2019

Наконец-то все заработало.

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

Спасибо всем за попытку помочь мне.

Приветствия.

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