Модель TensorFlow предсказывает только один класс (кошки) в бинарной классификации [закрыто]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Модель TensorFlow предсказывает только один класс (кошки) в бинарной классификации [закрыто]

Сообщение Anonymous »

Я обучил бинарную классификацию CNN, используя Tensorflow/Keras, чтобы различать кошек и собак. Однако при оценке на наборе данных тестового набора данных модель предсказывает только «CAT» для каждого изображения, даже если набор данных содержит оба класса.
Вот мой код: < /p>

Код: Выделить всё

import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout, BatchNormalization
from tensorflow.keras.models import load_model

def normalizer(image, label):
aux = tf.cast(image, dtype=tf.float32)
image_norm = aux/255.0
return image_norm, label

train_data, valid_data = tf.keras.utils.image_dataset_from_directory(
'dataset/training',
validation_split=0.1,
subset="both",
seed=42,
image_size=(150, 150),
batch_size=32
)

test_data = tf.keras.utils.image_dataset_from_directory(
'dataset/test',
image_size=(150, 150),
batch_size=32
)

train = train_data.map(normalizer)
valid = valid_data.map(normalizer)
test = test_data.map(normalizer)

model = Sequential()

model.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu', input_shape=(150,150,3)))
model.add(MaxPooling2D())

model.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D())

model.add(Conv2D(filters=128, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D())

model.add(Conv2D(filters=128, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D())

model.add(Flatten())

model.add(Dense(units=256, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))

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

print(model.summary())

hist = model.fit(
train,
batch_size=32,
epochs=20,
shuffle=True,
validation_data=valid
)

plt.plot(hist.history['loss'], label='train')
plt.plot(hist.history['val_loss'], label='valid')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.title('Loss in Training and Validation')
plt.show()

if 'accuracy' in hist.history:
plt.plot(hist.history['accuracy'], label='train')
plt.plot(hist.history['val_accuracy'], label='valid')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('Accuracy in Training and Validation')
plt.show()

model.save(os.path.join('models', 'test.h5'))

new_model = load_model(os.path.join('models', 'test.h5'))

loss, acc = new_model.evaluate(test, batch_size=32)

print(loss)
print(acc)

y_pred = new_model.predict(test)

y_true = np.concatenate([y.numpy() for x, y in test], axis=0)

matrix = tf.math.confusion_matrix(y_true, y_pred)

plt.figure(figsize=(10, 7))
sns.heatmap(
matrix.numpy(),
annot=True,
fmt='d',
cmap='Blues',
xticklabels=['Cat', 'Dog'],
yticklabels=['Cat', 'Dog'],
)

plt.ylabel('True Label')
plt.xlabel('Predicted Label')
plt.title('Confusion Matrix')
plt.show()
и вот матрица путаницы
Матрица путаницы
Возможные причины я подозреваю

Дисбаланс класса -> мои учебные данные имеют примерно одинаковое количество кошек и собак, поэтому я не думаю, что это причина. < /li>
Проблемы с меткой -> Я проверил и подтвердил, что y_true имеет как 0, так и 1s, поэтому этикетки должны быть в порядке.
p.S.: Модель достигла точности ~ 70% при проверке < /li>
< /ul>

Подробнее здесь: https://stackoverflow.com/questions/794 ... sification
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»