Я новичок в 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, разные оптимизаторы, но тщетно.
Есть что-то, чего я не вижу?