Как получить вероятности на класс в тензорном потоке? Классификатор изображений - PullRequest
0 голосов
/ 25 марта 2020

Итак, у меня следующий код

#Get the paths of the directories which contain train and test data
train_dir = os.path.join('/ImageClassifier/cats_and_dogs_filtered', 'train')
validation_dir = os.path.join('/ImageClassifier/cats_and_dogs_filtered', 'validation')


train_cats_dir = os.path.join(train_dir, 'cats')  # directory with our training cat pictures
train_dogs_dir = os.path.join(train_dir, 'dogs')  # directory with our training dog pictures
validation_cats_dir = os.path.join(validation_dir, 'cats')  # directory with our validation cat pictures
validation_dogs_dir = os.path.join(validation_dir, 'dogs')  # directory with our validation dog pictures


num_cats_tr = len(os.listdir(train_cats_dir))
num_dogs_tr = len(os.listdir(train_dogs_dir))

num_cats_val = len(os.listdir(validation_cats_dir))
num_dogs_val = len(os.listdir(validation_dogs_dir))

total_train = num_cats_tr + num_dogs_tr
total_val = num_cats_val + num_dogs_val


batch_size = 128
epochs = 15
IMG_HEIGHT = 150
IMG_WIDTH = 150


train_image_generator = ImageDataGenerator(rescale=1./255) # Generator for our training data
validation_image_generator = ImageDataGenerator(rescale=1./255) # Generator for our validation data


train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_dir,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='binary')

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=validation_dir,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='binary')


model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(1)
])


model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])


history = model.fit_generator(
    train_data_gen,
    steps_per_epoch=total_train // batch_size,
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=total_val // batch_size
)

Теперь я выбрал произвольное изображение и попытался его классифицировать (и ожидал, что модель будет возвращать вероятности изображения, принадлежащего каждому классу), поэтому я сделал это

PATH = 'ToPredictIMG/dogs/1200px-Dog_for_Senior_Dog_Food_Diet_Wikipedia_Page.jpg'
img = image.load_img(PATH,
    target_size=(150, 150))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
images = np.vstack([x])
model.predict_proba(images, batch_size=1)


Out[122]:
array([[695.1686]], dtype=float32)

Хотя я ожидал двухмерный подмассив, который содержал вероятности изображения, принадлежащего к классу собак и классу кошек.

В чем проблема?


Я также попробовал это (4 изображения в данном случае)

predictIMG = ImageDataGenerator(rescale=1./255)
PATH = '/ImageClassifier/ToPredictIMG'
predictIMG_gen = predictIMG.flow_from_directory(directory=PATH,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='binary')

А затем

model.predict_proba(predictIMG_gen,batch_size=None)

Output: array([[ 1.6341457],
       [ 2.7946496],
       [-6.4226017],
       [ 5.3173203]], dtype=float32)

, а также это

model.predict(predictIMG_gen,batch_size=None)

Output: array([[ 5.3173203],
           [ 1.6341457],
           [-6.4226017],
           [ 2.7946496]], dtype=float32)

Итак, еще раз, что это проблема?

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