Я бы хотел задать вам вопрос о модели, на которой я несколько дней ломал голову ...
Я пытаюсь написать модель CNN, чтобы предсказать результат между 2 классами (похож на проблему кошки или собаки).
Мой код распознает изображения в папках Train и Validation, а также изображения для прогнозирования в папке Test, однако результаты для всех прогнозируемых изображений практически одинаковы и с очень низкой точностью (0,49) (прикреплено изображение). photo_of_the_results_from_sample_data
Я пытался сменить оптимизатор между adam, SGD, RMSprop
Я пытался изменить потерю на разреженный категориальный
Я попытался изменить метрику на матрицу путаницы (которую она даже не узнала по какой-то причине)
и ничего не получалось ......
Может кто-нибудь помочь мне исправить мой код, пожалуйста?
Большое вам спасибо за продвинутый !!
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D,
MaxPooling2D
from keras.optimizers import adam, SGD, RMSprop
from keras.preprocessing.image import ImageDataGenerator
# 1 - Load data
train_dataset = "\\Pictures_Dogs_DataSet\\Train1/"
validation_dataset="\\Pictures_Dogs_DataSet\\Validation1/"
test_dataset = "\\Pictures_Dogs_DataSet\\Test/"
# 2 - Create network layers
image_width = 200
image_height = 200
model = Sequential()
# add convolutional layer (CNN)
# 32 X 32 pixel matrix
# 3 layars (RGB)
# 3 X 3 sliding matrix
# a pixel value for each colour is between 0-255
model.add(Conv2D(filters=32,kernel_size=(3,3),input_shape=
(image_width,image_height,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
# Add another block for more abstract features
model.add(Conv2D(32,(3,3), input_shape=(image_width,
image_height,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
# Add another block for more abstract features
model.add(Conv2D(64,(3,3), input_shape=(image_width,
image_height,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
# Add another block for more abstract features
model.add(Conv2D(128,(3,3), input_shape=(image_width,
image_height,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
# Let's DropOut some connections to avoid over-fitting.
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(32,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(1,activation='sigmoid'))
# Using the prediction model
sgd = SGD(lr=0.001)
model.compile(optimizer=sgd,loss='binary_crossentropy',
metrics=['accuracy'])
# used to rescale the pixel values from [0, 255] to [0, 1]
interval
datagen =ImageDataGenerator(rescale=1./255)
# automatically retrieve images and their classes for train
and validation sets
train_generator = datagen.flow_from_directory(
train_dataset,
target_size=(image_width, image_height),
batch_size=32,
class_mode='binary')
validation_generator = datagen.flow_from_directory(
validation_dataset,
target_size=(image_width, image_height),
batch_size=32,
class_mode='binary')
# 3 - Train
model.fit_generator(
train_generator,
steps_per_epoch=10,
epochs=1,
#just 1 epoch to practice and make sure it works#
validation_data=validation_generator,
validation_steps=5)
#evaluate the accuracy of the model
model.evaluate_generator(validation_generator,verbose=0)
#save modules
#model.save('model.h5')
# 5 - predict
test_generator =datagen.flow_from_directory(
directory=test_dataset,
target_size=(image_width,image_height),
class_mode=None,
batch_size=32)
print(model.predict_generator(test_generator))