форкнуто от main/is_dnn
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
452 KiB
452 KiB
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/IS_LR3')Mounted at /content/drive
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
from PIL import Image# Пункт 1-2: Импорт библиотек и загрузка данных
from keras.datasets import cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()# Пункт 3: Разбиение данных
print("Размерности данных:")
print(f"X_train: {X_train.shape}")
print(f"y_train: {y_train.shape}")
print(f"X_test: {X_test.shape}")
print(f"y_test: {y_test.shape}")
# Визуализация 25 изображений
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(X_train[i])
plt.xlabel(class_names[y_train[i][0]])
plt.show()Размерности данных:
X_train: (50000, 32, 32, 3)
y_train: (50000, 1)
X_test: (10000, 32, 32, 3)
y_test: (10000, 1)

# Пункт 4: Предобработка данных
num_classes = 10
input_shape = (32, 32, 3)
# Нормализация
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
# One-hot encoding
y_train_categorical = keras.utils.to_categorical(y_train, num_classes)
y_test_categorical = keras.utils.to_categorical(y_test, num_classes)# Пункт 5: Создание и обучение модели
model = Sequential()
model.add(layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=input_shape))
model.add(layers.Conv2D(32, kernel_size=(3, 3), activation="relu"))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Dropout(0.25))
model.add(layers.Conv2D(64, kernel_size=(3, 3), activation="relu"))
model.add(layers.Conv2D(64, kernel_size=(3, 3), activation="relu"))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Dropout(0.25))
model.add(layers.Conv2D(128, kernel_size=(3, 3), activation="relu"))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Dropout(0.25))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(num_classes, activation="softmax"))
model.summary()
# Компиляция и обучение модели с более медленным learning rate
model.compile(loss="categorical_crossentropy",
optimizer=keras.optimizers.Adam(learning_rate=0.0005),
metrics=["accuracy"])
batch_size = 64
epochs = 40
history = model.fit(X_train, y_train_categorical,
batch_size=batch_size,
epochs=epochs,
validation_split=0.1,
verbose=1)
# Визуализация процесса обучения
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Model Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Model Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.tight_layout()
plt.show()Model: "sequential_2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ conv2d_6 (Conv2D) │ (None, 30, 30, 32) │ 896 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ conv2d_7 (Conv2D) │ (None, 28, 28, 32) │ 9,248 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ max_pooling2d_6 (MaxPooling2D) │ (None, 14, 14, 32) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dropout_2 (Dropout) │ (None, 14, 14, 32) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ conv2d_8 (Conv2D) │ (None, 12, 12, 64) │ 18,496 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ conv2d_9 (Conv2D) │ (None, 10, 10, 64) │ 36,928 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ max_pooling2d_7 (MaxPooling2D) │ (None, 5, 5, 64) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dropout_3 (Dropout) │ (None, 5, 5, 64) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ conv2d_10 (Conv2D) │ (None, 3, 3, 128) │ 73,856 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ max_pooling2d_8 (MaxPooling2D) │ (None, 1, 1, 128) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dropout_4 (Dropout) │ (None, 1, 1, 128) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ flatten_2 (Flatten) │ (None, 128) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_4 (Dense) │ (None, 512) │ 66,048 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dropout_5 (Dropout) │ (None, 512) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_5 (Dense) │ (None, 256) │ 131,328 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dropout_6 (Dropout) │ (None, 256) │ 0 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_6 (Dense) │ (None, 10) │ 2,570 │ └─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 339,370 (1.29 MB)
Trainable params: 339,370 (1.29 MB)
Non-trainable params: 0 (0.00 B)
Epoch 1/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 149s 208ms/step - accuracy: 0.1762 - loss: 2.1142 - val_accuracy: 0.3928 - val_loss: 1.6019
Epoch 2/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 145s 206ms/step - accuracy: 0.4127 - loss: 1.5967 - val_accuracy: 0.5390 - val_loss: 1.3111
Epoch 3/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 146s 208ms/step - accuracy: 0.5014 - loss: 1.3773 - val_accuracy: 0.5816 - val_loss: 1.2032
Epoch 4/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 142s 201ms/step - accuracy: 0.5445 - loss: 1.2677 - val_accuracy: 0.6072 - val_loss: 1.1081
Epoch 5/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 145s 205ms/step - accuracy: 0.5787 - loss: 1.1898 - val_accuracy: 0.6330 - val_loss: 1.0561
Epoch 6/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 201s 203ms/step - accuracy: 0.6035 - loss: 1.1226 - val_accuracy: 0.6620 - val_loss: 0.9505
Epoch 7/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 142s 201ms/step - accuracy: 0.6239 - loss: 1.0731 - val_accuracy: 0.6764 - val_loss: 0.9206
Epoch 8/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 148s 210ms/step - accuracy: 0.6409 - loss: 1.0263 - val_accuracy: 0.6708 - val_loss: 0.9404
Epoch 9/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 147s 208ms/step - accuracy: 0.6512 - loss: 1.0080 - val_accuracy: 0.6928 - val_loss: 0.8682
Epoch 10/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 143s 204ms/step - accuracy: 0.6638 - loss: 0.9626 - val_accuracy: 0.7026 - val_loss: 0.8407
Epoch 11/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 145s 206ms/step - accuracy: 0.6757 - loss: 0.9341 - val_accuracy: 0.7042 - val_loss: 0.8375
Epoch 12/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 203s 207ms/step - accuracy: 0.6746 - loss: 0.9284 - val_accuracy: 0.7204 - val_loss: 0.8071
Epoch 13/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 200s 204ms/step - accuracy: 0.6961 - loss: 0.8875 - val_accuracy: 0.7304 - val_loss: 0.7929
Epoch 14/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 141s 200ms/step - accuracy: 0.6995 - loss: 0.8715 - val_accuracy: 0.7234 - val_loss: 0.7872
Epoch 15/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 144s 205ms/step - accuracy: 0.7042 - loss: 0.8605 - val_accuracy: 0.7400 - val_loss: 0.7608
Epoch 16/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 143s 203ms/step - accuracy: 0.7132 - loss: 0.8331 - val_accuracy: 0.7288 - val_loss: 0.7968
Epoch 17/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 142s 201ms/step - accuracy: 0.7111 - loss: 0.8360 - val_accuracy: 0.7378 - val_loss: 0.7533
Epoch 18/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 144s 205ms/step - accuracy: 0.7187 - loss: 0.8171 - val_accuracy: 0.7462 - val_loss: 0.7327
Epoch 19/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 142s 202ms/step - accuracy: 0.7277 - loss: 0.7916 - val_accuracy: 0.7436 - val_loss: 0.7298
Epoch 20/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 203s 204ms/step - accuracy: 0.7306 - loss: 0.7869 - val_accuracy: 0.7496 - val_loss: 0.7295
Epoch 21/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 143s 203ms/step - accuracy: 0.7372 - loss: 0.7568 - val_accuracy: 0.7540 - val_loss: 0.7186
Epoch 22/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 143s 204ms/step - accuracy: 0.7417 - loss: 0.7560 - val_accuracy: 0.7590 - val_loss: 0.7076
Epoch 23/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 141s 200ms/step - accuracy: 0.7418 - loss: 0.7479 - val_accuracy: 0.7496 - val_loss: 0.7318
Epoch 24/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 144s 205ms/step - accuracy: 0.7425 - loss: 0.7457 - val_accuracy: 0.7584 - val_loss: 0.7020
Epoch 25/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 143s 204ms/step - accuracy: 0.7505 - loss: 0.7290 - val_accuracy: 0.7594 - val_loss: 0.7021
Epoch 26/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 144s 204ms/step - accuracy: 0.7459 - loss: 0.7341 - val_accuracy: 0.7638 - val_loss: 0.7111
Epoch 27/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 199s 200ms/step - accuracy: 0.7556 - loss: 0.7181 - val_accuracy: 0.7488 - val_loss: 0.7192
Epoch 28/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 146s 208ms/step - accuracy: 0.7574 - loss: 0.7082 - val_accuracy: 0.7624 - val_loss: 0.6989
Epoch 29/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 201s 206ms/step - accuracy: 0.7596 - loss: 0.7029 - val_accuracy: 0.7624 - val_loss: 0.6960
Epoch 30/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 143s 203ms/step - accuracy: 0.7588 - loss: 0.7058 - val_accuracy: 0.7592 - val_loss: 0.7180
Epoch 31/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 144s 205ms/step - accuracy: 0.7641 - loss: 0.6795 - val_accuracy: 0.7634 - val_loss: 0.6936
Epoch 32/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 202s 205ms/step - accuracy: 0.7614 - loss: 0.6924 - val_accuracy: 0.7604 - val_loss: 0.6869
Epoch 33/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 203s 206ms/step - accuracy: 0.7655 - loss: 0.6846 - val_accuracy: 0.7694 - val_loss: 0.6757
Epoch 34/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 145s 206ms/step - accuracy: 0.7702 - loss: 0.6750 - val_accuracy: 0.7652 - val_loss: 0.6913
Epoch 35/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 142s 202ms/step - accuracy: 0.7653 - loss: 0.6792 - val_accuracy: 0.7716 - val_loss: 0.6686
Epoch 36/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 201s 200ms/step - accuracy: 0.7752 - loss: 0.6564 - val_accuracy: 0.7676 - val_loss: 0.6805
Epoch 37/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 145s 205ms/step - accuracy: 0.7770 - loss: 0.6542 - val_accuracy: 0.7658 - val_loss: 0.6724
Epoch 38/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 143s 204ms/step - accuracy: 0.7730 - loss: 0.6606 - val_accuracy: 0.7692 - val_loss: 0.6799
Epoch 39/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 202s 203ms/step - accuracy: 0.7764 - loss: 0.6525 - val_accuracy: 0.7724 - val_loss: 0.6756
Epoch 40/40
704/704 ━━━━━━━━━━━━━━━━━━━━ 203s 205ms/step - accuracy: 0.7801 - loss: 0.6474 - val_accuracy: 0.7746 - val_loss: 0.6561

# Пункт 6: Оценка качества
test_loss, test_accuracy = model.evaluate(X_test, y_test_categorical, verbose=0)
print(f"Test loss: {test_loss:.4f}")
print(f"Test accuracy: {test_accuracy:.4f}")Test loss: 0.6787
Test accuracy: 0.7736
# Пункт 7: Распознавание двух тестовых изображений
print("РАСПОЗНАВАНИЕ ТЕСТОВЫХ ИЗОБРАЖЕНИЙ:")
# Функция для распознавания одного изображения из тестовой выборки
def predict_single_image(model, X, y, index, class_names):
prediction = model.predict(X[index:index+1])
predicted_class = np.argmax(prediction[0])
true_class = y[index][0]
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.imshow(X[index])
plt.title(f'Истинный класс: {class_names[true_class]}')
plt.axis('off')
plt.subplot(1, 2, 2)
bars = plt.bar(range(10), prediction[0])
# Подсветим предсказанный класс
bars[predicted_class].set_color('red')
plt.xticks(range(10), class_names, rotation=45)
plt.title(f'Предсказанный класс: {class_names[predicted_class]}')
plt.ylabel('Вероятность')
plt.tight_layout()
plt.show()
print(f"Истинный класс: {class_names[true_class]}")
print(f"Предсказанный класс: {class_names[predicted_class]}")
print(f"Уверенность: {np.max(prediction[0]):.4f}")
print(f"Результат: {'Правильно' if predicted_class == true_class else 'Ошибка'}")
print("-" * 50)
return predicted_class == true_class
# Найдем одно правильное и одно неправильное предсказание
print("Поиск правильного и неправильного предсказания...")
all_predictions = model.predict(X_test)
all_predicted_classes = np.argmax(all_predictions, axis=1)
true_classes = y_test.flatten()
correct_indices = []
wrong_indices = []
for i in range(len(true_classes)):
if all_predicted_classes[i] == true_classes[i]:
correct_indices.append(i)
else:
wrong_indices.append(i)
if len(correct_indices) > 0 and len(wrong_indices) > 0:
break
if correct_indices:
print("ПРАВИЛЬНО РАСПОЗНАННОЕ ИЗОБРАЖЕНИЕ:")
predict_single_image(model, X_test, y_test, correct_indices[0], class_names)
if wrong_indices:
print("ОШИБОЧНО РАСПОЗНАННОЕ ИЗОБРАЖЕНИЕ:")
predict_single_image(model, X_test, y_test, wrong_indices[0], class_names)РАСПОЗНАВАНИЕ ТЕСТОВЫХ ИЗОБРАЖЕНИЙ:
Поиск правильного и неправильного предсказания...
313/313 ━━━━━━━━━━━━━━━━━━━━ 8s 24ms/step
ПРАВИЛЬНО РАСПОЗНАННОЕ ИЗОБРАЖЕНИЕ:
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step

Истинный класс: cat
Предсказанный класс: cat
Уверенность: 0.8291
Результат: Правильно
--------------------------------------------------
ОШИБОЧНО РАСПОЗНАННОЕ ИЗОБРАЖЕНИЕ:
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step

Истинный класс: ship
Предсказанный класс: automobile
Уверенность: 0.5633
Результат: Ошибка
--------------------------------------------------
# Пункт 8: Отчет о качестве классификации и матрица ошибок
print("ОТЧЕТ О КАЧЕСТВЕ КЛАССИФИКАЦИИ:")
true_labels = np.argmax(y_test_categorical, axis=1)
predicted_labels = np.argmax(model.predict(X_test), axis=1)
print(classification_report(true_labels, predicted_labels, target_names=class_names))
print("МАТРИЦА ОШИБОК:")
conf_matrix = confusion_matrix(true_labels, predicted_labels)
display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=class_names)
display.plot(cmap=plt.cm.Blues, xticks_rotation=45)
plt.title('Матрица ошибок - CIFAR-10')
plt.tight_layout()
plt.show()ОТЧЕТ О КАЧЕСТВЕ КЛАССИФИКАЦИИ:
313/313 ━━━━━━━━━━━━━━━━━━━━ 22s 69ms/step
precision recall f1-score support
airplane 0.79 0.81 0.80 1000
automobile 0.89 0.89 0.89 1000
bird 0.74 0.60 0.66 1000
cat 0.60 0.59 0.60 1000
deer 0.73 0.78 0.76 1000
dog 0.67 0.71 0.69 1000
frog 0.79 0.86 0.82 1000
horse 0.81 0.79 0.80 1000
ship 0.84 0.85 0.85 1000
truck 0.86 0.85 0.86 1000
accuracy 0.77 10000
macro avg 0.77 0.77 0.77 10000
weighted avg 0.77 0.77 0.77 10000
МАТРИЦА ОШИБОК:
