Даже после моделирования с разными категориями, получение одинакового результата прогнозирования независимо от категории - PullRequest
0 голосов
/ 20 сентября 2019

Это мой первый вопрос в Stackoverflow.

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

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

Я пытаюсь создать сверточную сеть.После моделирования с данными, не получая результатов, как ожидалось.

Я пытался изменить аргументы.Но не повезло в этом.

Также попытался добавить больше скрытых слоев.Но результаты такие же.

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout

classifier = Sequential()

classifier.add(Conv2D(64, (3, 3), input_shape = (128, 128, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dropout(0.5))

classifier.add(Flatten())

classifier.add(Dense(units = 128, activation = 'relu'))

classifier.add(Dense(units = 102, activation = 'sigmoid'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

from keras.preprocessing.image import ImageDataGenerator


train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('data/train',
                                                 target_size = (128, 128),
                                                 batch_size = 32,
                                                 class_mode = 'categorical')

test_set = test_datagen.flow_from_directory('data/test2',
                                            target_size = (128, 128),
                                            batch_size = 32,
                                            class_mode = 'categorical')


classifier.fit_generator(training_set,
                         steps_per_epoch = 17522,
                         epochs = 3,
                         validation_data = test_set,
                         validation_steps = 1020)

import numpy as np
from keras.preprocessing import image
overall=[]
for i in range (18540, 20549):
    test_image = image.load_img('data/test/' +str(i)+'.jpg', target_size = (128, 128))
    test_image = image.img_to_array(test_image)
    test_image = np.expand_dims(test_image, axis = 0)
    result = classifier.predict(test_image)
    res=np.argmax(result)
    overall.append(i)
    overall.append(res+1)

Фактический результат:

overall[:30]
Out[12]: 
[18540,
 51,
 18541,
 51,
 18542,
 51,
 18543,
 51,
 18544,
 51,
 18545,
 51,
 18546,
 51,
 18547,
 51,
 18548,
 51,
 18549,
 51,
 18550,
 51,
 18551,
 51,
 18552,
 51,
 18553,
 51,
 18554,
 51]

Но результаты должны быть другими.

1 Ответ

0 голосов
/ 20 сентября 2019

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

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

Я внес изменения, потому что вы надеетесь, что это сработает !!!

classifier.add(Conv2D(64, (3, 3), input_shape = (128, 128, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

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

Если вышеприведенное не сработало, вам следует проверить ваши векторы с горячим кодированием.

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