Я новичок в ИИ и глубоком обучении, и я обучил бинарную классификацию 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>
Я новичок в ИИ и глубоком обучении, и я обучил бинарную классификацию CNN, используя Tensorflow/Keras, чтобы различать кошек и собак. Однако при оценке на наборе данных тестового набора данных модель предсказывает только «CAT» для каждого изображения, даже если набор данных содержит оба класса. Вот мой код: < /p> [code]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
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()
plt.ylabel('True Label') plt.xlabel('Predicted Label') plt.title('Confusion Matrix') plt.show() [/code] и вот матрица путаницы Матрица путаницы Возможные причины я подозреваю
Дисбаланс класса -> мои учебные данные имеют примерно одинаковое количество кошек и собак, поэтому я не думаю, что это причина. < /li> Проблемы с меткой -> Я проверил и подтвердил, что y_true имеет как 0, так и 1s, поэтому этикетки должны быть в порядке. p.S.: Модель достигла точности ~ 70% при проверке < /li> < /ul>
Я обучил бинарную классификацию CNN, используя Tensorflow/Keras, чтобы различать кошек и собак. Однако при оценке на наборе данных тестового набора данных модель предсказывает только «CAT» для каждого изображения, даже если набор данных содержит оба...
Я хочу, чтобы моя модель определяла угол (в 360 классах) с использованием самостоятельно созданных изображений текста.
Чтобы получить больше информации для обучения, изображения обучающего набора генерируются заново каждую эпоху с новым случайным...
Я проверил около 20 изображений. Те же для Python и те же для tensorflow.js с очень похожей предварительной обработкой. Он продолжает давать мне 0-й класс.
Вот мой код обучения Python:
import tensorflow as tf
from tensorflow.keras import layers
from...
Я обучил модель машинного обучения с помощью TensorFlow/Keras для классификации арабских символов, и она достигает точности около 91 % в наборе тестовых данных. Однако когда я подключаю эту модель к своему приложению с графическим интерфейсом...
Я обучил модель машинного обучения с помощью TensorFlow/Keras для классификации арабских символов, и она достигает точности около 91 % в наборе тестовых данных. Однако когда я подключаю эту модель к своему приложению с графическим интерфейсом...