Итак, я новичок в области глубокого изучения, и я начал с набора данных о кошках и собаках для модели CNN с использованием Keras.
В моем коде я не могу получить вероятности в качестве выходных данных для обоихclassifier.predict
или classifier.predict_proba
.Я просто получаю вывод как [[0,1]]
или [[1,0]]
.Я пробовал с несколькими изображениями.
Но я ищу что-то вроде [[0.4,0.6]]
, [[0.89,0.11]]
Я пытался изменить функцию потерь с binary_crossentropy
на categorical_crossentropy
.
Я попытался изменить функцию активации выходного слоя с sigmoid
на softmax
.
Я также попытался изменить class_mode
в flow_from_directory
с binary
to categorical
.
Я думаю, что я могу ошибаться с типом данных, так как тип массива вывода float32.Но даже если это ошибка, я не знаю, как ее изменить.
Я не могу найти, где я иду не так.Пожалуйста, уточните / помогите.Спасибо.
Зачем мне вероятности?
В моем другом проекте я буду разбивать изображение на n частей.Затем я использую классификатор по n штукам отдельно и найду одну фигуру с наибольшей вероятностью.Для этого я не буду использовать набор данных о кошках и собаках.Он предназначен для выбора бина, и этот набор данных также будет двоичным выводом как «ДА» или «НЕТ».Любые предложения по этому вопросу также приветствуются.Спасибо.
Ссылка за код в Github.
#Building the CNN
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
#Initialising the CNN
classifier = Sequential()
#Step 1 - Convolution
classifier.add(Convolution2D(filters=32,kernel_size=[3,3],input_shape=(64,64,3),activation='relu'))
#Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size=(2,2),strides=2))
#Adding another Convolutional Layer for better accuracy
#classifier.add(Convolution2D(filters=32,kernel_size=[3,3],activation='relu'))
#classifier.add(MaxPooling2D(pool_size=(2,2),strides=2))
#Step 3 - Flattening
classifier.add(Flatten())
#Step 4 - Fully Connected Layers
classifier.add(Dense(units= 64, activation='relu'))
classifier.add(Dense(units= 2, activation='softmax'))
#Compiling the CNN
classifier.compile(optimizer='adam',loss = 'categorical_crossentropy', metrics=['accuracy'])
#Part 2 - Fitting the CNN to the images
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('dataset/training_set',
target_size=(64,64),
batch_size=32,
class_mode='categorical')
test_set = test_datagen.flow_from_directory('dataset/test_set',
target_size=(64,64),
batch_size=32,
class_mode='categorical')
classifier.fit_generator(training_set,
steps_per_epoch=250,
epochs=3, #Just for time being I've kept very few epochs.
validation_data=test_set,
validation_steps=62)
#Making new Predictions
import numpy as np
from keras.preprocessing import image
test_image_luna=image.load_img('dataset/single/SkilletLuna.JPG',target_size=(64,64))
test_image2=image.img_to_array(test_image_luna)
test_image2=np.expand_dims(test_image2,axis=0)
luna=classifier.predict_proba(test_image2)
In [11]: luna
...:
Out[11]: array([[0., 1.]], dtype=float32)